springboot:集成flyway

article/2024/12/26 9:33:07

文章目录

  • springboot:集成flyway
    • 一、简介
    • 二、Flyway工作流程
    • 三、配置文件使用Flyway
      • 添加相关配置
      • 创建脚本所在文件夹
      • ==sql脚本命名规范==
      • 启动测试
    • 四、Flyway配置清单
    • 五、maven插件的使用
      • migrate
      • baseline
      • clean(慎用)
      • info
      • repair
      • validate
      • undo
    • 六、flyway知识补充

springboot:集成flyway

一、简介

​ Flyway是一款开源的数据库版本管理工具,他可以很方便的在命令行中使用,或者在java应用程序中引入,用于管理我们的数据库版本。

​ Flyway是一款数据库迁移(migration)工具。简单点说,就是在你部署应用的时候,帮你执行数据库脚本的工具。Flyway支持SQL和Java两种类型的脚本,你可以将脚本打包到应用程序中,在应用程序启动时,由Flyway来管理这些脚本的执行,这些脚本被Flyway称之为migration

二、Flyway工作流程

  1. 项目启动,应用程序完成数据库连接池的建立之后,Flyway自动运行
  2. 初次使用时,Flyway会创建一个flyway_schema_history 表,用于记录sql执行记录
  3. Flyway会扫描项目指定路径下(默认是 classpath:db/migration )的所有sql脚本,与 flyway_schema_history 表脚本记录进行比对。如果数据库记录执行过的脚本记录,与项目中的sql脚本不一致,Flyway会报错并停止项目执行
  4. 如果校验通过,则根据表中的sql记录最大版本号,忽略所有版本号不大于该版本的脚本。再按照版本号从小到大,逐个执行其余脚本

三、配置文件使用Flyway

添加依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>5.1.34</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.2</version></dependency><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>5.2.4</version></dependency>

添加相关配置

spring:# 数据库连接配置datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/flyway-demo?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: rootflyway:# 是否启用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# 执行迁移时是否自动调用验证   当你的 版本不符合逻辑 比如 你先执行了 DML 而没有 对应的DDL 会抛出异常validate-on-migrate: true# 如果没有 flyway_schema_history 这个 metadata 表, 在执行 flyway migrate 命令之前, 必须先执行 flyway baseline 命令# 设置为 true 后 flyway 将在需要 baseline 的时候, 自动执行一次 baselinebaseline-on-migrate: true# metadata 版本控制信息表 默认 flyway_schema_historytable: flyway_schema_history# 指定 baseline 的版本号,默认值为 1, 低于该版本号的 SQL 文件, migrate 时会被忽略baseline-version: 1

创建脚本所在文件夹

根据上面配置文件中的脚本存放路径,我们需要在resource目录下建立文件夹 db/migration

sql脚本命名规范

对于Flyway,对数据库的所有更改都称为变迁(migrations)

  1. 版本变迁(Versioned Migrations): 每个版本执行一次,包含有版本、描述和校验和;常用于创建,修改,删除表;插入,修改数据等
  2. 撤销变迁(Undo Migrations): 版本变迁(Versioned Migrations)的反操作
  3. 可重复变迁(Repeatable Migrations): 可以执行多次,包含描述和校验和(没有版本);主要用于视图,存储过程,函数等

在这里插入图片描述

  • 前缀: V 代表版本变迁(Versioned Migrations), U 代表撤销变迁(Undo Migrations), R 代表可重复变迁(Repeatable Migrations)
  • 版本号: 唯一的版本号,比如V1.0.1
  • 分隔符: __ (两个下划线)
  • 描述信息: 描述信息
  • 后缀: .sql

sql的执行顺序

Flyway是采用了采用左对齐原则, 缺位用 0 代替,根据版本好来判断那个sql先执行

1.0.1.11.0.1 版本高。
1.0.101.0.9.4 版本高。
1.0.101.0.010 版本号一样高, 每个版本号部分的前导 0 会被忽略

仅需要被执行一次的SQL命名以大写的"V"开头,V+版本号(版本号的数字间以”.“或”_“分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名。例如: V20201100__create_user.sqlV2.1.5__create_user_ddl.sqlV4.1_2__add_user_dml.sql

可重复运行的SQL,则以大写的“R”开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。(不推荐使用)比如:R__truncate_user_dml.sql

其中,V开头的SQL执行优先级要比R开头的SQL优先级高

启动测试

三个文件如下:

V1__create_user.sql

CREATE TABLE IF NOT EXISTS `user`
(`USER_ID`      INT          NOT NULL AUTO_INCREMENT,`USER_NAME`    VARCHAR(100) NOT NULL COMMENT '用户姓名',`AGE`          INT          NOT NULL COMMENT '年龄',`CREATED_TIME` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,`CREATED_BY`   varchar(100) NOT NULL DEFAULT 'UNKNOWN',`UPDATED_TIME` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,`UPDATED_BY`   varchar(100) NOT NULL DEFAULT 'UNKNOWN',PRIMARY KEY (`USER_ID`)) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;

V2__add_user.sql

insert into `user`(user_name,age) values('lisi',33);

V3__add_user.sql

insert into `user`(user_name,age) values('lisi2222',33);

R__add_unknown_user.sql

insert into `user`(user_name,age) values('unknown',33);

在这里插入图片描述

查看mysql中Flyway的版本控制信息表

在这里插入图片描述

在这里插入图片描述

这里我们修改V3__add_user.sql文件他就会出现错误

[ERROR] Migration checksum mismatch for migration version 2

如果我们修改R__add_unknown_user.sql然后再次执行,该脚本会再次执行,并且flyway的历史记录表中也会增加本次执行的记录

四、Flyway配置清单

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.tableflyway使用的元数据表名,默认为schema_version
flyway.target迁移时使用的目标版本,默认为latest version
flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
flyway.user迁移数据库的用户名
flyway.validate-on-migrate迁移时是否校验,默认为true

五、maven插件的使用

上面的操作,每次我们想要migration都需要运行整个springboot项目,并且只能执行migrate一种命令,其实flyway还是有很多其它命令的,maven插件给了我们不需要启动项目就能执行flyway各种命令的机会。

    <build><plugins><plugin><groupId>org.flywaydb</groupId><artifactId>flyway-maven-plugin</artifactId><version>5.2.4</version><configuration><url>jdbc:mysql://localhost:3306/flyway-demo?characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai</url><user>root</user><password>root</password><driver>com.mysql.jdbc.Driver</driver></configuration></plugin></plugins></build>

在这里插入图片描述

migrate

Migrate是指把数据库Schema迁移到最新版本,是Flyway工作流的核心功能,Flyway在Migrate时会检查Metadata(元数据)表,如果不存在会创建Metadata表,Metadata表主要用于记录版本变更历史以及Checksum之类的

baseline

Baseline针对已经存在Schema结构的数据库的一种解决方案,即实现在非空数据库中新建Metadata表,并把Migrations应用到该数据库。

Baseline可以应用到特定的版本,这样在已有表结构的数据库中也可以实现添加Metadata表,从而利用Flyway进行新Migrations的管理了

clean(慎用)

Clean相对比较容易理解,清除掉对应数据库Schema中所有的对象,包括表结构,视图,存储过程等,clean操作在dev 和 test阶段很好用,但在生产环境务必禁用

info

Info用于打印所有Migrations的详细和状态信息,其实也是通过Metadata表和Migrations完成的,Info能够帮助快速定位当前的数据库版本,以及查看执行成功和失败的Migrations。下图很好地示意了Info打印出来的信息

repair

repair操作能够修复Metadata表,该操作在Metadata表出现错误时是非常有用的

validate

Validate是指验证已经Apply的Migrations是否有变更,Flyway是默认是开启验证的。

Validate原理是对比Metadata表与本地Migrations的Checksum值,如果值相同则验证通过,否则验证失败,从而可以防止对已经Apply到数据库的本地Migrations的无意修改

undo

撤销操作,社区版不支持

六、flyway知识补充

  • flyway执行migrate必须在空白的数据库上进行,否则报错
  • 对于已经有数据的数据库,必须先baseline,然后才能migrate
  • clean操作是删除数据库的所有内容,包括baseline之前的内容
  • 尽量不要修改已经执行过的SQL,即便是R开头的可反复执行的SQL,它们会不利于数据迁移
  • 当需要做数据迁移的时候,更换一个新的空白数据库,执行下migrate命令,所有的数据库更改都可以一步到位地迁移过去

http://chatgpt.dhexx.cn/article/0eNqohEi.shtml

相关文章

Firefly

Firefly(流萤): 中文对话式大语言模型在本文中&#xff0c;笔者将介绍关于Firefly&#xff08;流萤&#xff09;模型的工作&#xff0c;一个中文对话式大语言模型。https://mp.weixin.qq.com/s/TX7wj8IzD_EaMTvk0bjRtA一个支持中文的176B开源基础模型BLOOM&#xff1a;从数据源…

RIP 水平分割

水平分割 为了防止环路,RIP引入了水平分割机制,即从一个接口收到的路由更新,不会再从这个接口发出去,水平分割默认开启. 实验&#xff1a;RIP的水平分割 首先我们先查看R1和R3的路由表有什么异常

RIP水平分割实验

华为RIP水平分割实验 为了防止环路&#xff0c;BIP引入了水平分割机制&#xff0c;即从一个接口收到得路由更新&#xff0c;不会在从这个接口发出去&#xff0c;水平分割默认开启 实验拓补图如下 首先配置R1 system view [Huawei]sysname R1 [R1]int g0/0/0 [R1-Gigabi…

路由协议BGP之打破IBGP水平分割✍

为什么需要打破IBGP的水平分割&#xff1f; 因为IBGP水平分割&#xff0c;导致在一个AS内部若一台BGP路由器需要将通过其他AS学习到的路由传递给本地AS中的ibgp邻居时&#xff0c;需要和本地AS内部所有的BGP设备建立IBGP邻居关系&#xff1b;邻居关系数量成指数上升&#xff1…

解决IBGP的水平分割和BGP选路原则

解决IBGP的水平分割问题 IBGP水平分割&#xff1a;防止环路的产生 方法1&#xff1a;路由反射器(RR) 路由反射器可以反射所学习到的IBGP路由信息。 指定一台路由器称为 路由反射器&#xff08;RR&#xff09; 的时&#xff0c;必须在他的IBGP对等体关系中选择一个或者多个设备…

html中怎么接着水平线后面,html水平分割线怎么设置?html水平分割线的代码示例讲解...

在前端网页的开发中我们有时候需要用到水平分割线来分割不同的文档&#xff0c;会让整个网页看起来美观和整洁&#xff0c;也会凸显某一段文字的重要性&#xff0c;那么网页中水平分割线该如何实现呢&#xff1f; 本篇文章就给大家来分享一下html水平分割线的实现方法。 在html…

基于WPS的Word最佳实践系列(给标题添加水平分割线)

基于WPS的Word最佳实践系列&#xff08;给标题添加水平分割线&#xff09; 项目背景 在日常办公中&#xff0c;我们经常需要给标题添加一条水平分割线&#xff0c;将标题与正文内容分开&#xff0c;那么如何快速添加水平分割线呢&#xff1f; 项目实施 1. 添加水平分割线 …

5.2 BGP水平分割

5.2.2实验2&#xff1a;BGP水平分割 1. 实验目的 熟悉BGP水平分割的应用场景掌握BGP水平分割的配置方法 2. 实验拓扑 实验拓扑如图5-2所示&#xff1a; 图5-2&#xff1a;BGP水平分割 3. 实验步骤 &#xff08;1&#xff09;配置IP地址 R1的配置 <Huawei&g…

图像分割之水平集(Level Set)分割

几何活动轮廓模型——水平集分割&#xff1a;Active Contours Without Edges 水平集方法 水平集是跟踪轮廓和表面运动的一种数字化方法&#xff0c;它不直接对轮廓进行操作&#xff0c;而是将轮廓设置成一个高维函数的零水平集。这个高维函数叫做水平集函数。然后对该水平集函数…

BGP选路——本地优先级选路(+BGP路由水平分割机制)

目录 一、本地优先级特性 二、配置命令&#xff1a; 三、图解&#xff1a; 四、BGP路由水平分割机制 BGP路由13条选路顺序&#xff1a; 权重——本地优先级——本地始发——最短AS-PATH——起源属性——MED属性——EBGP路由优于IBGP——八——九——十——十一——十二——…

html文字段落分割,HTML设置水平分割线_html/css_WEB-ITnose

在Web中使用水平分割线可以分割不同的文字段落或者其它网页组件&#xff0c;轻松地修饰了段落排版&#xff0c;使之更美观。当然&#xff0c;水平分割线还可以更加明显地突出某一段重要的文字&#xff0c;使之更加醒目。 使用标签可以轻松地设置一条水平线。方法如下&#xff1…

初步了解BGP-2【update-source、水平分割、同步概念】

初步了解BGP-2【update-source、水平分割、同步概念】 目录 初步了解BGP-2【update-source、水平分割、同步概念】Update-sourceIBGP 水平分割IBGP与IGP的同步 Update-source 由于BGP无法像IGP那样自动发现邻居&#xff0c;而BGP的邻居需要手动指定邻居&#xff0c;一般情况下…

html分割线颜色怎么在css中写,html水平分割线 html 分割线颜色怎么变浅

深入理解es6和es6标准入门哪本好 Dubbo的分布式系统架构实战需要哪些步骤完成 HTML如何添加水平分割线: HTML提供了修饰段落的水平分割线&#xff0c;在很多的网页布局中都可以轻松使用&#xff0c;而不需要另外作图。水平分割线的标签是单标签&#xff1a; 默认情况下只占一行…

水平集分割

基于距离正则的水平集分割MATLAB代码&#xff0c;无需初始化 % This Matlab code demonstrates an edge-based active contour model as an application of % the Distance Regularized Level Set Evolution (DRLSE) formulation in the following paper: % % C. Li, C. X…

图像分割 - 水平集算法

水平集介绍 水平集分为三种&#xff1a; 1 . 基于图像边缘灰度梯度信息 &#xff0c;适用于边缘强的图像分割 2 . 基于区域特征 &#xff0c;利用区域信息引导曲线慢慢靠近 &#xff0c;比如分割曲线区域的内外灰度均值&#xff0c;分割曲线内部区域面积&#xff08;例如 Ch…

IBGP水平分割

IBGP水平分割规则 IBGP水平分割用于在IBGP对等体之间进行路由传递时&#xff0c;无法像EBGP对等体那样一来AS-Path属性进行防止环路的问题&#xff0c;因为AS-Path属性在AS内进行传递时是不会发生改变的。 下图便是极有可能出现IBGP对等体环路的场景&#xff1a; R1将10.1.1.…

垂直分割和水平分割

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0c;水平分割&#xff1a; 例&#xff1a;QQ的登录表。假设QQ的用户有100亿&#xff0c;如果只有一张表&#xff0c;每个用户登录的时候数据库都要从这100亿中查找&#xff0c;会很慢很慢。如果将这一张表分成1…

RIP的水平分割及触发更新(超详细,小白基础实验)

RIP的水平分割及触发更新 希望有需要的小伙伴可以参考参考&#xff0c;写的不好&#xff0c;请多包涵&#xff01; 基本概念&#xff1a; 1&#xff1a;水平分割&#xff08;Split Horizon&#xff09;指的是RIP从某个接口接收到的路由信息&#xff0c;不会从该接口再发给邻居…

分库分表的垂直分割与水平分割

1、垂直分库 根据业务耦合性&#xff0c;将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似&#xff0c;按业务分类进行独立划分。与“微服务治理”的做法相似&#xff0c;每个微服务使用单独的一个系统。如图&#xff1a; 2、垂直分表 基于数据表中的…

一起聊聊 dB、dB、dBm、dBi 吧!

点击上方“小麦大叔”&#xff0c;选择“置顶/星标公众号” 福利干货&#xff0c;第一时间送达 dB应该是无线通信中最基本、最习以为常的一个概念了。我们常说“传播损耗是xx dB”、“发射功率是xx dBm”、“天线增益是xx dBi”……有时候&#xff0c;这些长得很像的dBx们可能被…