数据库版本管理工具 Flyway 使用

article/2025/11/10 9:06:19

目录

一、简介

二、核心概念

1、Schema History Table

2、Migration

3、Versioned migrations

 三、集成 SpringBoot

1、pom文件中引入依赖

2、application.yml配置

3、sql 脚本编写

 四、初始化数据库

五、注意事项


一、简介

Flyway是一款开源的数据库版本管理工具,使用简单,应用无侵入。与 Liquibase 相比,由于 Flyway 面向sql,因此更直观清晰,对于我们来说,轻便的 Flyway 是一个更好的选择,两者相比一言以蔽之:

  • 面向 SQL,选择 Flyway
  • 不面向 SQL,选择 Liquibase

二、核心概念

1、Schema History Table

Flyway 对数据库进行版本控制的方式,是在指定数据库中创建一张表,即 Schema History Table(默认为 flyway_schema_history),记录由 Flyway 所执行的 sql 脚本状态。
表中字段解释:

  • installed_rank:执行序号
  • version:版本
  • script:sql脚本文件
  • checksum:类似文件md5值,用来检查 migration 在执行过后是否发生了变化,如果发生了变化,会导致这个版本以及后续版本的 migration 无法执行
  • success:是否执行成功,1成功,0失败

2、Migration

Flyway 将每一个数据库脚本称之为:migration,migration 可以是 SQL 文件,也可以是 Java 类,默认的查找 migration 的路径为 classpath:db/migration,对应 SQL 文件可放置在 src/main/resources/db/migration 下,Java 类可放置在 src/main/java/db/migration 下。flyway 支持三种类型的migration:

  • Versioned migrations:最常用的 migration,可以简单的理解为数据库升级脚本
  • Undo migrations:数据库版本回退脚本,可为对应版本的常规 versioned migration 进行回退操作,此功能为收费功能,社区版无法使用
  • Repeatable migrations:可重复执行的 migration,例如create or replace脚本,会在所有的 versioned migration 都执行过后再进行执行,即当脚本 checksum 改变时重新执行

所有的 migration 都需要遵守命名规范:

3、Versioned migrations

这里单独介绍下 Versioned migrations,关于命名规范,需要一个大写的 V 作为版本的前缀标志,然后在后面紧跟着一个数字作为版本号(版本号可以是数字加.的形式),这个就是 Flyway 进行追踪的依据,在版本号后面需要下划线作为分隔符用来分割版本号和说明(这里特别需要注意的是分隔符是两个下划线)。

其中版本号必须全局(一个 Schema History Table 里)唯一,且默认情况下(可通过参数调整)版本号只能增加,不能在已经执行了高版本的 migration 之后再执行低版本的 migration。

 三、集成 SpringBoot

1、pom文件中引入依赖

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

2、application.yml配置

spring:flyway:# 是否启用flywayenabled: true# 编码格式,默认UTF-8encoding: UTF-8# 迁移sql脚本文件存放路径,默认db/migrationlocations: classpath:db/migration# 迁移sql脚本文件名称的前缀,默认Vsql-migration-prefix: V# 迁移sql脚本文件名称的分隔符,默认2个下划线__sql-migration-separator: __# 迁移sql脚本文件名称的后缀sql-migration-suffixes: .sql# 迁移时是否进行校验,默认truevalidate-on-migrate: true# 当迁移发现数据库非空且不存在元数据表时,自动执行基准迁移,新建schema_version表baseline-on-migrate: true

3、sql 脚本编写

在 src/main/resources 下新建 /db/migration 文件夹,并创建 sql 脚本文件:

上面的配置已经设置了 baseline-on-migrate 为 true(默认 false),即已经告诉 Flyway 执行 migration 的时候是存在基线的,这样就不会报出数据库表不存在的错了。因此不管你的数据库是否非空,都能顺利运行,唯一的区别是第一个 sql 脚本文件的执行

拿上面这张图的 V1.0__init_database.sql 脚本来说,如果数据库为空,则默认会执行;反之则会把它作为基线,跳过执行下一个版本

数据库非空情况下 flyway_schema_history 表记录:

 数据库为空情况下 flyway_schema_history 表记录:

 

 四、初始化数据库

SpringBoot 集成完 Flyway 之后,数据库的创建同样需要作为程序启动即执行,否则项目复用时仍然需要先创建数据库再启动程序,不是很智能,部分代码如下:

public void initDataBase() {try {String databaseName = properties.getDatabaseName();if (StringUtils.isEmpty(databaseName)) {databaseName = JdbcUrlUtils.findDatabaseName(datasourceUrl);log.debug("尝试获取spring.datasource.url中的数据库名称...url:{},name:{}", datasourceUrl, databaseName);}String jdbcUrlTmp = datasourceUrl.replace(SLASH+databaseName,BLANK);SingleConnectionDataSource dataSourceTmp = new SingleConnectionDataSource(jdbcUrlTmp,username,password,true);JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSourceTmp);String executeSql = String.format(properties.getCreateSchemaSql(), databaseName);jdbcTemplate.execute(executeSql);log.info("执行初始化库的sql,sql:{}", executeSql);} catch (Exception e) {log.error("校验数据库失败!", e);}}

在抽象初始化数据库这部分代码作为组件时,有一点需要注意,如果你的项目有使用 Mybatis-plus 框架,不建议采用自动配置的方式初始化bean,会出现 mp 的自动配置类执行顺序始终比自定义配置类快,可以采用 InitializingBean 和 BeanPostProcessor

五、注意事项

1、脚本文件如果已经执行过,便不要在进行任何更改,如果需要修改请通过新增一个新的 sql 脚本文件来达成;否则修改一个已经执行过的脚本,会导致 Flyway 校验失败(还原该脚本可以解决)
2、sql 脚本有错误,执行失败后进行修改,再次执行报错,理由同1,此时需要删除 flyway_schema_history 中对应版本的约束然后重新执行
3、增量脚本里的 sql 尽量保证可以多次执行


http://chatgpt.dhexx.cn/article/aS2Zkto4.shtml

相关文章

Flyway简介及使用

Flyway简介及使用 1、简介 1.1 Flyway是什么&#xff1f; Flyway是一款开源的数据库版本管理工具&#xff0c;它更倾向于规约优于配置的方式。 Flyway可以独立于应用实现管理并跟踪数据库变更&#xff0c;支持数据库版本自动升级&#xff0c;并且有一套默认的规约&#xff0…

Flyway基础简介

1. 概述 Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。 自动升级&#xff08;自动发现更新项&#xff09;&#xff1a;Flyway 会将任意版本的数据库升级到最新版本。Flyway 可以脱离JVM 环境通过命令行执行&#xff0c;可以通过Ant 脚本执行&#…

flyway的学习总结

一、简单介绍 Flyway 是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用&#xff0c;或者在Java应用程序中引入&#xff0c;用于管理我们的数据库版本。 在项目或产品中&#xff0c;很难一开始就把业务理清楚&#xff0c;把数据库表设计好&#xff0c;因此数据表…

Flyway——配置和使用(入门)

文章目录 介绍测试环境依赖引入配置数据库连接启动类设置脚本项目结构概览项目启动&#xff0c;观察日志和数据库结果测试R开头的脚本直接重启项目修改 R__add_user_info.sql 后重启 变更数据库字段验证 V 只能执行一次的问题验证 R 可执行多次验证只有一个_会报错技能扩充参考…

flyway的快速入门教程

目录 一、简单介绍 二、为什么要使用flyway 三、flyway是如何工作的 四、如何使用flyway 1、先要初始化一个SpringBoot项目&#xff0c;引入依赖 2、在application.yml中添加相关配置 3、根据配置文件中填写的脚本存放路径&#xff0c;创建文件夹 4、添加需要运行的sql…

Flyway详解(使用说明及避坑指南、一文搞懂flyway)

一、简介 1.1 Flyway是什么&#xff1f; Flyway是一款开源的数据库版本管理工具&#xff0c;可以实现管理并跟踪数据库变更&#xff0c;支持数据库版本自动升级&#xff0c;而且不需要复杂的配置&#xff0c;能够帮助团队更加方便、合理的管理数据库变更。 例&#xff1a;创建…

MySQL数据库的集群解决方案(一)

读写分库架构 我们一般应用对数据库而言都是“读多写少”&#xff0c;也就说对数据库读取数据的压力比较大&#xff0c;有一个思路就是说采用数据库集群的方案&#xff1a; 其中一个是主库&#xff0c;负责写入数据&#xff0c;我们称之为&#xff1a;写库&#xff1b; 其它都是…

MySQL数据库集群实战(1)——MySQL数据库基础知识

文章目录 一、为什么使用数据库&#xff1f;二、数据库概念数据库&#xff08;DataBase&#xff0c;DB&#xff09;数据库管理系统&#xff08;DataBase Management System&#xff0c;DBMS&#xff09;SQL概述 三、数据库存储文件的特点四、MySQL常见的数据对象五、MySQL数据类…

mysql-集群概述

mysql-主从模式 mysql-集群概述 可用性设计 站点高可用&#xff0c;冗余站点服务高可用&#xff0c;冗余服务 数据高可用&#xff0c;冗余数据 保证高可用的方法是冗余。但是数据冗余带来的问题是数据一致性问题 实现高可用的方案有以下几种架构模式&#xff1a; 主从模式 简…

MySQL数据库集群的原理与搭建

【1.应用背景】 在最近做的项目中&#xff0c;因为有一个短时间内很多人访问服务&#xff0c;会频繁访问数据库&#xff0c;看到这里不免有些人会想起数据库集群。我们组长也想到了用数据库集群&#xff0c;于是就带着我们几个研究起来了mysql数据库集群的搭建。因为我们几个的…

MySQL 数据库主从集群搭建

文章目录 1 准备工作2 配置主数据库3 配置从库4 从库设置只读用户5 推荐参考资料 1 准备工作 1 选择一个服务器当做主服务器&#xff0c;将服务器上需要的数据进行备份 2 安装从库的 MySQL&#xff0c;需要与主服务器的版本保持一致 3 将主服务器上的数据同步到从库中(主从集…

MySQL数据库主从集群架构搭建

一、相关概念 二、配置一主一从 三、配置一主多从 四、配置主从从 五、配置主主结构 六、配置半同步复制模式 一、相关概念 1.1 主从同步介绍&#xff1a; 存储数据的服务结构&#xff0c;分为2种角色&#xff1a; 主服务器(master)&#xff1a;接受客户端访问连接 从服务器(sl…

谈谈mysql数据库集群

现在&#xff0c;随着上网人数的激增&#xff0c;一些大型的网站开始使用数据库集群来提高数据库的可靠性和数据库的性能。那么在介绍数据库集群之前首先需要弄清楚几个问题。 1.为什么要用数据库集群 &#xff08;1&#xff09;通过使用数据库集群可以使读写分离&#xff0c;提…

MySQL集群配置

1. MySQL集群简介 MySQL Cluster 是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎&#xff0c;允许在1个 Cluster 中运行多个MySQL服务器。MySQL Cluster 是一种技术&#xff0c;该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。…

MySQL数据库集群(双主双从)

文章目录 MySQL数据库集群(双主双从)实验环境双主双从双主双从进行测试 MySQL数据库集群(双主双从) 实验环境 保证每台centos7服务器配置静态的IP&#xff0c;初始化服务器&#xff0c;关闭防火前和selinux,保证四台服务器之间可以互相通信&#xff0c;并且做好hosts域名解析…

数据库与集群

数据库与集群 1、数据库集群 概念&#xff1a;数据库集群&#xff0c;顾名思义&#xff0c;就是利用至少两台或者多台数据库服务器&#xff0c;构成一个虚拟单一数据库逻辑映像&#xff0c;像单数据库系统那样&#xff0c;向客户端提供透明的数据服务。 数据库集群两个关键定…

数据库-mysql集群方案总结

一 概念解读 1 数据库高可用 高可用指的是&#xff1a;如果数据库发生了宕机或者意外中断等故障&#xff0c;能尽快恢复数据库的 可用性&#xff0c;保证业务不会因为数据库的故障而中断。 另外&#xff0c;数据库高可用还要数据一致性&#xff0c;如下: (1) 用作备份、只读副…

数据库集群

目录 主从复制集群单机数据库的问题单机到集群主从复制传统主从复制异步复制半同步复制 组复制&#xff08;MGR MySQL Group Replication MGR &#xff09; 主从复制演示准备两个MySQL服务实例修改主数据库MySQL_A的my.ini中的[mysqld]配置项下的配置如下修改从数据库MySQL_B的…

MySQL数据库的集群方案

1.简介 我们一般应用对数据库而言都是“读多写少”&#xff0c;也就说对数据库读取数据的压力比较大&#xff0c;有一个思路就是说采用数据库集群的方案&#xff1a; 其中一个是主库&#xff0c;负责写入数据&#xff0c;我们称之为&#xff1a;写库&#xff1b; 其它都是从库&…

MySQL集群解决方案(1):MySQL数据库的集群方案

1、系统架构存在的问题 在我们的系统架构中&#xff0c;DBserver方面我们只是使用了单节点服务&#xff0c;如果面对大并发&#xff0c;海量数据的存储&#xff0c;显然单节点的系统架构将存在很严重的问题&#xff0c;所以接下来&#xff0c;我们将实现MySQL的集群&#xff0c…