前言
最近项目里面有人推荐用Flayway做数据库版本管理,在平时项目开发中维护好脚本自动执行,无需人为执行数据库同步操作。在我们平时开发过程中开发环境配置同步还行,但是生产和测试环境还是不推荐使用, 生产账号权限管理,系统的数据库账号一般只有DML的权限,没有DDL操作的权限。
FlayWay 基本工作原理
FlayWay 通过历史记录表(flyway_schema_history)来记录版本历史。每次随项目启动时将会自动扫描在resources/db/migration下的文件并查询flyway_schema_history判断是否为新增文件。如果是新增的文件,则执行该迁移文件。如果不是,则忽略。
主要是这两步:
当flyway在一个空数据库执行时,它将直接创建一张默认名为 flyway_schema_history的数据记录为空的历史记录表,这张表将被用来跟踪或记录数据库的状态。
flyway将会开始扫描文档系统或项目classpath路径下的迁移文件。
SpringBoot 集成Flyway
引入FlyWay依赖
<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>5.2.1</version></dependency>
FlyWay 配置
flyway:baseline-on-migrate:truelocations:classpath:db/migrationcheck-location:trueenabled:true
启动工程
我们可以看到会初始化一张历史表, flyway_schema_history
创建V1.1.sql, 重启应用就会多一个修改版本记录, 数据库中表字段自动增加。
Altertablesmp_down_link_recordaddcolumn`create_by`int(10)NOTNULLcomment'创建人';
FAQ
SpringBoot 集成之后报错,报错信息
java.sql.SQLSyntaxErrorException:SELECTcommanddeniedtouser'test'@'127.0.0.1'fortable'user_variables_by_thread'\atcom.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
解决的办法降低版本
FlyWay 接入的过程中其实也遇到一些,问题FlayWay其实需要的权限比较大,还有一些潜在的坑,下来也列了一下需要避免的一些坑。个人任务接入最好的方式是中间件团队将配置封装一些, 否则导致数据库被删除了,反而得不偿失。 一般只建议在开发环境做同步,测试和生产环境还是按照升级脚本执行,比较完全。
参考文档
官网 GitHUB: https://github.com/flyway