# flywaydb **Repository Path**: sunt/flywaydb ## Basic Information - **Project Name**: flywaydb - **Description**: flywaydb maven 和git实现数据库脚本持续集成 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2017-06-06 - **Last Updated**: 2025-01-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # flyway maven git数据库持续集成 Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations可以写成SQL脚本,也可以写在Java代码中,不仅支持Command Line和Java API,还支持Build构建工具和Spring Boot等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。 Flyway主要基于6种基本命令:Migrate, Clean, Info, Validate, Baseline and Repair。目前支持的数据库主要有: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. ## Flyway如何工作的 Flyway对数据库进行版本管理主要由Metadata表和6种命令完成,Metadata主要用于记录元数据,每种命令功能和解决的问题范围不一样,以下分别对metadata表和这些命令进行阐述,其中的示意图都来自Flyway的官方文档。 ### Metadata Table Flyway中最核心的就是用于记录所有版本演化和状态的Metadata表,在Flyway首次启动时会创建默认名为SCHEMA_VERSION的元数据表,其表结构为(以MySQL为例): | Field  | Type | Null | Key | Default | | --- | --- | --- | --- | --- | | version_rank | int | NO | MUL | NULL | | installed_rank | int | NO | MUL | NULL | | version | varchar(50) | NO | PRI | NULL | | description | varchar(200) | NO | | NULL | | type | varchar(20) | NO | | NULL | | script | varchar(1000) | NO | | NULL | | checksum | int | YES | | NULL | | installed_by | varchar(100) | NO | | NULL | | installed_on | timestamp | NO | | CURRENT_TIMESTAMP | | execution_time | int|NO | MUL | NULL | ### Migrate Migrate是指把数据库Schema迁移到最新版本,是Flyway工作流的核心功能,Flyway在Migrate时会检查Metadata(元数据)表,如果不存在会创建Metadata表,Metadata表主要用于记录版本变更历史以及Checksum之类的。 Migrate时会扫描指定文件系统或Classpath下的Migrations(可以理解为数据库的版本脚本),并且会逐一比对Metadata表中的已存在的版本记录,如果有未应用的Migrations,Flyway会获取这些Migrations并按次序Apply到数据库中,否则不需要做任何事情。另外,通常在应用程序启动时应默认执行Migrate操作,从而避免程序和数据库的不一致性。 ### Clean Clean相对比较容易理解,即清除掉对应数据库Schema中的所有对象,包括表结构,视图,存储过程,函数以及所有的数据等都会被清除。 Clean操作在开发和测试阶段是非常有用的,它能够帮助快速有效地更新和重新生成数据库表结构,但特别注意的是:不应在Production的数据库上使用! ### Info Info用于打印所有Migrations的详细和状态信息,其实也是通过Metadata表和Migrations完成的,下图很好地示意了Info打印出来的信息 Info能够帮助快速定位当前的数据库版本,以及查看执行成功和失败的Migrations。 ### Validate Validate是指验证已经Apply的Migrations是否有变更,Flyway是默认是开启验证的。 Validate原理是对比Metadata表与本地Migrations的Checksum值,如果值相同则验证通过,否则验证失败,从而可以防止对已经Apply到数据库的本地Migrations的无意修改。 ### Baseline Baseline针对已经存在Schema结构的数据库的一种解决方案,即实现在非空数据库中新建Metadata表,并把Migrations应用到该数据库。 Baseline可以应用到特定的版本,这样在已有表结构的数据库中也可以实现添加Metadata表,从而利用Flyway进行新Migrations的管理了。 ### Repair Repair操作能够修复Metadata表,该操作在Metadata表出现错误时是非常有用的。 Repair会修复Metadata表的错误,通常有两种用途: * 移除失败的Migration记录,该问题只是针对不支持DDL事务的数据库。 * 重新调整已经应用的Migratons的Checksums值,比如:某个Migratinon已经被应用,但本地进行了修改,又期望重新应用并调整Checksum值,不过尽量不要这样操作,否则可能造成其它环境失败。 ## 配置 | 参数 | 必填 | 默认值 | 描述 | | --- | --- | --- | --- | | url | YES | | 数据库连接 | | driver | NO | 根据URL自动检测 | 数据连接字符串 | | serverId | NO | flyway-db | maven setting.xml中的serverid,用来验证权限 | | user | NO | | 连接数据库的用户名 | | password | NO | | 连接数据库的密码 | | schamas | NO | url中的默认的schamas | 通过flyway管理的数据库的schamas,区分大小写 | | table | NO | schema_version | Flyway元数据表名 | | localtions | NO | filesystem: src/main/resources /db/migration | 脚本路径,递归扫描 | | sqlMigrationPrefix | NO | V | sql 迁移脚本名称的前缀 | | repeatableSqlMigrationPrefix | NO | R | 可重复执行的sql 迁移文件名前缀 | | sqlMigrationSeparator | NO | __ | sql 迁移脚本名称的分隔符 | | sqlMigrationSuffix | NO | .sql | sql 迁移脚本名称的文件扩展名 | | allowMixedMigrations | NO | false | 是否允许在同一迁移脚本中混合事务性和非事务性语句 | | encoding | NO | UTF-8 | sql迁移脚本文件编码 | | placeholderReplacement | NO | true | 占位符是否要被替换 | | placeholders | NO | | sql迁移脚本中的占位符 | | placeholderPrefix | NO |${ | 占位符前缀 | | placeholderSuffix | YES |} | 占位符后缀 | | resolvers | NO | | 自定义MigrationResolver的实现类的完全限定名称 | | skipDefaultResolvers | NO | false | 是否跳过内置的resolvers(sql, jdbc and spring-jdbc),如果是,则仅仅运行自定义的resolvers | | callbacks | NO | | 自定义flywaycallback实现类的完全限定名 | | skipDefaultCallbacks | NO | false | 是否跳过内置的callbacks(sql) | | target | NO | lastest version | Flyway 应该迁移的脚本。高于target的迁移不会运行 | | outOfOrder | NO | false | 是否允许执行乱序的脚本。如果为true,假如你现在已经执行的版本1和3,现在有一个版本V2,也会被应用,而不是被忽略 | | validateOnMigrate | NO | true | 自定义flywaycallback实现类的完全限定名 | | cleanOnValidationError | NO | false | 迁移合并失败后是否自动执行clean命令 | | ignoreMissingMigrations | NO | false | 迁移合并失败后是否自动执行clean命令 | https://flywaydb.org/documentation/maven/migrate ## maven 集成 ### flyway-maven-plugin 插件配置 flyway 与maven集成,需要在pom.xml中引入flyway-maven-plugin插件,代码如下 ```xml org.flywaydb flyway-maven-plugin 4.0.3 true false true false true 1.0 com.mysql.jdbc.Driver jdbc:mysql://xxx.xxx.xx.x:3306/xxx db_user passwd ``` 另外,configuration标签内配置也可以在在maven变量或者系统环境变量中配置,配置名称为flyway.xxx,如cleanDisabled在变量里的名称为${flyway.cleanDisabled},以maven配置为例: ```xml org.flywaydb flyway-maven-plugin 4.0.3 true false true false true 1.0 com.mysql.jdbc.Driver jdbc:mysql://xxx.xx.xxx.x:3306/TABLENAME root ccccccc false ``` ### 运行 默认运行阶段在pre-integration-test * 合并/更新:mvn flyway:migrate * 修复:mvn flyway:repair * 清理:mvn flyway:clean