是什么
数据库版本管理工具
为什么
- 自己写的SQL忘了在所有环境执行
- 别人写的SQL我们不能确定是否都在所有环境执行了
- 有人修改了已经执行过的SQL,期望再次执行
- 需要新增环境做数据迁移
- 每次发版需要手动控制先发DB版本,再发布应用版本
怎么做
集成依赖
1 | <dependency> |
在项目resources中添加目录
1 | cd 你的目录/resources |
在项目配置中添加flyway配置
1 | spring: |
扩展学习
脚本命名规范
1 | $PREFIX$VERSION__$REMARK.$SUBFIX |
- $preifx表示前缀,可在配置中指定,默认为 V
- $version 表示版本,中单可以使用 . 或 _分隔,在解析时会将_转换为.保存到fly_schema_history表的version字段中;
- $remark 表示备注,解析后会将这部分写入到description字段中;
- $subfix 表示后缀,可在配置中指定,默认为.sql;
- 版本与描述之前使用__分隔(双下划线)否则识别不出来,不执行
- V开头的脚本文件直接升序命名版本即可
- R开头的脚本文件表示可重复执行的文件
示例:
1 | V1.1.__description.sql |
prefix:可配置,前缀标识,默认值 V 表示 Versioned,R 表示 Repeatable;
Version:标识版本号,由一个或多个数字构成,数字之间的分隔符可用点.或单下划线_;
separator:分隔符,默认是双下划线;
description:描述信息,文字之间可以用单下划线或空格分隔
suffix:可配置,后续标识,后续标识,默认为 .sql;
Versioned migration 用于版本升级,每个版本都有唯一的版本号并只能 apply 依次。(也就是V开头的)
Repeatable migration 是指可重复加载的 migration,可以重复修改内容使用一旦脚本的 checkksum 有变动,flyway 就会重新应用该脚本,它并不用于版本更新,这类的 migration 总是在 versioned migration 执行之后才被执行(R开头的)
spring配置详解
1 | flyway: |
坑
坑一:命名SQL文件问题
没有按标准命名,导致执行不成功
坑二:执行失败的文件,再次启动时执行不了,可以删除数据库中
flyway_schema_history
表最后一条数据,然后再重启坑三:云家园装配后不生效,但maven可以生效,目前还在解决中。
竞品对比
nextep(开源)
http://www.nextep-softwares.com/
dbdeploy(开源)
http://dbdeploy.com/
Liquibase(开源)
http://www.liquibase.org/
Post Facto(开源)
http://www.post-facto.org/
下面是red gate公司的商业软件
SQL Source Control (商业软件)
http://www.red-gate.com/products/SQL_Source_Control/index.htm
参考文档
- flyway官网
- springBoot2.3.2.RELEASE手册
- https://www.jianshu.com/p/567a8a161641
- https://blog.csdn.net/chenleiking/article/details/80691750
- https://segmentfault.com/a/1190000038960756
- https://juejin.cn/post/6844903802215071758
- https://blog.csdn.net/qq_33430083/article/details/105508025
- https://blog.51cto.com/u_15076233/4273411
- https://www.saoniuhuo.com/article/detail-30226.html
- 这个用的比较新的flyway
- 知乎的这篇原理介绍还可以
- 知乎的这篇讨论也有点意思,尤其是其中的其他链接
- 这是要删库跑路的节奏啊
- 这篇讲的实战中k8s结合flyway很高大上
- 这篇中idea新建项目及sql文件命名讲的不错
- 这就是我遇到的一个坑,自己创建映射目录时没注意
- 这篇值得深入研究比较数据版本控制工具-2020
- 几个数据库的版本控制工具
- 数据库版本控制工具介绍