Java中Flyway的使⽤详解
Flyway的使⽤
环境:SpringBoot 2.0.4.RELEASE
为什么要⽤Flyway?
开发⼈员在合作的时候经常遇到以下场景:
1.开发⼈员A在⾃⼰的本地数据库做了⼀些表结构的改动,并根据这些改动调整了DAO层的代码,然后将代码上传到svn或git等版本控制服务器上。此时如果开发⼈员B拉取了A的代码改动,在运⾏项⽬的时候很可能会报错,因为B的本地SQL数据库并没有修改。
2.在项⽬上线的时候,当服务器拉取的版本控制服务器的最新修改后,必须同时运⾏SQL数据库的修改脚本,如果忘了跑数据库脚本,那么会出现严重的问题。
传统的解决⽅案就是在⼀个固定的⽂件夹中,将需要跑的SQL脚本放在⾥⾯。开发⼈员在合作的时候,A修改了数据库,在B遇到问题的时候,可能需要交流沟通⼀下,去跑需要的脚本。在项⽬上线的过程中,也是运维⼈员在规定的⽂件夹中,到需要跑的SQL脚本。运⾏它们。
Flyway等migration⼯具就是要把开发⼈员和运维⼈员从以上这些场景的繁琐⼯作中解放出来,如果使⽤maven的话,那么在项⽬编译(SpringBoot运⾏Application)的时候,SQL数据库的改动就⾃动进⼊数据库,只要启动成功,开发或者运维⼈员对SQL数据库的migrate过程是⽆感知的,项⽬依然可以照常运⾏。
Flyway是什么?
Flyway是⼀个简单开源数据库版本控制器(约定⼤于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它⽀持SQL(PL/SQL、T-SQL)⽅式和Java⽅式,⽀持命令⾏客户端等,还提供⼀系列的插件⽀持(Maven、Gradle、SBT、ANT等)。
Flyway最核⼼的就是⽤于记录所有版本演化和状态的MetaData表,Flyway⾸次启动会创建默认名为SCHEMA_VERSION的元素局表。表中保存了版本,描述,要执⾏的sql脚本等;
sql脚本的格式:V + 版本号 + 双下划线(__) + 描述 + 结束符(.sql)
例如:V1__INIT_DATABASE.sql
命令解释:
Migrate
Migrate 是指把数据 Schema 迁移到最新版本,在 Migrate 时会检查 MetaData 元数据表,如果不存在就创建 MetaData 表,MetaData ⽤于记录数据库历史变更等信息;
Migrate会扫描指定⽂件系统或者 classpath 下的 Migrations。会与 MetaData 中的记录进⾏对⽐,进⾏版本升级;
clean
清除掉对应数据库 Schema 中所有的对象,包括表结构,视图,存储过程等,clean 操作在 dev 和 test 阶段很好⽤;
info
⽤于打印所有的 Migrations 的详细和状态信息,也是通过 MetaData 和 Migrations 完成的,可以快速定位当前的数据库版本;
validate
验证以及apply的Migrations是否有变更,默认开启的;原理是对⽐MetaData表与本地Migrations的checkNum值,如果值相同则验证通过,否则失败
baseline
对已经存在数据库Schema结构的数据库⼀种解决⽅案。实现在⾮空数据库新建MetaData表,并把Migrations应⽤到该数据库;也可以应⽤到已有表结构的数据库中也可以实现添加Metadata表
repair
repair操作能够修复metaData表,该操作在metadata出现错误时很有⽤
⽤途:
1):移除失败的Migration记录,只针对不⽀持DDL事务的数据库
SpringBoot中使⽤Flyway管理数据库版本
⼀、添加maven依赖及插件
<!-- mvnrepository/artifact/org.flywaydb/flyway-core -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.0.7</version>
</dependency>
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
</plugin>
添加插件的⽬的是为了使⽤上⾯讲到的⼀些命令:如下图:
⼆、开启Flyway⽀持、配置Flyway
>>>>##FlyWay>>>>###
# 在没有元数据表的情况下,针对⾮空Schema执⾏迁移时是否⾃动调⽤基线。(默认值:false)
spring.flyway.baseline-on-migrate=true
# 下⾯⼏个配置不写也⾏,都是默认配置,这⾥写了是⽅便以后改
# 执⾏基线时⽤来标记已有Schema的版本。(默认值:1)
spring.flyway.baseline-version=1
abled=true
spring.flyway.sql-migration-prefix=V
spring.flyway.locations=classpath:db/migration
三、在resource⽬录下创建db/migration⽬录添加sql脚本
如图:
下⾯是V1.0.0.20190509.0957__flyway_test.sql脚本
use `spring_boot_building`;
DROP TABLE IF EXISTS `table1`;
CREATE TABLE `table1` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
spring_boot_building是我的项⽬连接的数据库
四、验证是否成功
启动项⽬,看启动⽇志:
打开数据库管理⼯具,查看数据库:
git使用详解五、SQL⽂件版本号命名的规范
每个公司的规范肯定不⼀样.开发时,只需要项⽬内遵循该规范即可,规范的确定并没有对错.提供⼀种sql⽂件命名规范仅供⼤家参考。
遇到的问题
因为我的项⽬数据库连接池使⽤的是Druid,在启动项⽬时发现报异常sql injection violation, part alway true condition not allow,原因是Flyway通过 SQL 脚本来执⾏数据库的建⽴与更新。当同时集成了 Druid 和Flyway 之后,Druid 的 wall 防⽕墙极可能直接⼲预 SQL 脚本的操作,继⽽导致 Flyway 执⾏中断。
⽹上教程是去掉wall防⽕墙配置,我试了确实可以,但是个⼈觉得这种做法不安全,应该还有其他的⽅法。
参考:
到此这篇关于Java 中Flyway的使⽤详解的⽂章就介绍到这了,更多相关java Flyway 使⽤内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
Git.gitignore文件配置规则详解
« 上一篇
发表评论