flyway助力数据库脚本自动化管理攻略(代码片段)

author author     2023-05-06     695

关键词:

原文地址:梁桂钊的博客

博客地址:http://blog.720ui.com

欢迎关注公众号:「服务端思维」。一群同频者,一起成长,一起精进,打破认知的局限性。

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

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

技术图片

Flyway 不仅可以支持 MySQL,它也可以支持非常多其他的数据库。
技术图片

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

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>

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

spring:
  flyway:
    enabled: true
    baseline-on-migrate: true
    locations: [classpath:db/sql]

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

CREATE TABLE `flyway_schema_history` (
  `installed_rank` int(11) NOT NULL,
  `version` varchar(50) DEFAULT NULL,
  `description` varchar(200) NOT NULL,
  `type` varchar(20) NOT NULL,
  `script` varchar(1000) NOT NULL,
  `checksum` int(11) DEFAULT NULL,
  `installed_by` varchar(100) NOT NULL,
  `installed_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `execution_time` int(11) NOT NULL,
  `success` tinyint(1) NOT NULL,
  PRIMARY KEY (`installed_rank`),
  KEY `flyway_schema_history_s_idx` (`success`)
)

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

DROP TABLE IF EXISTS `tag`;

CREATE TABLE `tag` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `gmtCreate` date DEFAULT NULL,
  `gmtModified` date DEFAULT NULL,
  `title` varchar(32) DEFAULT NULL,
  `parentId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

技术图片

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

技术图片

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

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

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

  • Versioned migrations:数据库升级脚本
  • Repeatable migrations:可重复执行,当脚本 checksums 改变时会重新执行。

技术图片

  • prefix: 前缀标识,默认值 V 表示 Versioned, R 表示 Repeatable
  • version: 标识版本号, 由一个或多个数字构成, 数字之间的分隔符可用点.或下划线_
  • separator: 用于分隔版本标识与描述信息, 默认为两个下划线__
  • description: 描述信息, 文字之间可以用下划线或空格分隔
  • suffix: 后续标识, 默认为.sql

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

写在末尾

【服务端思维】:我们一起聊聊服务端核心技术,探讨一线互联网的项目架构与实战经验。让所有孤军奋战的研发人员都找到属于自己的圈子,一起交流、探讨。在这里,我们可以认知升级,连接顶级的技术大牛,连接优秀的思维方式,连接解决问题的最短路径,连接一切优秀的方法,打破认知的局限。

更多精彩文章,尽在「服务端思维」!

技术图片

本文由博客一文多发平台 OpenWrite 发布!

flyway持续数据库集成(代码片段)

数据难以管理,数据库难以测试。数据库部署比应用程序部署复杂得多,因为您不能每次都从头开始重新部署代码。数据库自动化很困难,而且通常是担心弄乱关键数据,这可能会暂停后续开发并减慢业务交付。... 查看详情

flyway学习使用总结(代码片段)

Flyway学习使用总结前言之前从未认为数据库管理是这么的重要,直到去年参与核算检测的项目,迭代周期极其之短,加之开发、测试、预发、生产多套环境并存,之前通过markdown记录的数据库变动心力交瘁,才... 查看详情

数据库版本管理工具flyway使用(代码片段)

...引入依赖2、application.yml配置3、sql脚本编写 四、初始化数据库五、注意事项一、简介Flyway是一款开源的数据库版本管理工具,使用简单,应用无侵入。与Liquibase相比,由于Flyway面向sql,因此更直观清晰,对于... 查看详情

flyway管理数据库版本(代码片段)

Flyway和Liquibase都是Java项目中常用的DBmigration工具,从使用简便性看,Flyway比Liquibase更简单,从github的star数量看,flyway更受欢迎.============================== flyway命令行工具和maven插件==============================对于SpringBoot项目开发,其 查看详情

flyway-versioncontrolforyourdatabase(代码片段)

Flyway是什么?Flyway是个数据库版本管理工具。在开发过程中,数据库难免发生变更,例如数据变更,表结构变更、新建表或者视图等等。在项目进行时无法保证一旦开发环境中的数据库内容变化候会去测试环境去更新数据库。即... 查看详情

flyway的快速入门教程(代码片段)

...七、flyway配置清单一、简单介绍  Flyway 是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本。  在项目或产品中,很难一开始就把业务理... 查看详情

flyway持续数据库集成(代码片段)

数据难以管理,数据库难以测试。数据库部署比应用程序部署复杂得多,因为您不能每次都从头开始重新部署代码。数据库自动化很困难,而且通常是担心弄乱关键数据,这可能会暂停后续开发并减慢业务交付。... 查看详情

flyway客户端使用

一、flyway介绍  Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations可... 查看详情

助力工业物联网,工业大数据之脚本开发(代码片段)

01:脚本开发思路目标:实现自动化脚本开发的设计思路分析路径step1:脚本目标step2:实现流程step3:脚本选型step4:单个测试实施创建一个文件,存放要采集的表的名称#创建测试目录mkdir -p /opt/datas/s... 查看详情

助力工业物联网,工业大数据之脚本开发(代码片段)

01:脚本开发思路目标:实现自动化脚本开发的设计思路分析路径step1:脚本目标step2:实现流程step3:脚本选型step4:单个测试实施创建一个文件,存放要采集的表的名称#创建测试目录mkdir -p /opt/datas/s... 查看详情

实战flyway迁移指南最佳实践(代码片段)

项目在多环境迭代开发过程中,数据库的表结构不断变更,在部署时,往往会出现数据库表结构未及时变更导致出现问题,耗费在表结构上的时间相当多,上线过程持续痛苦,代码有GIT/SVN来控制,数据库中的表版本也可以做到... 查看详情

flyway学习使用总结(代码片段)

Flyway学习使用总结前言之前从未认为数据库管理是这么的重要,直到去年参与核算检测的项目,迭代周期极其之短,加之开发、测试、预发、生产多套环境并存,之前通过markdown记录的数据库变动心力交瘁,才... 查看详情

Flyway 数据库迁移在部署新战争时自动运行

】Flyway数据库迁移在部署新战争时自动运行【英文标题】:Flywaydatabasemigrationtorunautomaticallywhennewwardeployed【发布时间】:2016-09-0611:32:18【问题描述】:每当我向服务器部署新战争时,我希望Flyway运行。部署服务器时flyway会自动运... 查看详情

crm软件助力企业实现销售自动化(代码片段)

...ff0c;增强销售能力,提高销售水平,实现企业销售自动化。crm软件助力企业实现销售自动化什么是销售自动化?销售自动化是crm客户关系管理软件的应用范围之一。它是指在所有的销售渠道中,包括现场或移动销... 查看详情

crm软件助力企业实现销售自动化(代码片段)

...ff0c;增强销售能力,提高销售水平,实现企业销售自动化。crm软件助力企业实现销售自动化什么是销售自动化?销售自动化是crm客户关系管理软件的应用范围之一。它是指在所有的销售渠道中,包括现场或移动销... 查看详情

liquibase-数据库版本管理使用(代码片段)

 Liquibase-数据库版本管理一、数据库版本管理说明1、liquibase介绍1.1、changelog文件格式2、flyway介绍3、liquibase与flyway比较二、springboot+liquibase1、gradle配置引入liquibase包:2、修改application.yml或加LiquibaseConfig.java2.1、application.yml2.2... 查看详情

根据 Flyway,原始 SQL 脚本现在无效

...生产一段时间的SpringBoot应用程序。我们使用Flyway来管理数据库迁移。我刚刚从2.4.5升级到Springboot2.5.4,随之升级到Flyway7.7.3。在全新的本地环境中执行所有迁移时,迁移现在 查看详情

极客时间-左耳听风-程序员攻略-分布式架构入门(代码片段)

...理,涉及隔离、幂等、重试、业务补偿、异步、降级等。自动化运维,涉及持续集成、持续部署、全栈监控、调用链跟踪等。所 查看详情