flyway(数据库迁移工具)

article/2025/10/25 6:49:43

系列文章目录

主要是用来记录每次迭代的版本sql的表结构的变动.在部署某个版本时,能够快找到这个版本对应的sql,避免出现表结构的错误

Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。


文章目录

  • 系列文章目录
  • 一、flyway是什么?
    • 相关链接
  • 二、使用
    • 1.准备
    • 2.命令
    • 3.使用实例
      • 流程1
      • 流程2
  • 三、问题


一、flyway是什么?

flyway是一个数据库迁移工具.使用version来记录每一次脚本的执行.

相关链接

官网链接

文档链接:
flyway使用
简书flyway使用教程
原理
flyway中文教程

二、使用

1.准备

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

yml配置

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.

Spring Boot 将会自动管理Flyway的启动和运行。然后Flyway会默认在你的项目的CLASSPATH路径下的db/migration目录下(在我们的项目一般就是src/main/resources/db/migration里面)查找SQL脚本。将你的SQL脚本写完然后放入此路径下后就可以运行你的项目,Spring会自动创建Flyway的Bean来处理你的脚本。

2.命令

官方api

  1. Migrate(迁移):将schema更新到最新的版本并且如果不存在flyway_schema_history表就会创建一个。
    它是flyway工作流程的核心。它将扫描文件系统或您的类路径以获取可用的迁移。它将它们与已应用于数据库的迁移进行比较,如果发现任何差异,它将迁移数据库以缩小差距。
  2. clean(删除):删除已配置的schema中所有对象,当然,不要对生产DB操作,毕竟有点类似删库跑路。。。
  3. info(信息):打印所有的Migration的信息,包含状态,通过info可以知道哪些Migration已经应用了,哪些处于pending状态
  4. Validate(验证):验证将要更新的migrations是否与已更新的migration有冲突,有点类似于代码合并时git会检查是否有冲突
  5. Undo(撤销):撤消最近应用的版本迁移。可指定撤销的最终版本。
  6. BaseLine(基准线):相对于Migrate来说,它不再是从最初开始迁移,而是先将某数据库作为基准线,然后迁移相对此数据库还未更新的migrations
  7. repaire(修复):修复flyway_schema_history表

3.使用实例

流程1

1、将flyway-core-2.3.jar放到项目lib中,下载地址:http://flywaydb.org/getstarted/download.html

2、在src目录下建立保存sql版本文件的路径:src/db/migration,flyway默认查找路径,可以改,但没必要。
在这里插入图片描述

3、在sql版本文件路径中增加sql文件,命名规则,如:V1__2014_4_13.sql ,V开头+版本号+双下划线+描述,描述中可以有下划线,后缀为sql。别问能不能修改这个规则,否则,我咬你。

4、增加flyway的java类,有命令行工具,但还是java类用起来方便,如下:


package com.cms.flyway;import java.io.IOException;
import java.util.Properties;import com.googlecode.flyway.core.Flyway;public class FlywayApp {// 读取数据库配置参数private static Properties config = new Properties();static {try {config.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("activerecord.properties"));} catch (IOException e) {e.printStackTrace();}}// 执行数据库版本升级public static void migration() {// Create the Flyway instanceFlyway flyway = new Flyway();// Point it to the databaseflyway.setDataSource(config.getProperty("com.et.ar.ActiveRecordBase.url"), config.getProperty("com.et.ar.ActiveRecordBase.username"), config.getProperty("com.et.ar.ActiveRecordBase.password"));flyway.setInitOnMigrate(true);// Start the migrationflyway.migrate();}
}

5、在服务器启动的时候或者定时器 执行该类的migration()方法即可。

6、第一次执行会生成一个专门存放数据库schema_version的表

在这里插入图片描述

7、以后数据库有了新的改动,导出新版本sql文件(如:mysqldump -u -p databasename>/xx.sql)改为新版本命名文件放到db.migration路径下,flyway会自动帮你更新数据库版本的。

流程2

流程
1、 首先配置好flyway的基本信息后,运行项目,会在数据库表中默认新建一个数据表用于存储flyway的运行信息,默认的数据库名:flyway_schema_history

2、 紧接着Flyway将开始扫描文件系统或应用程序的类路径进行迁移。然后,Flyway的数据迁移将基于对用sql脚本的版本号进行排序,并按顺序应用:

可以看到执行数据库表后在checksum中储存一个数值,用于在之后运行过程中对比sql文件执行是否有变化。

注意:
flyway在执行脚本时,会在源数据表中检查checksum值,并确定上次运行到哪一个脚本文件,本次执行时从下一条脚本文件开始执行。所以编写脚本的时候不要去修改原有的脚本内容,并且新的脚本版本号要连续

集成SpringBoot
1.添加依赖

<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.1.1</version>
</dependency>添加插件:
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>5.1.1</version>
</plugin>

2.命名规范
sql 脚本存放目录:src/main/resources/db/migration
对应一个程序版本的多个脚本,从1开始,比如1.0.9版本,有多个任务:张三负责a任务(tapd号为1111111),李四负责b任务(tapd号为222222),他们的任务都涉及到db更新他们会分别创建两个脚本:
V1.0.9.0.1__1111111.sql
V1.0.9.0.2__222222.sql
说明:V大写,中间是两个下划线(__)

三、问题

1、可以基于环境变量,实现不同的环境,做不同的初始化脚本吗?
基于我们的配置中 心,可以对flyway.locations配置进行修改,不同环境的初始化脚本可以放到不同的目录下。

2、初始化数据过程会发生错误回滚?
每 一个sql 文件会有 一个单独的事物,如果单个文件中发 生错误,单个文件的操作会回滚, 比如有1、2、3个 文件,第 二个文件发生错误,第二个文件所有操作将会回滚,第三个文件不会执行。但: Unfortunately, today only DB2, PostgreSQL, Derby, EnterpriseDB and to a certain extent SQL Server support DDL statements inside a transaction。 所以,建议不要把ddl 文件和dml语句句放到同 一个文件 里,避免不必要的麻烦。

3、多个节点能够并行执行migration吗?
当然可以!Flyway使用数据库锁机制(locking technology of your database)来协调多个节点,从而保证多套应用程序可同时执行migration,而且集群控制也可做配置。



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

相关文章

在线数据迁移

在线数据迁移&#xff0c;是指将正在提供线上服务的数据&#xff0c;从一个地方迁移到另一个地方&#xff0c;整个迁移过程中要求不停机&#xff0c;服务不受影响。根据数据所处层次&#xff0c;可以分为 cache 迁移和存储迁移&#xff1b;根据数据迁移前后的变化&#xff0c;又…

数据迁移软件|如何将旧电脑的数据传输到新电脑?

小编最近换了台新电脑&#xff0c;需要将旧电脑的文件都转移过去&#xff0c;但是旧电脑上大文件不少&#xff0c;不管是上传到网盘再下载&#xff0c;还是通过QQ或微信在线传输&#xff0c;速度都很慢&#xff0c;且步骤太复杂。相信很多小伙伴也和小编一样遇到过这个问题&…

2023最值得推荐的电脑数据迁移方法,一键转移文件和程序

没有什么比拥有一台新电脑更令人兴奋的了。这意味着您可以使用大量新功能、更强大的功能、更好的显示器和更多存储空间。但是&#xff0c;如果您需要将文件、数据从旧计算机传输到新计算机&#xff0c;或者再新电脑上安装新的程序&#xff0c;那么这种兴奋可能会有所减弱。因为…

各种数据库之间数据迁移工具

前阶段需要把sqlserver上的数据迁移到mysql上&#xff0c;找到了非常好用的工具DB2DB。 下载地址&#xff1a;http://www.szmesoft.com/DB2DB DB2DB 是目前经过测试速度最快、最稳定实现多种数据库之间进行数据转换的工具。支持 SQL Server、MySQL、SQLite、Access 等多种数据…

可视化数据同步迁移工具 CloudCanal

CloudCanal 介绍 CloudCanal 是一款数据迁移同步工具&#xff0c;提供友好的可视化操作界面&#xff0c;支持多种数据源间的数据迁移、数据同步、结构迁移、数据校验。 CloudCanal 核心团队成员来自阿里巴巴中间件和数据库团队, 长期从事分布式数据库、数据库中间件、应用中间…

数据的迁移工具

数据的迁移工具 逻辑导出导入工具&#xff1a;exp ----逻辑导出工具 imp ----逻辑导入工具 数据导出模式&#xff1a; 全库导出 --full 先新建一个用来导出导入的目录 mkdir -p /home/oracle/backup/exp 进入该目录 cd /home/oracle/backup/exp 用语句导出 exp \ s…

电脑数据传输/数据迁移下载哪款软件好?

买了新电脑要重新安装应用程序&#xff1f;旧电脑的数据要迁移到新电脑&#xff1f;文件太多传输速度慢&#xff1f;就没有什么办法是可以一次性解决这些问题的吗&#xff1f;答案当然是有&#xff01;我们可以借助专业的电脑数据传输/数据迁移软件来完成&#xff01;那么究竟数…

数据迁移工具(数据库之间进行数据库迁移所使用的工具及迁移流程。)

总流程图&#xff1a; 以下为mysql&#xff0c;oracle&#xff0c;瀚高&#xff08;highgo&#xff09;&#xff0c;金仓&#xff08;kingbase&#xff09;&#xff0c;达梦&#xff08;DM8&#xff09;数据库之间进行数据库迁移所使用的工具及迁移流程。 1.KingBase Explore…

硬盘数据迁移软件哪款好用?强烈推荐它!

硬盘数据迁移软件哪款好用&#xff1f;现如今&#xff0c;将一块硬盘的数据完整迁移克隆到另一块硬盘已经不是什么技术难题&#xff0c;市面上形形色色的硬盘数据迁移软件也不少&#xff0c;但是到底哪款好用呢&#xff1f;小编在试过多款硬盘数据迁移软件之后&#xff0c;综合…

8款数据迁移工具选型,主流且实用

前言&#xff1a;ETL(是Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程)&#xff0c;对于企业应用来说&#xff0c;我们经常会遇到各种数据的处理、转换、迁移的场景。今天特地给大家汇总了一些目前市面上比较常用的ETL数据迁移工具&#xff0c;希望对…

数据迁移方案

一、数据迁移背景 问题场景&#xff1a; 现在有一个未分库分表的系统&#xff0c;未来要分库分表&#xff0c;如何设计才可以让系统从未分库分表动态切换到分库分表上&#xff1f; 1.1 停机迁移方案 我先给你说一个最 low 的方案&#xff0c;就是很简单&#xff0c;大家伙儿凌晨…

数据迁移工具

1.Kettle Kettle是一款国外开源的ETL工具,纯Java编写,绿色无需安装,数据抽取高效稳定 (数据迁移工具)。 Kettle 中有两种脚本文件,transformation 和 job,transformation 完成针对数据的基础转换,job 则完成整个工作流的控制。 Kettle 中文名称叫水壶,该项目的主程序…

数据迁移工具,用这8种就够了!!!

前言 最近有些小伙伴问我&#xff0c;ETL数据迁移工具该用哪些。 ETL(是Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程)&#xff0c;对于企业应用来说&#xff0c;我们经常会遇到各种数据的处理、转换、迁移的场景。 今天特地给大家汇总了一些目前…

数据迁移工具,用这8种就够了

前言 最近由于工作需要需要进行数据迁移&#xff0c;那么ETL数据迁移工具该用哪些呢&#xff1f; ETL(是Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程)&#xff0c;对于企业应用来说&#xff0c;我们经常会遇到各种数据的处理、转换、迁移的场景。…

电脑文件软件搬家迁移十大工具

10 大适用于 Windows 的数据迁移软件。 数据迁移至关重要&#xff0c;几乎所有组织都依赖于此。如果您认为数据传输不是一件容易的事&#xff0c;那么数据迁移软件可以帮上忙。 1、奇客电脑迁移 将现有操作系统、软件、文件迁移到 新电脑的最佳方法之一是使用名为奇客电脑迁移…

如何将旧电脑数据迁移到新电脑?10 款数据迁移软件工具分享

最好的数据迁移软件可以自动完成将数据从一个系统传输到另一个系统的过程。人们使用数据迁移软件的最常见原因是当他们从一个应用程序切换到另一个应用程序时。 10 款数据迁移软件 公司或个人出于各种原因移动数据。也许他们已经向他们的技术堆栈添加了新的资产或应用程序&…

‘v-model‘ directives require the attribute value which is valid as LHS.

哈喽&#xff0c;大家好啊。最近写vue项目的时候遇到这样的问题 最后才知道&#xff1a;v-modle指令要求属性值必须与LHS一样有效 原因就是&#xff1a;v-model 将始终把Vue实例的data视为数据真实的来源。应该在组件的Js里面打data中声明初始值&#xff0c;不能要求v-model一次…

【小知识】linux下ls与ll的区别

在 Linux 系统中&#xff0c;ls 和 ll 命令都是用来列出目录内容的命令&#xff0c;它们的区别如下&#xff1a; ls 命令&#xff1a;是一个简单的文件列表命令&#xff0c;它会列出目录下的文件和子目录的名称&#xff0c;并显示它们的属性和权限等信息。 ll 命令&#xff1a;…

LHS与RHS查询

本文基于《你不知道的Javascript》编写。 JavaScript中在预编译后执行代码时对变量的查询分为LHS&#xff08;Left-Hand-Side&#xff09;查询和RHS(Right-Hand-Side)查询。 是一个赋值操作的左侧和右侧的意思&#xff1b; &#xff08;一&#xff09;看一个转换后的例子&…

JavaScript中的LHS和RHS查询

文章是本人大三期间的学习笔记&#xff0c;一些论断取自书籍和网上博客&#xff0c;碍于当时的技术水平有一些写得不够好的地方&#xff0c;可以在评论处理智讨论~ 问题来源于《你不知道的JavaScript&#xff08;上卷&#xff09;》&#xff0c;文章部分论述截自原书。 简述编译…