引入
Flyway
目前支持mysql5.7的社区版为7.15.0,支持mysql8.0的版本是8.2.0,8.2.1移除了mysql支持,如文档原 文:
Extract MySQL code to plugin. This will need to be added as a new dependency.
flyway的8.2.1版本移除mysql的解决方案,增加依赖:
> <dependency> > <groupId>org.flywaydb</groupId> > <artifactId>flyway-mysql</artifactId> > </dependency> > ``` ```xml <!--数据库迁移工具--> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-mysql</artifactId> <!--flyway-core 在高版本之后,不会默认mysql--> <version>9.21.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- Flyway插件信息配置 --> <build> <plugins> <plugin> <!--其他plugin插件--> </plugin> <!--migration 插件信息 可以在maven的插件中直接点击migrate进行数据填充--> <plugin> <groupId>org.flywaydb</groupId> <artifactId>flyway-maven-plugin</artifactId> <version>5.2.4</version> <configuration> <url>jdbc:mysql://localhost:3306/catch_admin?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT</url> <user>root</user> <password>admin123</password> <driver>com.mysql.cj.jdbc.Driver</driver> </configuration> </plugin> </plugins> </build>
配置信息
## flyway数据迁移
spring:
# 数据源,配置自己的数据库连接配置就好了
datasource:
url: jdbc:mysql://127.0.0.1:3306/catch_admin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: admin123
driver-class-name: com.mysql.cj.jdbc.Driver
minPoolSize: 3
maxPoolSize: 10
maxLifetime: 20000
borrowConnectionTimeout: 30
loginTimeout: 30
mainteanceInterval: 60
maxIdleTime: 60
flyway:
#是否开启
enabled: true
encoding: utf-8
locations: classpath:db/migration #迁移脚本的位置,默认db/migration
# baseline-on-migrate: false
# table: flyway_schema_history # 记录历史记录的表名称
# out-of-order: false
# migrate是否校验
# validate-on-migrate: true
# baseline-description: #执行基线时标记已有Schema的描述。
# baseline-on-migrate: false # 在没有元数据表的情况下,针对非空Schema执行迁移时是否自动调用基线。(默认值:false。)
# baseline-version: 1 #执行基线时用来标记已有Schema的版本。 (默认值:1。)
# check-location: false #检查迁移脚本所在的位置是否存在。 (默认值: false 。 )
# clean-on-validation-error: false #在验证错误时,是否自动执行清理。 (默认值: false 。 )
# enabled: true #开启Flyway。 (默认值: true 。 )
# encoding: UTF-8 #设置SQL迁移文件的编码。 (默认值: UTF-8 。 )
# ignore-failed-future-migration: false #在读元数据表时,是否忽略失败的后续迁移。 (默认值: false 。 )
# init-sqls: #获取连接后立即执行初始化的SQL语句。
# locations: classpath:db/migration #迁移脚本的位置。 (默认值: db/migration 。 )
# out-of-order: false #是否允许乱序(out of order)迁移。 (默认值: false 。 )
# password: #待迁移数据库的登录密码
# placeholder-prefix: #设置每个占位符的前缀。 (默认值: ${ 。 )
# placeholder-replacement: #是否要替换占位符。 (默认值: true 。 )
# flyway.placeholder-suffix: #设置占位符的后缀。 (默认值: } 。 )
# placeholders: [placeholder name] #设置占位符的值。
# schemas: #Flyway管理的Schema列表,区分大小写。默认连接对应的默认Schema。
# sql-migration-prefix: V #SQL迁移的文件名前缀。 (默认值: V 。 )
# sql-migration-separator: __ #SQL迁移的文件名分隔符。 (默认值: __ 。 )
# sql-migration-suffix: .sql #SQL迁移的文件名后缀。 (默认值: .sql 。 )
# table: #Flyway使用的Schema元数据表名称。 (默认值: schema_version 。 )
# target: #Flyway要迁移到的目标版本号。 (默认最新版本。 )
# url: #待迁移的数据库的JDBC URL。如果没有设置,就使用配置的主数据源。
# user: #待迁移数据库的登录用户。
# validate-on-migrate: true #在运行迁移时是否要自动验证。 (默认值: true 。 )
放置脚本
- classpath:/db/migration 目录为flyway默认的迁移脚本存放目录,可以通过flyway.locations进行配置
- 迁移脚本文件名称:flyway的实现就是根据判断迁移记录表和迁移脚本文件名称来实现的。对于版本升级需要执行的sql,文件名称必须以“V”开头,后面跟版本号,再跟两个下划线,再跟自定义名称,最后跟“.sql”
- V1.0.1__migration.sql:sql的内容就是在版本1.0.1中新增了一条数据
格式详解
V{version}_{date}_{num}__{type}_{description}_{Author}.sql
例如:
V5_1_0_20180914_1__DDL_alter_table_medicinenames_qiaotiansheng
详细说明:
version : 需求版本号 (2.3.3、2.4.0)
date: 提交日期20180507
num: 开发人员自由命名,格式必须为数字
type: sql文件类型 DML 数据更新(插入、更新、删除); DDL 结构更新; DCL 权限控制;
description: 文件描述
Author: 开发人员姓名
注意
我们在定义脚本的时候,除了 V 字开头的脚本之外,还有一种 R 字开头的脚本。
V 字开头的脚本只会执行一次(脚本文件格式:V1.0.0init.sql)。 R 字开头的脚本,只要脚本内容发生了变化,启动时候就会执行(脚本文件格式:Rinit.sql 没有版本的概念)。 所有的脚本,一旦执行了,就会在 flyway_schema_history 表中有记录,如果你不小心搞错了,可以手动从 flyway_schema_history 表中删除记录,然后修改 SQL 脚本后再重新启动(生产环境不建议)。
Flyway将每一个数据库脚本称之为:migrations,flyway支持三种类型的migration:
- Versioned migrations:最常用的migration,可以简单的理解为数据库升级脚本
- Undo migrations:数据库版本回退脚本,需要Pro版本,忽略,而且使用过程存在较大风险,undo操作目前只能通过plugin或者command-line来执行
- Repeatable migrations:可重复执行的migration,例如create or replace脚本,当脚本checksums改变时会重新执行