关于Flywayhttps://flywaydb.org/
Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。 Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置。 Migrations可以写成SQL脚本,也可以写在Java代码中,不仅支持Command Line和Java API,还支持Build构建工具和Spring Boot等。 同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。
Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway可以像SVN管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。
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。
文件名由以下部分组成,除了使用默认配置外,某些部分还可自定义规则。
.
或下划线_
。__
。.sql
。
V+版本号(版本号的数字间以"."或"_"分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名,例如:V2017.9.30__Update.sql。
注:版本号不能相同!
项目的源文件夹下的db/migration目录。
Flyway对数据库进行版本管理主要由Metadata表和6种命令完成。
基本指令:migrate、clean、info、validate、baseline、repair。
基本命令: 迁移, 清理, 信息, 验证, 撤消, 基线和 修复。
主要用于记录元数据。Flyway中最核心的就是用于记录所有版本演化和状态的Metadata表,在Flyway首次启动时会创建默认名为SCHEMA_VERSION的元数据表。 Metadata Table。
每种命令功能和解决的问题范围不一样。
Migrate
Migrate是指把数据库Schema迁移到最新版本,是Flyway工作流的核心功能,Flyway在Migrate时会检查Metadata(元数据)表,如果不存在会创建Metadata表,Metadata表主要用于记录版本变更历史以及Checksum之类的。 Migrate时会扫描指定文件系统或Classpath下的Migrations(可以理解为数据库的版本脚本),并且会逐一比对Metadata表中的已存在的版本记录,如果有未应用的Migrations,Flyway会获取这些Migrations并按次序Apply到数据库中,否则不需要做任何事情。另外,通常在应用程序启动时应默认执行Migrate操作,从而避免程序和数据库的不一致性。
Clean
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值,不过尽量不要这样操作,否则可能造成其它环境失败。
Migrations是指Flyway在更新数据库时是使用的版本脚本。 Flyway对Migrations的扫描还必须遵从一定的命名模式,Migration主要分为两类:Versioned和Repeatable。
Versioned 一般常用的是Versioned类型,用于版本升级,每一个版本都有一个唯一的标识并且只能被应用一次,并且不能再修改已经加载过的Migrations,因为Metadata表会记录其Checksum值。
其中的version标识版本号,由一个或多个数字构成,数字之间的分隔符可以采用点或下划线,在运行时下划线其实也是被替换成点了,每一部分的前导零会被自动忽略。
Repeatable 是指可重复加载的Migrations,其每一次的更新会影响Checksum值,然后都会被重新加载,并不用于版本升级。对于管理不稳定的数据库对象的更新时非常有用。
Repeatable的Migrations总是在Versioned之后按顺序执行,但开发者必须自己维护脚本并且确保可以重复执行,通常会在sql语句中使用CREATE OR REPLACE来保证可重复执行
org.flywaydb flyway-core 6.0.8 添加插件:
org.flywaydb flyway-maven-plugin 6.0.8 jdbc:mysql://192.168.183.206:3306/test?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8&serverTimezone=CTT root root
在工程的src/main/resources
目录下创建db/migration目录(Flyway加载Migrations时的默认Locations)
#############################################flyway######################################## spring.flyway.cleanDisabled=false spring.flyway.enabled=true spring.flyway.baselineOnMigrate=true
配置说明:
flyway.baseline-description= # 执行基线时标记已有Schema的描述 flyway.baseline-version=1 # 基线版本默认开始序号 默认为 1. flyway.baseline-on-migrate=false # 针对非空数据库是否默认调用基线版本 , 这也是我们上面版本号从 2 开始的原因 flyway.check-location=false # 是否开启脚本检查 检查脚本是否存在 默认false flyway.clean-on-validation-error=false # 验证错误时 是否自动清除数据库 高危操作!!! flyway.enabled=true # 是否启用 flyway. flyway.encoding=UTF-8 # 脚本编码. flyway.ignore-failed-future-migration=true # 在读元数据表时,是否忽略失败的后续迁移. flyway.init-sqls= # S获取连接后立即执行初始化的SQL语句 flyway.locations=classpath:db/migration # 脚本位置, 默认为classpath: db/migration. flyway.out-of-order=false # 是否允许乱序(out of order)迁移 flyway.placeholder-prefix= # 设置每个占位符的前缀。 默认值: ${ 。 flyway.placeholder-replacement=true # 是否要替换占位符。 默认值: true 。 flyway.placeholder-suffix=} # 设置占位符的后缀。 默认值: } 。 flyway.placeholders.*= # 设置占位符的值。 flyway.schemas= # Flyway管理的Schema列表,区分大小写。默认连接对应的默认Schema。 flyway.sql-migration-prefix=V # 迁移脚本的文件名前缀。 默认值: V 。 flyway.sql-migration-separator=__ # 迁移脚本的分割符 默认双下划线 flyway.sql-migration-suffix=.sql # 迁移脚本的后缀 默认 .sql flyway.table=schema_version # Flyway使用的Schema元数据表名称 默认schema_version flyway.url= # 待迁移的数据库的JDBC URL。如果没有设置,就使用配置的主数据源。 flyway.user= # 待迁移数据库的登录用户。 flyway.password= # 待迁移数据库的登录用户密码。 flyway.validate-on-migrate=true # 在运行迁移时是否要自动验证。 默认值: true 。
1.V1.4.0.sql
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for person -- ---------------------------- DROP TABLE IF EXISTS `person`; CREATE TABLE `person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `score` int(11) NOT NULL, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `name_score` (`username`(191),`score`), KEY `create_time` (`create_time`) ) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8mb4; SET FOREIGN_KEY_CHECKS = 1; -- ---------------------------- -- Records of person -- ---------------------------- BEGIN; INSERT INTO `person` VALUES (1, 'name1', 101, '2020-05-26 10:04:37'); INSERT INTO `person` VALUES (2, 'name2', 102, '2020-05-26 10:04:36'); COMMIT;
2.V1.4.1.sql
-- ---------------------------- -- Records of person -- ---------------------------- BEGIN; INSERT INTO `person` VALUES (3, 'name1', 101, '2020-05-26 10:04:37'); INSERT INTO `person` VALUES (4, 'name2', 102, '2020-05-26 10:04:36'); COMMIT;
1.maven执行
mvn flyway:migrate
2.启动程序