SpringBoot集成Flyway

article/2025/11/10 9:12:43

1. 背景

  • Flyway是一个款数据库版本管理工具,通过集成Flyway可以实现启动项目时自动执行项目迭代升级所需Sql语句,从而减少升级项目时人工干预成本.

2. 集成Flyway

  • pom文件引入依赖
<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>8.0.5</version>
</dependency>
  • resources下新建/db/migration文件夹,用于存放脚本文件
# 迁移脚本的位置,默认:db/migration,可通过该配置指定脚本文件位置 
spring.flyway.locations

在这里插入图片描述

  • 添加application.yml配置信息
#  开启自动创建flyway元数据表标识 默认: false
spring.flyway.baseline-on-migrate=true

3. 文件名规范

格式: V + 版本号 + __ (双下划线) + 描述.sql
在这里插入图片描述

  • Eg:
    • 版本升级: V1_2_0__upgrade.sql
    • BUG修复: V1_2_0_20220816__hotfix.sql
  • 规则说明:
    • 前缀分隔符
      • V: 版本化迁移 (使用)
        • 默认V开头 (可配置)
        • V(大些),小些不执行
      • R: 可重复迁移 (不使用)
        • 新增或追加脚本时再次执行该文件所有脚本(包括历史sql)
        • 历史sql脚本不可更改
        • 不需要指定脚步版本
      • U: 撤销迁移 (不使用)
        • 编写各版本对应撤销版本脚步
        • 需要通过Flyway客户端执行撤销命令,执行最近一次版本撤销
        • 撤销场景较复杂,建议版本升级前进行DB备份,实现撤销
    • SQL脚本版本
      • 2_1为sql版本号, ‘_’ 翻译为小数点,即为2.1版本
      • 新建脚本,版本只可递增
      • 不可使用V1作为版本号
    • 分隔符
      • ‘__’ 双下划线 (可配置)
    • SQL脚本名描述(待定)
      • 多个单词用下划线或空格将单词分开
      • 版本化升级: upgrade
      • BUG修复: hotfix
    • .sql为固定后缀

4. 脚本规范

每条sql语句要给到明确注释, 并标明添加该sql对应时间方便后期维护

  • 各sql语句需用分号‘;’结尾
  • 已运行脚本文件内sql不可修改
  • sql需满足可重复执行: 解决新环境重新部署执行sql问题
  • Eg:
-- 新增基础数据-物料主数据表 2022.08.16
CREATE TABLE IF NOT EXISTS `material_test` (`id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键',`code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '此物料的编码,自然键',`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '物料名称',`specification` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '规格',`type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '物料的类型。',`unit` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '默认的计量单位',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='基础数据-物料主数据';
-- 添加初始化物料数据 2022.08.17
INSERT IGNORE INTO `material_test` (`id`, `code`, `name`, `specification`, `type`, `unit`) VALUES ('104a3ebc-325e-4d50-8ad4-66e6987d5f82', 'a', 'A物料', NULL, '01', 'kg');
INSERT IGNORE INTO `material_test` (`id`, `code`, `name`, `specification`, `type`, `unit`) VALUES ('104a3ebc-325e-4d50-8ad4-66e6987d5f84', 'b', 'B物料', NULL, '04', 'g');

5. 可重复性

  • 建表语句: CREATE TABLE IF NOT EXISTS
  • insert语句: INSERT IGNORE INTO
  • update/delete数据语句: 默认可重复执行
  • 无法重复执行语句,需使用存储过程做判断是否需要执行该语句
  • Eg:
-- 通过存储过程满足可重复执行sql
DROP PROCEDURE IF EXISTS initSql;
DELIMITER &&
CREATE PROCEDURE initSql()BEGIN-- 添加执行sql区域-- 物料表添加更新时间字段 2022.08.17if not exists(select * from information_schema.COLUMNS where table_name='material_test'and column_name ='update_time')thenALTER TABLE `material_test` ADD COLUMN `update_time` datetime NULL COMMENT '更新时间' AFTER `unit`;end if;-- 物料表删除单位字段 2022.08.18if exists(select * from information_schema.COLUMNS where table_name='material_test'and column_name ='unit')thenalter table `material_test` drop column `unit`;end if;-- 结束END;&&
DELIMITER ;
CALL initSql();
DROP PROCEDURE initSql;

6. 占位符

 配置占位符(可自定义多个占位符) 
# 自定义占位符: myParam
# 自定义参数值: value
spring.flyway.placeholders.myParam=value
  • Eg:
    在这里插入图片描述在这里插入图片描述

7. 元数据表

 开启flyway.baseline-on-migrate配置后,启动项目会自动初始化表: flyway_schema_history
# 可通过该配置指定初始化元数据表名, 默认: flyway_schema_history
spring.flyway.tableflyway= 

- 表字段描述
字段
描述
installed_rank
脚本是第几个执行的,一个顺序自增的整数
version
脚本文件名中版本号
description
脚本文件名中双下划线后的描述内容
type
脚本类型 sql脚本显示为 SQL, java脚本显示为 JDBC
script
配置的脚本文件名,sql有后缀,java没有后缀checksum
校验和。用于检测意外的更改
installed_by
脚本执行人 (配置的数据库用户)in

8. 可能问题

  1. V开头脚本,执行后不可修改,修改会导致启动项目时Flyway检测不通过,导致项目启动失败
  2. 开发测试阶段需修改已执行脚本,可通过删除相关flyway_schema_history表元数据后,重启项目
  3. 脚本命名不规范,导致脚本未被执行
  4. 没有使用V(大些)开头
  5. 使用V1作为版本号
    (原因: 初始化Flyway元数据表时,也会记录一条记录,已占用版本号V1,个人定义脚本以V1作为版本号会导致该脚本不执行)
  6. 脚本文件名版本和描述之间没有使用双下滑线‘__’分割
  7. 新增脚本,版本号没有大于已有版本号
    (原因: Flyway执行是通过版本号判断执行顺序,不符合该规则,会导致启动项目时Flyway检测不通过,导致项目启动失败)
  8. 各sql语句要以分号‘;’结尾,忘记用分号会导致sql执行失败
  9. sql语句不满足可重复执行,新环境执行sql导致失败

9. 问题排查

  • 启动日志查看定位报错脚本文件和Message
    [图片]
  • Flyway元数据表也会记录报错脚本文件名
    在这里插入图片描述

10. 配置说明

flyway.baseline-description对执行迁移时基准版本的描述.
flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
flyway.check-location检查迁移脚本的位置是否存在,默认false.
flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
flyway.enabled是否开启flywary,默认true.
flyway.encoding设置迁移时的编码,默认UTF-8.
flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
flyway.init-sqls当初始化好连接时要执行的SQL.
flyway.locations迁移脚本的位置,默认db/migration.
flyway.out-of-order是否允许无序的迁移,默认false.
flyway.password目标数据库的密码.
flyway.placeholder-prefix设置每个placeholder的前缀,默认${.
flyway.placeholder-replacementplaceholders是否要被替换,默认true.
flyway.placeholder-suffix设置每个placeholder的后缀,默认}.
flyway.placeholders.[placeholder name]设置placeholder的value
flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
flyway.sql-migration-prefix迁移文件的前缀,默认为V.
flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__.
flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql.
flyway.table使用的元数据表名,默认为flyway_schema_history.
flyway.target迁移时使用的目标版本,默认为latest version.
flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源.
flyway.user迁移数据库的用户名.
flyway.validate-on-migrate迁移时是否校验,默认为true.

http://chatgpt.dhexx.cn/article/10FwU9kv.shtml

相关文章

Flyway介绍和使用

一 使用背景 在我们日常产品发布的过程中&#xff0c;代码的版本控制可以使用git、svn工具实现。对于数据库每当发布时会出现手动执行sql脚本进行升级数据库&#xff0c;中间经常出现一些漏写、错写情况&#xff0c;对数据库的版本与代码的版本不匹配&#xff0c;导致上线后出…

Flyway简介

Flyway简介 总结&#xff1a;Flyway可以很方便的帮我们完成数据库部署和增量升级&#xff0c;很有用&#xff0c;但是版本回滚操作并不给力&#xff5e;&#xff5e;&#xff5e; 1、简介 1.1、Flyway是什么 Flyway是一款数据库迁移&#xff08;migration&#xff09;工具。简…

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

目录 一、简介 二、核心概念 1、Schema History Table 2、Migration 3、Versioned migrations 三、集成 SpringBoot 1、pom文件中引入依赖 2、application.yml配置 3、sql 脚本编写 四、初始化数据库 五、注意事项 一、简介 Flyway是一款开源的数据库版本管理工具&am…

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) 用作备份、只读副…