小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
最近项目里面有人推荐用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: true
locations: classpath:db/migration
check-location: true
enabled: true
启动工程
我们可以看到会初始化一张历史表, flyway_schema_history
创建V1.1.sql, 重启应用就会多一个修改版本记录, 数据库中表字段自动增加。
Alter table smp_down_link_record add column `create_by` int(10) NOT NULL comment '创建人';
FAQ
- SpringBoot 集成之后报错,报错信息
java.sql.SQLSyntaxErrorException: SELECT command denied to user 'test'@'127.0.0.1' for table 'user_variables_by_thread'\
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
解决的办法降低版本
- FlyWay 接入的过程中其实也遇到一些,问题FlayWay其实需要的权限比较大,还有一些潜在的坑,下来也列了一下需要避免的一些坑。个人任务接入最好的方式是中间件团队将配置封装一些, 否则导致数据库被删除了,反而得不偿失。 一般只建议在开发环境做同步,测试和生产环境还是按照升级脚本执行,比较完全。
参考文档
官网 GitHUB: github.com/flyway