Flyway 数据库版本管理工具操作指南

FlyWay

1、什么是 Flyway ?

  Flyway 是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations 可以写成 SQL 脚本,也可以写在 Java 代码中,不仅支持 Command Line 和 Java API,还支持 Build 构建工具和 Spring Boot 等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。
  简单来说,Flyway 可以管理每一次操作的 DDL 语句及某些 DML 语句,来记录当前数据库的最新结构状态。因此来作为一个数据库版本管理的工具。
更多请参照: Flyway官网

2、为什么要用Flyway

  结合当前的线上、测试环境等数据库结构,以及当前的需求迭代速度。需要一个整理数据库版本的工具来统一认知与进度。不至于 A 改了数据库但是 B 不知道,导致 B 做需求提交的时候不知道数据库的变更,将时间与效率浪费在了不必要的地方。同时也是对数据库迁移历史信息有一定的认知,知道哪些需求迁移了数据库结构。
同时用 Flyway 可以保存最新的数据库结构,同时利用一定条件的 DML 语句可以方便我们随时能够模拟一个相同环境的测试数据库环境。

3、Flyway的工作原理及规则

简单的介绍一下 Flyway 工作原理
  例如你用 Flyway 指向了一个空数据库,Flyway 将会创建一个 flyway_schema_history 为默认名的表,了、以此来跟踪数据库的状态。
在这里插入图片描述

  根据版本号对迁移进行排序并按顺序应用,紧接着 Flyway 将会开始扫描文件系统或应用程序的类路径以进行迁移。文件可以用 Sql 或 Java 编写。然后根据版本号逐步对数据库进行迁移。
在这里插入图片描述

  随着每次迁移的应用,架构历史记录表会相应地更新。Flyway 总是会根据版本号排序并且按顺序执行,Flyway 不会执行比当前版本小的语句。所以每次需要演化数据库时,无论是结构 (DDL) 还是参考数据 (DML),只需创建一个版本号高于当前版本号的新迁移信息。下次执行时,Flyway 会找到它并相应地升级数据库。
  同时 Flyway 是不支持降级处理的,哪怕你之前用了一个建表的脚本,后来觉得脚本没用了,也不能进行删除,要删除表的话也只能通过新的sql脚本才能删除。Flyway的版本只能是往上走的,并且历史迁移记录不能动。

4、Flyway的部署及实践

  • 实践一:本地命令行操作
    通过官方下载( https://flywaydb.org/download)命令行压缩包并解压到对应路径
    在当前项目结构比较稳定时,导出数据库当前结构。
    在本地flyway安装目录中找到conf/flyway.conf配置文件,进行数据库内容配置,在flyway/sql中 配置数据库初始化语句,之后配置flyway环境变量后,使用flyway migrate命令初始化数据库。

  • 实践二:Docker 容器部署操作
    通过 docker 拉取 Flyway 官方镜像,完成后。
    假如是在本机操作的话,我们可以使用挂载目录的方式,使用-v将本地目录挂载到容器内部配置进行执行,例如:

docker run -d 
-v /Users/mayang/Downloads/flyway-8.0.0-beta1/sql:/flyway/sql 
-v /Users/mayang/Downloads/flyway-8.0.0-beta1/conf:/flyway/conf 
-v /Users/mayang/Downloads/flyway-8.0.0-beta1/jars:/flyway/jars 
flyway/flyway info

-v 为本地挂载路径

   挂载后会根据本地目录进行执行,所以只需要共享配置文件,对于之后的修改都放在公共配置文件中,那么就可以统一操作flyway了。解决了本地命令行只能一个人操作的麻烦。
Docker文档:https://github.com/flyway/flyway-docker

当然也有代码执行的方式,但是将DSL与DML语句写在项目中可能并不优雅。

5、Flyway主要操作介绍

  • Migrate
    迁移操作,对于每次数据库进行版本迁移的操作。将sql脚本中的内容进行执行记录。
  • Clean
    删除配置架构中的所有结构及数据。(应该在配置中禁止该操作。)
  • Info
    打印数据库已有的迁移信息以及状态
  • Validate
    根据可用的迁移验证已有的迁移。
  • Undo
    回滚操作,但是对于直接使用Undo比较机械,建议是选择回滚版本TargetVersion进行操作。(社区版不可用,需要pro版)
  • Baseline
    初始化 schema_version 表,并插入一条原始 version = 1 。
    相对于 Migrate 来说,它不再是从最初开始迁移,而是先将某数据库作为基准线,然后迁移相对此数据库还未更新的 migrations。比如对于某个已存在结构的数据库刚开始使用 flyway
  • Repair
    删除失败的迁移条目(仅适用于不支持 DDL 事务的数据库)
    将应用迁移的校验和、描述和类型与可用迁移的校验和、描述和类型重新对齐
    将所有丢失的迁移标记为已删除

6、线上服务迁移方案

1. 线上项目 Flyway 操作方案
    使用baseline操作将当前版本作为数据库初始化版本。
    同时将1.0.0版本内放入当前数据库初始化结构的sql语句
2. 线上数据库后续迁移

Flyway 中定义的迁移便是每一次数据库结构的变化。
根据当前情况采用方案二,项目的结构变化通过提交需要更改结构的 DDL 需求语句,提 DBA 进行review,等待迁移脚本审核过后,管理版本后并且使用 Flyway 容器执行迁移命令。(根据实际情况调整)

3. 数据库 Flyway 回滚方案
  • 利用官方操作 Undo() 进行回滚操作
  • 先使用 clean 操作后删除对应文件后再用 migrate 操作(数据会清空,禁用生产环境),在测试环境有固定的 DML 添加测试数据操作的话可以使用。
  • 在每次执行迁移操作之前,准备好一份备份操作sql脚本,等待需要回滚操作的时候,使用flyway migrate来执行新版本回滚操作。

7、项目迁移规则

1. 版本值规则
  • 1.0.1.1 比 1.0.1 版本高。
  • 1.0.10 比 1.0.9.4 版本高。
  • 1.0.10 和 1.0.010 版本号一样高, 每个版本号部分的前导 0 会被忽略。
2. Flyway文件规则
  • Versioned 用于版本升级, 每个版本有唯一的版本号并只能执行一次.
  • Repeatable 可重复执行, 当 Flyway检测到 Repeatable 类型的 SQL 脚本的 checksum 有变动, Flyway 就会重新应用该脚本. 它并不用于版本更新, 这类的 migration 总是在 Versioned 执行之后才被执行。
  • Undo 用于撤销具有相同版本的版本化迁移带来的影响。但是该回滚过于粗暴,过于机械化,一般不推荐使用。一般建议使用 Versioned 模式来解决。
3. 文件命名规则
  • Prefix 可配置,前缀标识,默认值 V 表示 Versioned, R 表示 Repeatable, U 表示 Undo
  • Version 标识版本号, 由一个或多个数字构成, 数字之间的分隔符可用点 . 或下划线 _
  • Separator 可配置, 用于分隔版本标识与描述信息, 默认为两个下划线 __
  • Description 描述信息, 文字之间可以用下划线 _ 或空格 分隔
  • Suffix 可配置, 后续标识, 默认为 .sql
    例如:
    V1.0.1__port-service_register_developer_createUser.sql (代表Versioned类型,版本为1,描述为CreateUserTable)
    命名尽量采用格式
    V1.0.1__ProjectName_{Feature|fix}_Developer_Description.sql
8、参考文档

Flyway简介:https://blog.csdn.net/chenleiking/article/details/80691750

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flyway是一个用于数据库版本控制的工具,类似于我们使用Git来管理代码版本。它可以帮助我们管理数据库版本,通过执行SQL脚本来进行数据库的迁移操作。\[1\] Flyway会将每次执行过的SQL脚本的版本号和生成的checksum保存在数据库flyway_schema_history表中。在下次执行数据库迁移时,Flyway会按照版本号从低到高的顺序执行SQL脚本。如果之前的版本号脚本已经执行过,则不会再次执行。如果之前版本的SQL脚本在执行过程中被修改,则会报错。\[2\] Flyway的工作流程可以参考Flyway官网的详细描述和介绍。\[2\] Flyway的作用是解决在产品发布过程中数据库版本与代码版本不匹配的问题。通过使用Flyway,我们可以对不同环境的SQL进行迁移操作,确保数据库与代码的版本一致性。\[3\] #### 引用[.reference_title] - *1* [Flyway数据库版本控制](https://blog.csdn.net/qq_22596931/article/details/115537039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Flyway 数据库版本控制](https://blog.csdn.net/qq_37196321/article/details/125379470)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值