Flyway 是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。
Flyway 的特性
- 自动升级(自动发现更新项):Flyway 会将任意版本的数据库升级到最新版本。Flyway 可以脱离JVM 环境通过命令行执行,可以通过Ant 脚本执行,通过Maven 脚本执行(这样就可以在集成环境自动执行),并且可以在应用中执行(比如在应用启动时执行)。
- 规约优于配置:Flyway 有一套默认的规约,所以不需要修改任何配置就可以正常使用。
- 既支持SQL 脚本,又支持Java 代码:可以使用SQL 脚本执行数据库更新,也可以使用Java 代码来进行一些高级数据升级操作。
- 高可靠性:在集群环境下进行数据库升级是安全可靠的。
- 支持清除已存在的库表结构:Flyway 可以清除已存在的库表结构,可以从零开始搭建您的库表结构,并管理您的数据库版本升级工作。
- 支持失败修复。新的2.0 版本提供了repair 功能,用于解决数据库更新操作失败问题。
如何使用Flyway
使用Flyway ,我们需要准备Flyway 将要执行的数据库脚本(Flyway 支持sql 脚本与java 代码,这里认为在Flyway下执行数据库更新操作的java 代码也是一种数据库脚本),然后通过Flyway 提供的几种不同运行方式来执行这些脚本。(以下配置参数说明基于Flyway 1.7 版本,新的2.0 版本在配置参数上有不少变动,与下面的介绍会有不少出入,以下说明仅供参考)
数据库脚本
Flyway 的主要任务是管理数据库的版本更新,在Flyway 中称每次数据库更新为一个migration ,为了更顺口,我们下面称之为数据库脚本。Flyway 支持SQL-based migrations 和Java-based migrations 。
Flyway 支持的数据库脚本有sql 脚本与java 代码,sql 脚本即普通的sql 脚本,包含创建数据库、表,更新库表结构,数据插入、更新、删除等sql 语句,java 代码则是通过一个有效的数据源,使用java 语言来进行数据库的操作,这里针对的读者是对数据库操作有一定熟悉程度的群体,不再详细讲解如何编写数据库脚本。
Flyway 的sql 脚本与java 代码都遵循以下默认规约:
Flyway 默认规约
- SQL 脚本文件默认位置是项目的源文件夹下的db/migration 目录。
- Java 代码默认位于db.migration 包。
- SQL 脚本文件及Java 代码类名必须遵循以下命名规则:V<version>[_<SEQ>][__description] 。版本号的数字间以小数点(. )或下划线(_ )分隔开,版本号与描述间以连续的两个下划线(__ )分隔开。如V1_1_0__Update.sql 。Java 类名规约不允许存在小数点,所以Java 类名中版本号的数字间只能以下划线进行分隔。
目前flyway最新版本3.2.1 链接:http://flywaydb.org/documentation/commandline/
命令信息如下:
清空数据库(慎用,会删除所有的数据库对象,包括表/视图/存储过程...),可以执行以下语句:
flyway clean
如果想恢复最新版本数据库结构,可以先清空数据库,再执行以下语句:
flyway migrate
如果想恢复特定版本数据库结构,可以先清空数据库,再执行以下语句:
flyway migrate -target=1.0.1.002
如果想查看当前数据库状态信息,可以执行以下语句:
flyway info
Flyway还有validate,baseline,repair等命令,并且支持Maven,详情参阅Flyway官网
在命令行指定不同的配置文件,可以操作不同的数据库:
[deploy@iZ94y8mdqg3Z ~]$ flyway info -configFile=/opt/flyway/conf/flyway_test2.conf
Flyway 3.2.1 by Boxfuse
Database: jdbc:mysql://localhost:3306/test2 (MySQL 5.6)
+-----------+-----------------------+---------------------+---------+
| Version | Description | Installed on | State |
+-----------+-----------------------+---------------------+---------+
| 1.0.0 | << Flyway Baseline >> | 2015-09-28 20:29:12 | Baselin |
| 1.0.4.001 | test data | 2015-09-28 20:30:33 | Success |
+-----------+-----------------------+---------------------+---------+