Flyway介绍
功能简介
Flyway 是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。Flyway 可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations 可以写成 SQL 脚本,也可以写在 Java 代码中,不仅支持 Command Line 和 Java API,还支持 Build 构建工具和 Spring Boot 等,同时在分布式环境下能够安全可靠地升级数据库。
个人观点:该插件实现了对数据库表结构以及字典数据的版本维护,开发人员只需提供一套 SQL 语句脚本,实施人员通过 flyway 一键更新,无需关心执行顺序,只要相关数据与开发环境一致,一定不会发生任何报错。适用于同一程序多地进行部署场景,可有效避免在版本迭代过程中由于人工误操作造成的各种问题。但也缺乏一定智能性,无法识别人工修改导致的冲突,无法识别数据变化。
目前越来越多使用到flyway的项目开始替换为达梦数据库,本文简单介绍flyway与达梦数据库之间的适配。
官方网站
历史版本及帮助文档下载
https://repo1.maven.org/maven2/org/flywaydb/
Command line方式连接数据库
环境信息
序号 | 项目 | 版本 |
---|---|---|
1 | 操作系统 | redhat 6.8 |
2 | flyway | 4.2.0 |
3 | 数据库 | DM V8 |
4 | JDK | 1.8 |
配置步骤
解压压缩包
tar xvzf flyway-commandline-4.2.0.tar.gz
进入flyway-4.2.0目录
cd flyway-4.2.0
- 文件夹介绍
- conf :存放flyway.conf配置文件,通过jdbc方式配置数据库连接
- drivers:存放数据库jdbc驱动
- sql:存放数据库元数据sql脚本
配置jdbc连接(将DmJdbcDriver.jar放入drivers文件夹)
vi conf/flyway.conf
#jdbc连接串
flyway.url= jdbc:dm://127.0.0.1?comOracle=true
#数据库驱动类名
flyway.driver= dm.jdbc.driver.DmDriver
#数据库登录用户(用户名密码可不配置,连接时输入)
flyway.user=
#用户密码
flyway.password=
在sql文件夹下创建初始版本(版本命名规则为固定用法,【V1_1__具体文件名】)
vi V1_1__Create_person_table.sql
create table PERSON (
ID int not null,
NAME varchar(100) not null
);
初始化版本控制表
./flyway migrate -baselineOnMigrate=true
版本控制表schema_version初始化完成
执行已创建好的sql脚本
./flyway migrate
可在数据库中看到脚本中的person表创建成功,且版本记录表中增加1.1版本执行记录
其它
适配过程
初次进行连接测试时,结果如上图所示,提示不支持的数据库
ERROR: Unsupported Database: DM DBMS 8.1
适配方式一:修改url连接配置,增加Oracle兼容参数
配置文件修改如下
#jdbc连接串 增加了comOracle=true参数适配oracle
flyway.url= jdbc:dm://127.0.0.1?comOracle=true
再次连接测试,flyway识别数据库类别为Oracle,可成功连接。
适配方式二:修改源码增加对DM数据库的支持
将jar包反编译,并根据报错内容 Unsupported Database作为关键字在代码中进行搜索。
成功找到对应类,查看相关数据库类别判断逻辑
可以看出此处依次对各类数据库种类进行判断,不在范围内返回 Unsupported Database 报错。
由于 DM 高度兼容 Oracle,此处选取 Oracle 的适配类进行分析。
可看出对应方法中,实现了获取用户、模式等数据库基本信息的查询。通过测试其中语句不需做任何修改即可在 DM 中执行成功。
修改判断逻辑,将 DM 的适配逻辑改为与 Oracle 一致。
将修改好的java文件编译对应class文件
javac -cp D:\flyway-core-4.2.0.jar D:\DbSupportFactory.java
将 class 文件替换 jar 包内原文件。
再次测试连接:
可正常识别 DM DBMS,完美适配!
配置文件加密
目前越来越多的项目提高了对安全性的要求,将明文密码暴露在配置文件中存在一定安全风险。flyway自身暂不支持密码加密,但可通过第三方软件 gpg 实现对配置文件的加密处理,该方式也是flyway官方推荐的加密方式。详细使用说明可参考
报错以及回滚问题
flyway为版本控制工具,对于sql是否存在语法错误以及能否执行成功不做校验。且无法实现自动回滚,如需回滚需要通过sql方式修改为之前配置。
报错演示:
手动在数据库中对Person表创建主键。
alter table person add constraint pk_person primary key (id);
再通过版本控制重复创建主键
vi V1_2__Add_person_pk.sql
重复上述创建主键sql。
执行版本迁移
执行后有报错提示,提示进行回滚,且版本信息表中标记该版本执行不成功。
回滚操作介绍:
当前演示版本4.2.0中不支持回滚操作,但在最新版本中已提供回滚操作。
官方undo功能介绍:flyway回滚功能介绍.
所谓回滚操作,本质需要依赖用户编写的脚本实现当前版本变更的逆操作。如果在数据库实际使用过程中进行的一些破坏性的操作(比如 drop, delete, truncate, …),那么 undo 命令实际上很难去实现用户实际的操作目标,undo 最主要的目的是作用于一些可控的情况,如表结构的变更、约束条件变更等。实际生产应用环境中应尽量避免用到flyway的undo功能。
本例中如需实现回滚,可在版本控制表中删除执行失败记录,并手动在数据库中删除主键。