当前位置:首页 > 文章列表 > 数据库 > MySQL > 【器篇】【Flyway】 Flyway 概述

【器篇】【Flyway】 Flyway 概述

来源:SegmentFault 2023-02-23 10:31:26 0浏览 收藏

怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《【器篇】【Flyway】 Flyway 概述》,涉及到MySQL、flyway,有需要的可以收藏一下

一.引言来

在软件项目开发工程中,一般来说项目都是几个开发人员齐头并进的,常常遇到的事情是,大家都同时提交数据库表修改语句后,并不告知其它人,或者几个开发人员同时修改一个表结构,导致其他人运行项目出错。

还有在项目上线运行过程中,常常会因为管理数据库表结构或者表数据版本而发愁,甚至有的时候还不得不为生产数据做迁移操作。

以上的问题,我们一般的操作都是约定+脚本,但效率不高,并且常常会因为版本冲突,不得不手动

merge
。这个时候一个敏捷工具,用于数据库的移植的
Flyway
应用而生,它的主要用于在你的应用版本不断升级的同时,升级你的数据库结构和里面的数据。

二、介绍来

1. Flyway 的特色

Flyway 大受欢迎是由于它具备如下优势:

  • 简单 很是容易安装和学习,同时迁移的方式也很容易被开发者接受。
  • 专注 专一于用作数据库迁移、版本控制而并无其它反作用。
  • 强大 专为连续交付而设计,让Flyway在应用程序启动时迁移数据库。

2. Flyway 的工作机制

Flyway 须要在

DB
中先建立一个
metadata
表 (缺省表名为
flyway_schema_history
), 在该表中保存着每次
migration
(迁移)的记录, 记录包含
migration
脚本的版本号和 SQL 脚本的
checksum
值。下图表示了多个数据库版本。

img

对应的

metadata
表记录:spring
installed_rankversiondescriptiontypescriptchecksuminstalled_byinstalled_onexecution_timesuccess
11Initial SetupSQLV1__Initial_Setup.sql1996767037axel2016-02-04 22:23:00.0546true
22First ChangesSQLV2__First_Changes.sql1279644856axel2016-02-06 09:18:00.0127true

Flyway 扫描文件系统或应用程序的类路径读取 DDLDML 以进行迁移。根据

metadata
表进行检查迁移。**若是脚本声明的版本号小于或等于标记为当前版本的版本号之一,将忽略它们。其他迁移是待处理迁移:可用,但未应用。最后按版本号对它们进行排序并按顺序执行 并将执行结果写入 metadata 表。

img

对应的

metadata
表记录:数据库
installed_rankversiondescriptiontypescriptchecksuminstalled_byinstalled_onexecution_timesuccess
11Initial SetupSQLV1__Initial_Setup.sql1996767037axel2016-02-04 22:23:00.0546true
22First ChangesSQLV2__First_Changes.sql1279644856axel2016-02-06 09:18:00.0127true
32.1RefactoringJDBCV2_1__Refactoringaxel2016-02-1017:45:05.4251true

Flyway 支持命令行(须要下载命令行工具)和 Java Api ,也支持构建工具 MavenGradle 。这里咱们将目光放在 Java Api 上。

3. Flyway 的规则

Flyway 是如何比较两个 SQL 文件的前后顺序呢?它采用 采用左对齐原则, 缺位用 0 代替

1.0.1.1 比 1.0.1 版本高

1.0.10 比 1.0.9.4 版本高

1.0.10 和 1.0.010 版本号同样高, 每一个版本号部分的前导 0 会被忽略

FlywaySQL 文件分为 VersionedRepeatableUndo 三种:

  • Versioned 用于版本升级, 每一个版本有惟一的版本号并只能执行一次。
  • Repeatable 可重复执行, 当 Flyway检测到 Repeatable 类型的 SQL 脚本的
    checksum
    有变更, Flyway 就会从新应用该脚本. 它并不用于版本更新, 这类的
    migration
    老是在 Versioned 执行以后才被执行。
  • Undo 用于撤销具备相同版本的版本化迁移带来的影响。可是该回滚过于粗暴,过于机械化,通常不推荐使用。通常建议使用 Versioned 模式来解决。

这三种的命名规则以下图:

naming.png
  • Prefix 可配置,前缀标识,默认值
    V
    表示 Versioned,
    R
    表示 Repeatable,
    U
    表示 Undo
  • Version 标识版本号, 由一个或多个数字构成, 数字之间的分隔符可用点
    .
    或下划线
    _
  • Separator 可配置, 用于分隔版本标识与描述信息, 默认为两个下划线
    __
  • Description 描述信息, 文字之间能够用下划线
    _
    或空格 ``分隔
  • Suffix 可配置, 后续标识, 默认为
    .sql

4.flyway命令行

flyway 提供命令行工具, 常用的命令包括:

  • Clean: 删除所有创建的数据库对象, 包括用户、表、视图等. 注意不要在生产库上执行 clean 操作.
  • Migrate: 对数据库依次应用版本更改.
  • Info: 获取目前数据库的状态. 那些迁移已经完成, 那些迁移待完成. 所有迁移的执行时间以及结果.
  • Validate: 验证已 Apply 的脚本是否有变更, Flyway 的 Migration 默认先做 Validate.
  • Baseline: 根据现有的数据库结构生成一个基准迁移脚本.
  • Repair: 修复命令尽量不要使用, 修复场景有: 1. 移除失败的 migration 记录. 2.已经应用的 SQL 脚本被修改, 我们想重新应用该 SQL 脚本.

maven 插件

           org.flywaydbflyway-maven-plugin${flyway.user}${flyway.password}}${flyway.url}

5.flyway 最佳实践

1.SQL 的文件名

开发环境和生产环境的 migration SQL 不共用. 开发过程往往是多人协作开发, DB migration 也相对比较频繁, 所以 SQL 脚本会很多. 而生产环境 DB migration 往往由 DBA 完成, 每次升级通常需要提交一个 SQL 脚本.

DDL DML 分开

  • 开发环境 SQL 文件建议采用时间戳作为版本号, 多人一起开发不会导致版本号争用, 同时再加上生产环境的版本号, 这样的话, 将来手工 merge 成生产环境 V1.2d migration 脚本也比较方便, SQL 文件示例:

    • V20180317.14.59__V1.2_Add_SomeTables.sql
    • V20180317.14.59__V1.0.1_ProjectName_{Feature|fix}_Developer_Description.sql
  • 生产环境 SQL 文件, 应该是手动 merge 开发环境的 SQL 脚本, 版本号按照正常的版本, 比如 V2.1.5_001__Unique_User_Names.sql
2. migration 后的SQL 脚本不应该再被修改.
3. spring.flyway.outOfOrder 取值 true /false

对于开发环境, 可能是多人协作开发, 很可能先 apply 了自己本地的最新 SQL 代码, 然后发现其他同事早先时候提交的 SQL 代码还没有 apply, 所以 开发环境应该设置 spring.flyway.outOfOrder=true, 这样 flyway 将能加载漏掉的老版本 SQL 文件; 而生产环境应该设置 spring.flyway.outOfOrder=false

4. 多个系统公用要 DB schema

很多时候多个系统公用一个 DB schema , 这时候使用 spring.flyway.table 为不同的系统设置不同的 metadata 表, 缺省为 flyway_schema_history

5.尽量配置.sql到filesystem,而不是项目工程下,原因是方便替换,并不占用jar包大小
6.不推荐使用Undo,太过粗暴

7.实际工程配置和目录

  # flyway 配置内容,对应 FlywayAutoConfiguration.FlywayConfiguration 配置项
  flyway:
    enabled: true # 开启 Flyway 功能
    cleanDisabled: true # 禁用 Flyway 所有的 drop 相关的逻辑,避免出现跑路的情况。
    locations: # 迁移脚本目录
      - classpath:db/migration/dev # 配置 SQL-based 的 SQL 脚本在该目录下
    check-location: false # 是否校验迁移脚本目录下。如果配置为 true ,代表需要校验。此时,如果目录下没有迁移脚本,会抛出 IllegalStateException 异常
    url: jdbc:mysql://192.168.8.94:3399/flyway-test?useSSL=false&useUnicode=true&characterEncoding=UTF-8 # 数据库地址
    user: root # 数据库账号
    password: 1234123 #数据库密码
    baseline-version: 1.0
    baseline-description: "baseline"
    encoding: UTF-8
    out-of-order: true # 是否容许不按顺序迁移 开发建议 true  生产建议 false
    # 如果指定 schema 包含了其他表,但没有 flyway schema history 表的话, 在执行 flyway migrate 命令之前, 必须先执行 flyway baseline 命令.
    # 设置 spring.flyway.baseline-on-migrate 为 true 后, flyway 将在需要 baseline 的时候, 自动执行一次 baseline.
    baselineOnMigrate: true
    table: flyway_schema_history

项目工程目录

三、扩展来

除开

Flyway
,还有其它的数据库迁移和版本控制工具,例如强大的
Liquibase
。两者具体的差异,在后续的文章阐述。在以往的经验中,小项目,整体变动不大的用
Flyway
,而大应用和企业应用用
Liquibase
更合适。

本篇关于《【器篇】【Flyway】 Flyway 概述》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于数据库的相关知识,请关注golang学习网公众号!

版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
U产品快报 | UK8S支持K8S 1.18版本、URTC新版Webdemo上线等重要更新U产品快报 | UK8S支持K8S 1.18版本、URTC新版Webdemo上线等重要更新
上一篇
U产品快报 | UK8S支持K8S 1.18版本、URTC新版Webdemo上线等重要更新
【MySQL】如何最大程度防止人为误操作MySQL数据库?这次我懂了!!
下一篇
【MySQL】如何最大程度防止人为误操作MySQL数据库?这次我懂了!!
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    16次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    25次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    30次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    42次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    35次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码