Flyway 助力数据库脚本自动化管理攻略

Posted 服务端思维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flyway 助力数据库脚本自动化管理攻略相关的知识,希望对你有一定的参考价值。

回复”669“获取独家整理的精选资料集

回复”加群“加入全国服务端高端社群「后端圈」


作者 | 梁桂钊

出品 | 服务端思维

今天,探讨一个有趣的话题:我们可以通过 Git 来实现项目版本控制;通过 Jenkins 进行持续集成,那么对于数据库层面,我们仍然依赖于纯手工运行 SQL 脚本,对此,我们在多环境(开发环境、测试环境、预发环境、生产环境)中如何确保其 SQL 脚本的最新性和正确性?

Flyway 助力数据库脚本自动化管理攻略

众所周知,人工的操作非常容易出问题,我们应该让程序帮忙自动进行管理和迁移。今天,笔者推荐一款开源的数据库迁移工具 Flyway。

Flyway 助力数据库脚本自动化管理攻略

Flyway 不仅可以支持 mysql,它也可以支持非常多其他的数据库

Flyway 助力数据库脚本自动化管理攻略

事实上,Spring Boot 已经完美整合了 Flyway。对此,我们可以非常便捷地使用它。首先,我们引入 Maven 依赖。(注意的是,我们项目中还需要 spring-boot-starter-jdbc、 mysql-connector-java 依赖)

     
       
       
     
  1. <dependency>

  2. <groupId>org.flywaydb</groupId>

  3. <artifactId>flyway-core</artifactId>

  4. </dependency>

此外,我们在 application.yml 中配置相关选项。Spring Boot 默认在 classpath://db/migration 目录下扫描Migration。这里,笔者通过 spring.flyway.locations 将其调整为 db/sql。

     
       
       
     
  1. spring:

  2. flyway:

  3. enabled: true

  4. baseline-on-migrate: true

  5. locations: [classpath:db/sql]

当系统程序启动时,它会自动创建 flywayschemahistory 文件。(当然,也可以自己手动创建)。这张表是 Flyway 的元数据表, 其保存着每次 migration 的记录, 记录包含 migration 脚本的版本号和 SQL 脚本的 checksum 值。当一个新的 SQL 脚本被扫描到后, Flyway 解析该 SQL 脚本的版本号, 并和 metadata 表对比, 如果该 SQL 脚本版本更新的话, 将在指定的 DB 上执行该 SQL 文件, 否则跳过该 SQL 文件。

     
       
       
     
  1. CREATE TABLE `flyway_schema_history` (

  2. `installed_rank` int(11) NOT NULL,

  3. `version` varchar(50) DEFAULT NULL,

  4. `description` varchar(200) NOT NULL,

  5. `type` varchar(20) NOT NULL,

  6. `script` varchar(1000) NOT NULL,

  7. `checksum` int(11) DEFAULT NULL,

  8. `installed_by` varchar(100) NOT NULL,

  9. `installed_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

  10. `execution_time` int(11) NOT NULL,

  11. `success` tinyint(1) NOT NULL,

  12. PRIMARY KEY (`installed_rank`),

  13. KEY `flyway_schema_history_s_idx` (`success`)

  14. )

然后,我们在 db/sql 下手动创建一个初始化的 SQL 脚本:V1.1_INITDB.sql。

     
       
       
     
  1. DROP TABLE IF EXISTS `tag`;


  2. CREATE TABLE `tag` (

  3. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,

  4. `gmtCreate` date DEFAULT NULL,

  5. `gmtModified` date DEFAULT NULL,

  6. `title` varchar(32) DEFAULT NULL,

  7. `parentId` int(11) DEFAULT NULL,

  8. PRIMARY KEY (`id`)

  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

那么,在程序再次启动后,它会将其自动化发布到数据库中。   

Flyway 助力数据库脚本自动化管理攻略

这里,需要补充的知识点:Flyway 的版本比较规则。其采取左对齐原则,缺位用 0 代替。例如 1.1 比 1.0 版本高,1.1.1 比 1.1  版本高,而 1.1.01 和 1.1.1  版本一致。并且,它们会按照版本排序且顺序执行。

Flyway 助力数据库脚本自动化管理攻略

此外,Flyway 不仅支持 DDL,也同时支持 DML(insert、update、delete)等。因此,我们可以再创建一个 V1.2_INSERTTAG_DATA.sql 文件来验证一下。

     
       
       
     
  1. INSERT tag(title, parentId) values('java', 0);

  2. INSERT tag(title, parentId) values('spring', 0);

最后,我们在来一起探讨下Flyway 支持常见类型的 migration:

  • Versioned migrations:数据库升级脚本

  • Repeatable migrations:可重复执行,当脚本 checksums 改变时会重新执行。

Flyway 助力数据库脚本自动化管理攻略

  • prefix: 前缀标识,默认值 V 表示 Versioned, R 表示 Repeatable

  • version: 标识版本号, 由一个或多个数字构成, 数字之间的分隔符可用点.或下划线_

  • separator: 用于分隔版本标识与描述信息, 默认为两个下划线__

  • description: 描述信息, 文字之间可以用下划线或空格分隔

  • suffix: 后续标识, 默认为.sql

总结一下,Flyway 通过元数据(flywayschemahistory)帮忙我们自动化维护和管理数据库的版本迁移。

相关推荐:

  • 《》

  • 《》

  • 《》


— 新书出版 —

新书出版

Flyway 助力数据库脚本自动化管理攻略
Flyway 助力数据库脚本自动化管理攻略


— 本文结束 —


觉得对「服务端思维」有期待,请在文末点个在看


「服务端思维」是一个汇聚全国服务端技术人员的高端社群。我们希望让所有孤军奋战的研发人员都找到属于自己的圈子,一起交流、探讨。在这里,我们可以认知升级,连接顶级的技术大牛,连接优秀的思维方式,连接解决问题的最短路径,打破认知的局限。




Flyway 助力数据库脚本自动化管理攻略

在看点这里

以上是关于Flyway 助力数据库脚本自动化管理攻略的主要内容,如果未能解决你的问题,请参考以下文章

Flyway详解以及Springboot集成Flyway, 数据库脚本版本管理

Flyway客户端使用

Spring Boot中使用Flyway来管理数据库版本

Flyway详解以及Springboot集成Flyway(转)

数据库版本控制Flyway

数据库版本管理工具Flyway——基础篇