Flyway迁移的执行过程

news2024/9/22 7:23:48

Flyway 是一种强大的数据库迁移工具,它能在多个环境中自动执行数据库版本控制,确保数据库的结构(schema)和数据(如初始化数据)的一致性和可维护性。Flyway 的迁移执行过程包括多个步骤,从检测迁移文件,到执行 SQL 语句,再到更新数据库的版本记录。Flyway 可以与多种数据库系统(如 MySQL、PostgreSQL、Oracle 等)集成,并支持 Java 项目中的自动化数据库管理。

一、Flyway 的基本原理

Flyway 通过管理 数据库版本迁移文件 来实现数据库的版本控制。迁移文件通常以 SQL 语句的形式编写,用来定义数据库 schema 的更改(如创建表、修改表、插入数据等)。Flyway 通过读取这些迁移文件,将它们依次应用到数据库中,保证数据库在不同环境中的一致性。

Flyway 在执行迁移时,维护一个特殊的表(通常命名为 flyway_schema_history),用于记录已应用的迁移文件。这使得 Flyway 能够根据文件版本号确定哪些迁移已经执行过,哪些是新的需要执行的。

二、Flyway 迁移执行的详细过程

Flyway 执行迁移时,遵循以下步骤:

1. 连接数据库

首先,Flyway 需要与目标数据库建立连接。数据库连接的配置信息通常在应用的配置文件(如 application.ymlflyway.conf)中定义,Flyway 会根据这些配置来连接数据库。

示例配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: rootpassword
    driver-class-name: com.mysql.cj.jdbc.Driver

Flyway 使用这些配置连接到数据库,准备进行迁移操作。

2. 检查并创建历史表(flyway_schema_history)

连接数据库后,Flyway 会检查是否存在 flyway_schema_history 表。该表用于记录每次迁移的执行状态和历史信息。如果表不存在,Flyway 会自动创建这个表。

flyway_schema_history 表的结构

CREATE TABLE flyway_schema_history (
    installed_rank INT NOT NULL,
    version VARCHAR(50),
    description VARCHAR(200),
    type VARCHAR(20),
    script VARCHAR(1000) NOT NULL,
    checksum INT,
    installed_by VARCHAR(100) NOT NULL,
    installed_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    execution_time INT NOT NULL,
    success BOOL NOT NULL
);
  • installed_rank:迁移执行的顺序号。
  • version:迁移的版本号(对应迁移文件中的版本号)。
  • description:迁移文件的描述。
  • type:迁移文件的类型(如 SQL、JDBC)。
  • script:迁移文件的名称。
  • checksum:迁移文件的校验和(用于确保文件没有被篡改)。
  • success:表示该迁移是否成功执行。
3. 检测待执行的迁移文件

Flyway 在应用启动时,会扫描指定目录下的迁移文件(如 db/migration),并根据迁移文件的命名规则识别不同的迁移版本。每个迁移文件的命名格式通常是:

V<Version>__<Description>.sql
  • V:表示版本迁移文件。
  • :版本号(如 1, 1.1, 2 等),Flyway 根据这个版本号确定执行顺序。
  • :简要描述迁移内容的文本。

Flyway 会将这些文件与 flyway_schema_history 表中的记录进行对比,判断哪些迁移已经执行,哪些迁移需要执行。

4. 校验迁移文件

Flyway 会对每个迁移文件计算校验和(checksum),并与 flyway_schema_history 表中已有记录的校验和进行对比。这样做的目的是确保迁移文件没有被修改或破坏。

  • 校验和一致:如果校验和一致,Flyway 会跳过该迁移文件,继续检查下一个文件。
  • 校验和不一致:如果校验和不一致,Flyway 会报错并停止迁移操作,因为这意味着迁移文件被修改,可能会影响数据库的正确性。
5. 执行迁移文件

Flyway 根据迁移文件的版本号依次执行未应用的迁移文件。每个迁移文件中的 SQL 语句会被逐条执行。Flyway 通过 JDBC 与数据库交互,并确保在事务内执行(某些数据库除外,如 MySQL 对 DDL 操作不支持事务)。

迁移文件示例

-- V1__Create_users_table.sql
CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
6. 更新历史记录

每个迁移文件成功执行后,Flyway 会将相关信息写入 flyway_schema_history 表中,包括迁移的版本号、描述、执行时间等信息。这一步至关重要,确保 Flyway 了解已经执行过的迁移,避免重复执行。

插入历史记录的 SQL

INSERT INTO flyway_schema_history (installed_rank, version, description, type, script, checksum, installed_by, execution_time, success)
VALUES (1, '1', 'Create_users_table', 'SQL', 'V1__Create_users_table.sql', 123456789, 'admin', 200, TRUE);
7. 处理迁移失败

如果某个迁移文件执行过程中发生错误,Flyway 会停止后续迁移,并将该迁移标记为失败。Flyway 不会回滚已经成功执行的迁移文件,但它会记录失败的迁移,并提示开发者进行修复。

开发者可以通过 Flyway 提供的 repair 命令修复失败的迁移历史,允许重新执行失败的迁移文件。

flyway repair

该命令会清除失败的迁移记录,使 Flyway 能够重新尝试执行该迁移文件。

三、Flyway 的执行命令

Flyway 提供了一系列命令,帮助开发者管理数据库的迁移过程。常用的命令有:

1. migrate

这是最常用的 Flyway 命令,执行所有待执行的迁移文件。

flyway migrate

Flyway 会扫描指定的迁移目录,执行所有新的迁移文件。

2. clean

该命令会删除所有已存在的表和数据,包括 flyway_schema_history 表,彻底清理数据库。慎用,通常用于开发或测试环境的清理操作。

flyway clean
3. info

该命令用于查看 Flyway 当前的迁移状态,包括哪些迁移已经执行,哪些尚未执行,以及迁移的成功或失败状态。

flyway info
4. validate

该命令用于校验已执行的迁移文件是否仍然有效,包括校验迁移文件的校验和。

flyway validate
5. repair

当某些迁移文件失败时,repair 命令可以用于修复 flyway_schema_history 表,使 Flyway 能够重新执行失败的迁移。

flyway repair

四、Flyway 的常见配置

除了执行命令,Flyway 还允许开发者通过配置文件(如 flyway.confapplication.yml)进行各种高级设置。

常见配置项

flyway:
  url: jdbc:mysql://localhost:3306/mydb
  user: root
  password: rootpassword
  locations: classpath:db/migration
  baseline-on-migrate: true
  clean-on-validation-error: false
  • url:数据库连接 URL。
  • user:数据库用户名。
  • password:数据库密码。
  • locations:迁移文件存放的路径(可以是文件系统或类路径下的目录)。
  • baseline-on-migrate:如果数据库已存在 schema,可以通过 baseline 标记为一个初始版本。
  • clean-on-validation-error:当校验迁移文件失败时,是否自动清理数据库。

五、Flyway 的执行策略和优化

  1. 增量式迁移:Flyway 通过增量式迁移方式管理数据库的版本变更,不会重复执行已经应用的迁移文件,因此迁移操作的执行效率较高。
  2. 回滚策略:Flyway 默认不支持自动回滚,但可以通过编写 Undo 迁移文件实现手动回滚。需要在实际项目中根据需要实现安全的

回滚机制。
3. 并行化执行:对于多节点的分布式系统,可以通过 Flyway 的锁机制确保迁移操作只在一个节点上执行,避免并发执行带来的冲突。

六、总结

Flyway 的迁移执行过程非常透明,遵循明确的版本管理规则,确保每个版本的数据库变更都有详细的记录和执行步骤。通过维护 flyway_schema_history 表,Flyway 能够跟踪和管理所有的迁移文件,避免重复执行或遗漏变更。Flyway 提供的各种命令和配置也让开发者在管理数据库 schema 时更加灵活,适用于开发、测试和生产环境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2154542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始学习TinyWebServer

写在前面 项目参考&#xff1a;https://github.com/qinguoyi/TinyWebServer 写作框架/图参考&#xff1a;https://blog.csdn.net/qq_52313711/article/details/136356042?spm1001.2014.3001.5502 原本计划是&#xff0c;先将项目代码大概看一遍&#xff0c;然后再着手实现一下…

【hot100-java】【组合总和】

R8-回溯篇 印象题&#xff0c;很基本的回溯 class Solution {void backtrack(List<Integer> state,int target,int[] choices,int start,List<List<Integer>> ret){//子集和等于target&#xff0c;记录解if (target0){ret.add(new ArrayList<>(state)…

LeetCode讲解篇之1343. 大小为 K 且平均值大于等于阈值的子数组数目

文章目录 题目描述题解思路题解代码 题目描述 题解思路 题目让我们求长度为k的子数组并且该子数组的平均值大于threshold&#xff0c;对于这题&#xff0c;我们可以考虑维护一个长度为k的窗口&#xff0c;窗口不断向右滑动&#xff0c;遍历所有长度为k的子数组&#xff0c;我们…

低版本SqlSugar的where条件中使用可空类型报语法错误

SQLServer数据表中有两列可空列&#xff0c;均为数值类型&#xff0c;同时在数据库中录入测试数据&#xff0c;Age和Height列均部分有值。   使用SqlSugar的DbFirst功能生成数据库表类&#xff0c;其中Age、Height属性均为可空类型。   开始使用的SqlSugar版本较低&…

win11 wsl2安装ubuntu22最快捷方法

操作系统是win11&#xff0c;wsl版本是wsl2&#xff0c;wsl应该不用多介绍了&#xff0c;就是windows上的虚拟机&#xff0c;在wsl上可以很方便的运行Linux系统&#xff0c;性能棒棒的&#xff0c;而且wsl运行的系统和win11主机之间的文件移动是无缝的&#xff0c;就是两个系统…

力扣115-不同的子序列(Java详细题解)

题目链接&#xff1a;不同的子序列 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一个dp题目…

Spring IDEA 2024 安装Lombok插件

1.简介 Lombook插件的Data标签可以自动生成类的get和set以及toString方法。 2.安装步骤 在idead设置的插件中搜索lombok插件&#xff0c;安装。 在Spring项目的pom.xml中添加依赖项 <dependency><groupId>org.projectlombok</groupId><artifactId…

数据结构与算法——Java实现 7.习题——反转链表

当你穿过了暴风雨&#xff0c;你已不是原来那个人 —— 24.9.21 206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输…

echarts标注legend的配置

代码&#xff1a; legend: [{top: bottom, //上下位置 top center bottom 还可以用百分比50%等orient: horizontal, // 竖立 vertical horizontal 水平的// right: 0, //靠右 还可以用百分比 50%等// left: 0,// 靠左 还可以用百分比 50%等// 左右位置 否则居中itemWidth: …

前端框架Vue、React、Angular、Svelte对比

在对比 React、Vue.js、Angular 和 Svelte 时&#xff0c;除了在高层次的特性上有显著差异&#xff0c;它们在核心设计理念和底层实现机制上也有明显的不同。为了清晰地理解这些框架&#xff0c;我们可以从以下几个方面来分析它们的核心不同点和底层不同点。 1. 框架类型和设计…

ARM 栈和函数调用

阅读本文前&#xff0c;可以先阅读下述文档&#xff0c;对函数栈、栈帧等的概念会有所了解&#xff0c;会对本文章的理解大有益处 X86_64 栈和函数调用 1、调试环境 Ubuntu&#xff1a; liangjieliangjie-virtual-machine:~/Desktop$ cat /proc/version Linux version 6.5.0…

WebRTC编译后替换libwebrtc.aar时提示找不到libjingle_peerconnection_so.so库

Loading native library: jingle_peerconnection_so 问题原因&#xff1a;编译的时候只编译了armeabi-v7a的版本&#xff0c;但是应用程序是arm64-v8a&#xff0c;所以无法运行 解决方法&#xff1a;更新编译脚本&#xff0c;加上arm64-v8a进行编译 ./tools_webrtc/android/bu…

OpenAI GPT o1技术报告阅读(5)-安全性对齐以及思维链等的综合评估与思考

✨继续阅读报告&#xff1a;使用大模型来学习推理(Reason) 原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 编码 我们训练了一个模型&#xff0c;在2024年国际信息学奥林匹克竞赛&#xff08;IOI&#xff09;中得分213分&#xff0c;排名在第…

Arthas sysenv(查看JVM的环境变量)

文章目录 二、命令列表2.1 jvm相关命令2.1.5 sysenv&#xff08;查看JVM的环境变量&#xff09;举例1&#xff1a;sysenv 查看所有环境变量举例2&#xff1a;sysenv java.version 查看单个属性&#xff0c;支持通过tab补全 二、命令列表 2.1 jvm相关命令 2.1.5 sysenv&#x…

saas收银系统源码

1. 线下门店多样化收银 ①门店有社区小店、也会有大店&#xff0c;甚至还会有夫妻店&#xff0c;同时还要有Windows版和安卓版&#xff0c;需满足不同门店的收银需求。 ②支持Windows收银、安卓收银、无人自助收银、聚合码收银等&#xff0c;支持ai智能称重、收银称重一体机等…

Unity3D入门(二) :Unity3D实现视角的丝滑过渡切换

1. 前言 上篇文章&#xff0c;我们已经初步了解了Unity3D&#xff0c;并新建并运行起来了一个项目&#xff0c;使相机视角自动围绕着立方体旋转。 这篇文章&#xff0c;我们来讲一下Unity3D怎么过渡地切换视角。 我们继续是我上篇文章中的项目&#xff0c;但是需要向把Camera…

Qt Debugging帮助文档

Qt中给断点添加条件&#xff1a; 示例1&#xff1a; 当i10时&#xff0c;程序中断 但不知道为什么&#xff0c;46行的条件没有生效&#xff0c;47行的条件生效了 给断点添加忽略次数&#xff1a; 在程序停止之前忽略该断点200次。 Breakpoints (Debugging with GDB)

AI 时代的网络危机沟通计划

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Go-知识recover

Go-知识recover 1. 介绍2. 工作机制2.1 recover 定义2.2 工作流程2.3 总结 3. 原理3.1 recover函数的真正逻辑3.2 恢复逻辑3.3 生效条件 4. 总结4.1 recover的返回值是什么&#xff1f;4.2 执行recover之后程序将从哪里继续运行&#xff1f;4.3 recover为什么一定要在defer中使…

2024年信息学奥赛CSP-J1入门组初赛真题试卷

2024年信息学奥赛CSP-J1入门组初赛真题试卷 题目总数&#xff1a;20 总分数&#xff1a;100 选择题 第 1 题 单选题 32位int类型的存储范围是&#xff08; &#xff09; A. -2147483647 ~ 2147483647 B. -2147483647 ~ 2147483648 C. -2147483648 ~ 2147483647…