flyway的快速入门教程

article/2025/11/10 10:11:25

目录

一、简单介绍

二、为什么要使用flyway

三、flyway是如何工作的

四、如何使用flyway

1、先要初始化一个SpringBoot项目,引入依赖

2、在application.yml中添加相关配置

3、根据配置文件中填写的脚本存放路径,创建文件夹

4、添加需要运行的sql脚本。sql脚本的命名一定要规范,否则运行flyway会报错

5、启动项目, 通过flyway执行定义好的脚本

6、提示说明

五、maven插件的使用

1、配置插件

2、插件命令说明

六、flyway知识补充

七、flyway配置清单


一、简单介绍

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

  在项目或产品中,很难一开始就把业务理清楚,把数据库表设计好,因此数据表也会在迭代周期不断迭代。在Java应用程序中使用Flyway,能快速有效地用于迭代数据库表结构,并保证部署到测试环境或生产环境时,数据表都是保持一致的。

flyway官方文档https://flywaydb.org/documentation/

二、为什么要使用flyway

在多人开发的项目中,我们都习惯了使用SVN或者Git来对代码做版本控制,主要的目的就是为了解决多人开发代码冲突和版本回退的问题。

其实,数据库的变更也需要版本控制,在日常开发中,我们经常会遇到下面的问题:

  1. 自己写的SQL忘了在所有环境执行。
  2. 别人写的SQL我们不能确定是否都在所有环境执行过了。
  3. 有人修改了已经执行过的SQL,期望再次执行。
  4. 需要新增环境做数据迁移。
  5. 每次发版需要手动控制先发DB版本,再发布应用版本。
  6. 其它场景。

有了flyway,这些问题都能得到很好的解决。

三、flyway是如何工作的

flyway工作流程如下:

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

四、如何使用flyway

注:以下为本篇文章内容对应源码,可以自行下载测试,仅需要修改对应的数据库账号密码配置即可。如果对您有帮助,麻烦帮我点个赞或者star,你的鼓励,就是我更新的动力。
flyway使用示例代码https://github.com/wangming2674/flyway-use-demo

1、先要初始化一个SpringBoot项目,引入依赖

我使用的版本是2.3.5.RELEASE,引入mysql、mybatis、flyway等依赖,pom.xml文件内容如下:

    <properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><mysql.version>8.0.25</mysql.version><mybatis-starter.version>2.2.1</mybatis-starter.version><flyway.version>6.1.0</flyway.version></properties><dependencies><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>${mysql.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis-starter.version}</version></dependency><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>${flyway.version}</version></dependency></dependencies>

2、在application.yml中添加相关配置

spring:# 数据库连接配置datasource:driver-class-name: com.mysql.cj.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# 迁移时是否进行校验,默认truevalidate-on-migrate: true# 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表baseline-on-migrate: true

3、根据配置文件中填写的脚本存放路径,创建文件夹

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

4、添加需要运行的sql脚本。sql脚本的命名一定要规范,否则运行flyway会报错

命名规则主要有两种:

  1. 仅需要被执行一次的SQL命名以大写的"V"开头,V+版本号(版本号的数字间以”.“或”_“分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名。例如:  V20201100__create_user.sql、V2.1.5__create_user_ddl.sql、V4.1_2__add_user_dml.sql  。
  2. 可重复运行的SQL,则以大写的“R”开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。(不推荐使用)比如: R__truncate_user_dml.sql 。

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

创建完成后,目录应如下所示:

其中2.1.6、2.1.7和every的文件夹不会影响flyway对SQL的识别和运行,可以自行取名和分类。

5、启动项目, 通过flyway执行定义好的脚本

在控制台可以看到相关日志打印,并在数据库中查看到已经创建好的表和相关记录变更。

6、提示说明

 如果我们修改V2__add_user.sql中的内容,再次执行的话,就会报错,提示信息如下:

   [ERROR] Migration checksum mismatch for migration version 2 

  如果我们修改了R__add_unknown_user.sql,再次执行的话,该脚本就会再次得到执行,并且flyway的历史记录表中也会增加本次执行的记录。 

五、maven插件的使用

1、配置插件

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

在pom.xml中引入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.cj.jdbc.Driver</driver></configuration></plugin></plugins></build>

2、插件命令说明

此时,我们双击执行上图中的flyway:migrate的效果和启动整个工程执行migrate的效果是一样的。

其它命令的作用如下:

  1. baseline

    对已经存在数据库Schema结构的数据库一种解决方案。实现在非空数据库新建MetaData表,并把Migrations应用到该数据库;也可以在已有表结构的数据库中实现添加Metadata表。

  2. clean

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

  3. info

    用于打印所有的Migrations的详细和状态信息,也是通过MetaData和Migrations完成的,可以快速定位当前的数据库版本。

  4. repair

    repair操作能够修复metaData表,该操作在metadata出现错误时很有用。

  5. undo

    撤销操作,社区版不支持。

  6. validate

    验证已经apply的Migrations是否有变更,默认开启的,原理是对比MetaData表与本地Migrations的checkNum值,如果值相同则验证通过,否则失败。

六、flyway知识补充

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

七、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


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

相关文章

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…

C语言回调函数详解及实例

C语言回调函数详解及实例 回调函数&#xff1a;函数 F1 调用函数 F2 的时候&#xff0c;函数 F1 通过参数给函数 F2 传递了另外一个函数 F3 的指针&#xff0c;在函数 F2 执行的过程中&#xff0c;函数F2 调用了函数 F3&#xff0c;这个动作就叫做回调&#xff08;Callback&…

回调函数

什么是回调函数? 有以下三点 1、自己创建的函数&#xff1b; 2、没有调用&#xff1b; 3、但是函数执行了&#xff08;在某个条件下&#xff09;。 例如&#xff1a; 1.定时器函数 var a 1setItercal( function(){aconsole.log(a)},1000)//延时器var a 1setTimeout( functi…

C++中回调函数的一个简单例子?

回调函数应用实例&#xff1a; 1、定义一个Person类 &#xff08;Person.h&#xff09;文件&#xff1a; 注意&#xff1a;在这个类中指定了回调函数&#xff0c;回调函数的执行者&#xff0c;和回调函数指针 重要的是 回调函数和回调函数指针是怎么关联的&#xff1f; 2、…

一个简单的jQuery回调函数例子

欢迎扫码加入Java高知群交流 jQuery回调函数简单使用 比如说&#xff0c;我们想要点击某个按钮后触发事件&#xff0c; 先把一些指定内容给隐藏掉&#xff0c; 然后跳出相关信息的对话框。 如果使用普通的方法&#xff0c; 不用回调函数的话&#xff0c; 会有怎么样的效…

【C语言】回调函数

目录 前言 一、回调函数是什么&#xff1f; 二、使用步骤 1.举例 2.库函数中的例子 3.模拟实现qsort()函数 前言 随着我们对C语言的学习以及对指针更加深入的了解&#xff0c;我们避免不了接触到回调函数&#xff0c;以下是关于回调函数的知识分享。 一、回调函数是什么…