Flyway迁移的执行过程

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/mydbusername: rootpassword: rootpassworddriver-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/mydbuser: rootpassword: rootpasswordlocations: classpath:db/migrationbaseline-on-migrate: trueclean-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.xdnf.cn/news/148171.html

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

相关文章

MMROTATE 1.X特征图可视化(绘制Heat Map)

本文参考MMYOLO官方的特征图可视化教程&#xff0c;对MMROTATE相关算法进行特征图可视化 1. 新建featmap_vis_demo.py文件 在mmrotate项目文件夹下新建 featmap_vis_demo.py &#xff1a; # Copyright (c) OpenMMLab. All rights reserved. import argparse import os from t…

“吉林一号”宽幅02B系列卫星

离轴四反光学成像系统 1.光学系统参数&#xff1a; 焦距&#xff1a;77.5mm&#xff1b; F/#&#xff1a;7.4&#xff1b; 视场&#xff1a;≥56゜&#xff1b; 光谱范围&#xff1a;400nm&#xff5e;1000nm。 2.说明&#xff1a; 光学系统采用离轴全反射式结构&#xff0c;整…

CIM平台应用的一些思考

今天中午看了一些书&#xff0c;讲致幻剂在疾病治疗的一些作用。致幻剂包括毒蘑菇等这类东西&#xff0c;有精神疾病或其他心里疾病的患者在吸食或注射&#xff08;专业医生的指导下&#xff09;会忘记或减轻身体的痛苦&#xff0c;忘记死亡&#xff0c;相信永生&#xff0c;治…

VMWare虚拟机安装CentOS-7-x86_64-DVD-1611操作系统

VMWare虚拟机安装CentOS7操作系统 1、虚拟机准备打开VMware单机创建新的虚拟机典型与自定义安装选择虚拟机硬件兼容性选择安装程序光盘映射文件(iso)选择客户机操作系统命名虚拟机处理器配置内存配置网络连接类型I/O类型选择磁盘类型选择磁盘指定磁盘的最大磁盘大小磁盘名称我们…

高中数学:立体几何-平面的定义与公理

文章目录 一、平面定义及画法1、定义2、表示方法 二、公理1、公理12、公理23、公理3 一、平面定义及画法 1、定义 平面是向四周无限延展的。 2、表示方法 我们常用矩形的直观图&#xff0c;即平行四边形表示平面&#xff0e; 我们常用希腊字母α&#xff0c;β&#xff0c…

八. 实战:CUDA-BEVFusion部署分析-coordTrans Precomputation

目录 前言0. 简述1. 案例运行2. coordTrans3. Precomputation总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第八章—实战&#xff1a;CUDA-BEVFusion部署分…

『正版软件』XYplorer 专业的 Windows 文件管理工具软件

在数字化时代&#xff0c;我们每天都在与各种文件打交道。无论是工作文档、个人照片还是多媒体资料&#xff0c;管理这些文件的效率直接关系到我们的工作效率和生活体验。今天&#xff0c;我要向大家推荐一款功能强大、操作简便的文件管理软件 —— XYplorer。 XYplorer&#x…

【小bug】使用 RestTemplate 工具从 JSON 数据反序列化为 Java 对象时报类型转换异常

起因&#xff1a;今天编写一个请求时需要通过RestTemplate调用外部接口&#xff0c;获取一些信息&#xff0c;但是在获取了外部接口响应内容后&#xff0c;使用强制转换发现报了类型转换异常。之前也遇到过&#xff0c;但是没记录下来&#xff0c;今天又查了一遍……干脆记录一…

【hot100-java】【搜索旋转排序数组】

R8-二分查找篇 等等&#xff0c;不是&#xff1f;O(logn)&#xff1f;那岂不是一次遍历数组都超时了hh. 二分查找分类 class Solution {public int search(int[] nums, int target) {if (numsnull||nums.length0){return -1;}int start0;int endnums.length-1;int mid;while …

以太坊客户端Geth的介绍与搭建

一、以太坊客户端 1.介绍 以太坊客户端是指用于连接、交互和参与以太坊区块链网络的软件。以太坊客户端允许用户执行各种操作&#xff0c;如发送交易、挖矿、部署智能合约、同步区块链数据等。 2.功能 区块链同步&#xff1a;客户端会下载并验证以太坊区块链的所有区块&…

windows 出现身份验证错误,要求的函数不受支持

现象环境&#xff1a; win10 mstsc内网远程server2016&#xff0c;出现错误代码&#xff1a; 远程桌面连接出现身份验证错误。要求的函数不受支持。这可能是由于CredSSP加密数据库修正 出现身份验证错误 原因&#xff1a; 系统更新&#xff0c;微软系统补丁的更新将 Cred…

【Godot4.3】2D程序生成植物概论

概述 Godot的2D程序化植物生成是我一直想要探讨的一个内容&#xff0c;但是一直没有真正开动&#xff0c;在刚过去的中秋节假期期间&#xff0c;在老家无聊&#xff0c;在一个素描本上构思了一系列想法。本篇就基于这些自己的想法介绍一下程序化植物生成的基本思路。不一定对&…

c++ 找到给定点集的简单闭合路径(Find Simple Closed Path for a given set of points)

给定一组点&#xff0c;将这些点连接起来而不相交 例子&#xff1a; 输入&#xff1a;points[] {(0, 3), (1, 1), (2, 2), (4, 4), (0, 0), (1, 2), (3, 1}, {3, 3}}; 输出&#xff1a;按以下顺序连接点将 不造成任何交叉 {(0, 0), (3, …

如何在Markdown写文章上传到wordpress保证图片不丢失

如何在Markdown写文章上传到wordpress保证图片不丢失 写文日期,2023-11-16 引文 众所周知markdown是一款nb的笔记软件&#xff0c;本篇文章讲解如何在markdown编写文件后上传至wordpress论坛。并且保证图片不丢失&#xff08;将图片上传至云端而非本地方法&#xff09; 一&…

offsetX、offsetY...

文章目录 offsetX & offsetYclientX & clientYpageX & pageYscreenX & screenYinnerHeight & innerWidthoffsetHeight & offsetWidthoffsetTop & offsetLeftscrollHeight & scrollWidthscrollTop & scrollLeft:与scrollHeight和scrollWidt…

二分查找算法(3) _x的平方根

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 二分查找算法(3) _x的平方根 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 温馨…

《深度学习》—— 卷积神经网络(CNN)的简单介绍和工作原理

文章目录 一、卷积神经网络的简单介绍二、工作原理(还未写完)1.输入层2.卷积层3.池化层4.全连接层5.输出层 一、卷积神经网络的简单介绍 基本概念 定义&#xff1a;卷积神经网络是一种深度学习模型&#xff0c;通常用于图像、视频、语音等信号数据的分类和识别任务。其核心思想…

MIPI协议

MIPI协议 MIPI介绍协议层显示接口&#xff08;Display&#xff09;DBI&#xff08;Display Bus Interface&#xff09;并行传输串行传输 DPI&#xff08;Display Pixel Interface&#xff0c;也称RGB接口&#xff09;DSI&#xff08;Display Serial Interface&#xff09;Appli…

关于使用低版本EPLAN打开高版本项目中的一些常见问题!

目录 1 前言 2 操作方法 2.1 经典版本 2.2 新版本 3 遇到的问题 4 结语 1 前言 在用EPLAN设计图纸时&#xff0c;经常要遇到使用低版本EPLAN打开高版本EPLAN的项目。 EPLAN软件根据操作界面的不同可以分为两种: 1&#xff0c;EPLAN 2.x版本&#xff0c;比如经典的2.9和2…

【Python报错已解决】TypeError: ‘<‘ not supported between instances of ‘str‘ and ‘int‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…