为什么使用flyway?
进行数据库版本管理,迁移,摆脱人工手动执行脚本或者手动更改数据库字段的尴尬(特别是数据库比较多的时候).
使用背景
在做一个框架平台的时候,因为多个项目和平台并行开发,导致平台每次进行版本升级的时候需要兼顾n多数据库的更新.
flywaydb的命名规则
如:V1__2014_4_13.sql ,V开头+版本号+双下划线+描述,描述中可以有下划线,后缀为sql.
支持的数据库
目前Flyway支持的数据库还是挺多的,包括:Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL(including Amazon RDS), MariaDB, Google Cloud SQL, PostgreSQL(including Amazon RDS and Heroku), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoenix
默认版本记录表
schema_version
相关命令
清空数据库(慎用,会删除所有的数据库对象,包括表/视图/存储过程...),可以执行以下语句:
flyway clean
如果想恢复最新版本数据库结构,可以先清空数据库,再执行以下语句:
flyway migrate
如果想恢复特定版本数据库结构,可以先清空数据库,再执行以下语句:
flyway migrate -target=1.0.1.002
如果想查看当前数据库状态信息,可以执行以下语句:
flyway info
Flyway还有validate,baseline,repair等命令,并且支持Maven
Maven使用示例
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>5.2.4</version>
<configuration>
<url>jdbc:mysql://localhost:3306/20190124</url>
<user>portals</user>
<password>java</password>
<outOfOrder>true</outOfOrder>
<baselineOnMigrate>true</baselineOnMigrate>
<placeholderReplacement>false</placeholderReplacement>
<encoding>UTF-8</encoding>
<table>fsl_schema_version</table>
<locations>
<location>db/migration/</location>
</locations>
</configuration>
</plugin>
mvn flyway:migrate
或者命令指定数据库
<properties>
<flyway>true</flyway>
</properties>
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>5.2.4</version>
<configuration>
<skip>${flyway}</skip>
</configuration>
<executions>
<execution>
<id>update</id>
<phase>process-resources</phase>
<configuration>
<url>${db.url}</url>
<user>${db.user}</user>
<password>${db.password}</password>
<outOfOrder>true</outOfOrder>
<baselineOnMigrate>true</baselineOnMigrate>
<placeholderReplacement>false</placeholderReplacement>
<encoding>UTF-8</encoding>
<table>fsl_schema_version</table>
<locations>
<location>db/migration/</location>
</locations>
</configuration>
<goals>
<goal>migrate</goal>
</goals>
</execution>
</executions>
</plugin>
执行更新命令则为
mvn process-resources -D flyway=false -D db.url=jdbc:mysql://127.0.0.1:3306/20190124 -D db.user=portals -D db.password=java
注意
1.特别要注意脚本文件的正确性,一定要保证脚本的正确,否则脚本执行到一半发生错误就需要手动修复
2.脚本文件如果已经执行过,便不要在进行任何更改(否则无法通过校验)
3.如果使用了flyway进行版本管理,就不要单独执行任何sql,以保证flyway的脚本完整性