引入 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&amp;characterEncoding=utf8&amp;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改变时会重新执行
文档更新时间: 2023-12-18 03:25   作者:JeffreyCheung