前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库迁移工具 Flyway 使用

数据库迁移工具 Flyway 使用

原创
作者头像
ZHANGHAO
修改2022-05-14 08:58:12
3.3K0
修改2022-05-14 08:58:12
举报
文章被收录于专栏:张浩的专栏张浩的专栏

Flyway 数据库迁移工具

它仅基于 7 个基本命令: Migrate、 Clean、 Info、 Validate、 Undo、 Baseline和 Repair。

迁移可以用SQL (支持特定于数据库的语法(如 PL/SQL、T-SQL 等))或Java (用于高级数据转换或处理 LOB)编写。

它有一个命令行客户端。如果您在 JVM 上,我们建议使用Java API 在应用程序启动时迁移数据库。或者,您也可以使用Maven 插件 或Gradle 插件。

如果这还不够,还有 适用于 Spring Boot、Dropwizard、Grails、Play、SBT、Ant、Griffon、Grunt、Ninja 等的插件!

支持的数据库有 Oracle、 SQL Server(包括 Amazon RDS 和 Azure SQL 数据库)、 Azure Synapse(以前的数据仓库)、 DB2、 MySQL(包括 Amazon RDS、Azure 数据库和 Google Cloud SQL)、 Aurora MySQL、 MariaDB、 Percona XtraDB Cluster、 TestContainers , PostgreSQL (包括 Amazon RDS, Azure Database, Google Cloud SQL, TimescaleDB, YugabyteDB & Heroku), Aurora PostgreSQL , Redshift , CockroachDB , SAP HANA , Sybase ASE、 Informix、 H2、 HSQLDB、 Derby、 Snowflake、 SQLite和 Firebird。

Oracle 支持情况:Oracle 12.2 及以上版本。11g 可通过修改源码实现使用。

Spring Boot 集成 Flyway

Spring Boot 官方提供了两款高级别的迁移工具:Flyway 和 Liquibase

Flyway 集成
  1. 添加依赖 org.flywaydb:flyway-core
  2. 启动时,自动化的运行Flyway 数据库迁移
Flyway 配置
代码语言:javascript
复制
spring:
  flyway:
    # flyway 的 clean 命令会删除指定 schema 下的所有 table, 应该禁掉
    clean-disabled: true
    # 迁移脚本的位置
    locations: classpath:db/migration
    #flyway 的 metadata 表名, 缺省为 flyway_schema_history
    table: my_flyway_schema_history
    #多人协作开发, 很可能先 apply 了自己本地的最新 SQL 代码, 然后发现其他同事早先时候提交的 SQL 代码还没有 apply,
    #所以 开发环境应该设置 spring.flyway.outOfOrder=true, 这样 flyway 将能加载漏掉的老版本 SQL 文件;
    #生产环境建议为 spring.flyway.outOfOrder=false
    out-of-order: true

Flyway 概念

迁移类型
  1. 版本化迁移:只执行一次,不可进行修改
  2. 撤消迁移:进行撤销版本化迁移,收费版本可用
  3. 可重复迁移:可以执行多次的迁移,可以进行修改,修改后重新执行
命名模式

为了被 Flyway 采用,SQL 迁移必须符合以下命名模式:

  1. 版本化迁移 V20220504113919__create_student.sql
  2. 撤消迁移 U20220504132902__create_student.sql
  3. 可重复的迁移 R__add_student.sql

文件名如下组成:

  1. 前缀:V用于版本化(可配置)、U撤消(可配置)和 R可重复迁移(可配置)
  2. 版本:带有点或下划线的版本可以根据需要分隔任意数量的部分(不适用于可重复的迁移)
  3. 分隔符:__两个下划线(可配置)
  4. 说明:下划线或空格分隔单词
  5. 后缀:.sql(可配置)

自动进行迁移

在 Spring Boot 应用程序启动时,自动进行迁移

代码语言:javascript
复制
2022-05-04 15:11:36.325  INFO 13303 --- [           main] o.f.c.internal.license.VersionPrinter    : Flyway Community Edition 7.7.3 by Redgate
2022-05-04 15:11:36.642  INFO 13303 --- [           main] o.f.c.i.database.base.DatabaseType       : Database: jdbc:oracle:thin:@localhost:1521:XE (Oracle 12.1)
2022-05-04 15:11:36.793  INFO 13303 --- [           main] o.f.core.internal.command.DbValidate     : Successfully validated 3 migrations (execution time 00:00.023s)
2022-05-04 15:11:36.815  INFO 13303 --- [           main] o.f.core.internal.command.DbMigrate      : Current version of schema "FLYWAY": << Empty Schema >>
2022-05-04 15:11:36.815  WARN 13303 --- [           main] o.f.core.internal.command.DbMigrate      : outOfOrder mode is active. Migration of schema "FLYWAY" may not be reproducible.
2022-05-04 15:11:36.830  INFO 13303 --- [           main] o.f.core.internal.command.DbMigrate      : Migrating schema "FLYWAY" to version "20220504113919 - create student"
2022-05-04 15:11:36.873  INFO 13303 --- [           main] o.f.c.i.s.DefaultSqlScriptExecutor       : 0 rows affected
2022-05-04 15:11:36.938  INFO 13303 --- [           main] o.f.core.internal.command.DbMigrate      : Migrating schema "FLYWAY" to version "20220504132902 - create seq"
2022-05-04 15:11:36.944  INFO 13303 --- [           main] o.f.c.i.s.DefaultSqlScriptExecutor       : 0 rows affected
2022-05-04 15:11:36.977  INFO 13303 --- [           main] o.f.core.internal.command.DbMigrate      : Migrating schema "FLYWAY" to version "20220504135829 - select student"
2022-05-04 15:11:36.982  INFO 13303 --- [           main] o.f.c.i.s.DefaultSqlScriptExecutor       : +----+------+
| ID | NAME |
+----+------+
| No rows r |
+----+------+

2022-05-04 15:11:37.013  INFO 13303 --- [           main] o.f.core.internal.command.DbMigrate      : Successfully applied 3 migrations to schema "FLYWAY", now at version v20220504135829 (execution time 00:00.208s)

迁移记录

迁移会记录到 flyway_schema_history 表中

installed_rank

version

description

type

script

checksum

installed_by

installed_on

execution_time

success

1

20220504113919

create student

SQL

V20220504113919__create_student.sql

1002084112

FLYWAY

2022-05-04 15:11:36.909950

48

1

2

20220504132902

create seq

SQL

V20220504132902__create_seq.sql

-1063390250

FLYWAY

2022-05-04 15:11:36.956655

9

1

3

20220504135829

select student

SQL

V20220504135829__select_student.sql

-1463386058

FLYWAY

2022-05-04 15:11:36.995406

9

1

IDEA插件

Flyway Migration Creation

使用 Flyway Migration Creation,可以很方便的在IDEA中创建Versioned Migration和Repeatable Migration

其他

官方网站:https://flywaydb.org

GitHub:https://github.com/flyway/flyway

Question

Q:db/migration 迁移文件越来越多的问题

A:可以在 db/migration 下面自己建立文件夹,存放自己的迁移

Q:多个项目时,因为要集成到项目里面,自动迁移,是需要新建个项目吗?专门用来存放脚本吗?

A:目前有多种方案,采用其中一种即可:

  1. 可以多个项目里面,都添加 Flyway,使用不同的 flyway_schema_history 表进行管理 ;
  2. 指定一个现有项目,添加 Flyway,所有的迁移都放到这个项目中;
  3. 新建一个项目,添加 Flyway,所有的迁移都放到这个项目中;
  4. 新建一个项目,添加 Flyway,使用 Gradle 或者 Maven 插件进行迁移。

Q:集群部署,同时启动执行,会不会有问题

A:会有问题,配置一台启用 Flyway 就可以了,在启动的命令里面加上-Dspring.flyway.enabled=true,其他的可以在 Apollo 或者 Nacos 中 配置 spring.flyway.enabled=false。这样启动的时候,只有一台实例自动化执行 Flyway 的迁移。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Flyway 数据库迁移工具
    • Spring Boot 集成 Flyway
      • Flyway 概念
        • 自动进行迁移
          • 迁移记录
          • IDEA插件
          • 其他
          • Question
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档