Flyway 元数据表

news2024/9/23 5:15:32

Flyway 元数据表详解

Flyway 是一个开源的数据库版本控制工具,用于管理和跟踪数据库的变更。它通过 SQL 脚本或 Java 代码来执行数据库迁移,并记录所有的迁移操作。Flyway 通过一个特殊的元数据表来跟踪数据库的变更历史,确保每次执行的迁移操作是唯一的、可重复的且安全的。


1. Flyway 元数据表简介

Flyway 通过一个名为 flyway_schema_history 的元数据表来记录每次数据库迁移的状态。这个表用于存储所有已执行的迁移脚本信息,确保每个迁移脚本只会执行一次。Flyway 在每次运行迁移时,都会首先检查这个元数据表,以确定哪些迁移已经执行过,哪些迁移需要执行。

默认元数据表名称

默认情况下,Flyway 使用名为 flyway_schema_history 的表来存储元数据。如果需要,可以通过配置文件自定义该表的名称。

flyway:
  table: flyway_schema_history_custom  # 自定义元数据表名称

2. Flyway 元数据表结构

flyway_schema_history 表的结构定义了 Flyway 如何跟踪数据库的迁移操作。下面是该表的常见字段和它们的含义:

CREATE TABLE flyway_schema_history (
    installed_rank INT NOT NULL,
    version VARCHAR(50),
    description VARCHAR(200) NOT NULL,
    type VARCHAR(20) NOT NULL,
    script VARCHAR(1000) NOT NULL,
    checksum INT,
    installed_by VARCHAR(100) NOT NULL,
    installed_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    execution_time INT NOT NULL,
    success BOOLEAN NOT NULL
);
字段解释:
  1. installed_rank:安装顺序,每个迁移都有唯一的序号,用于记录执行顺序。
  2. version:迁移版本号,通常是由迁移文件名中的版本号生成的。比如,文件 V1__Create_user_table.sql 的版本号是 1
  3. description:对迁移的简要描述,通常是从文件名中提取的。例如,Create_user_table
  4. type:迁移的类型,可能的值包括:
    • SQL:SQL 脚本。
    • JDBC:通过 Java 代码的迁移。
    • BASELINE:基准迁移。
    • DELETE:删除操作。
  5. script:迁移脚本的文件名或内容的标识符。
  6. checksum:脚本文件的校验和,用于验证文件内容是否改变。如果迁移脚本内容发生变化,Flyway 会检测到并提示。
  7. installed_by:执行该迁移的用户。
  8. installed_on:执行迁移的时间戳。
  9. execution_time:迁移的执行时间(以毫秒为单位)。
  10. success:标志该迁移是否成功执行。true 表示成功,false 表示失败。

3. Flyway 元数据表的作用

元数据表的主要作用是记录所有迁移的执行历史,它确保 Flyway 具有以下功能:

3.1 防止重复执行迁移

Flyway 通过元数据表中的 version 字段来跟踪已经执行过的迁移。如果迁移版本已经存在,Flyway 将不会再次执行该版本的迁移文件,避免重复执行。

3.2 保证迁移顺序

Flyway 使用 installed_rank 来确定每次迁移的顺序。无论是通过手动运行还是通过自动化工具,所有的迁移都会按照指定的顺序依次执行,确保数据变更的顺序性。

3.3 检测迁移文件的变化

Flyway 通过计算迁移文件的 checksum 来检测脚本内容是否发生变化。如果已经执行过的迁移文件发生了变化(例如,开发者手动修改了 SQL 文件),Flyway 会检测到并提示错误,防止已应用的迁移脚本内容不一致。

3.4 记录迁移的详细信息

元数据表不仅记录了迁移的版本和顺序,还记录了每个迁移的执行时间、执行者、脚本文件名和执行结果。这些信息对于调试和回溯数据库变更非常有帮助。


4. 元数据表的管理

元数据表是 Flyway 迁移管理中的核心部分,但开发者在日常开发中通常不需要直接操作该表。Flyway 提供了多种工具来管理和维护元数据表。

4.1 自定义元数据表名

如果项目中存在命名冲突或其他需求,可以通过 Flyway 配置文件自定义元数据表的名称。

flyway:
  table: custom_schema_history  # 自定义元数据表名称
4.2 清除元数据表

在某些情况下,开发者可能需要清除所有的迁移记录(例如重新初始化数据库)。Flyway 提供了 flyway clean 命令来删除数据库中的所有表,包括元数据表。这通常用于开发和测试环境,不建议在生产环境中使用

flyway clean

clean 命令会删除数据库中的所有对象(表、视图、存储过程等),并清空元数据表。

4.3 修复元数据表

Flyway 提供了 flyway repair 命令,用于修复元数据表中的不一致。例如,如果某次迁移失败或元数据表中的校验和不正确,可以使用该命令来修复。

flyway repair

repair 命令会修复以下内容:

  • 删除失败的迁移记录。
  • 修复校验和不匹配的问题。
  • 更新基准迁移信息。

5. 元数据表校验和的使用

Flyway 通过 checksum 字段来确保每个迁移文件的内容一致。当 Flyway 检测到一个已经执行过的迁移文件发生了变更(即 checksum 发生变化),它会抛出错误,并提示迁移脚本的内容已被修改。

校验和的典型错误提示:
Detected resolved migration not applied to database: 2
Resolved migration checksum mismatch for migration version 1
- Applied to database : -786652490
- Resolved locally    : 234562789
处理方法:
  1. 修复脚本:如果你确实需要修改已经执行过的迁移脚本,应该创建一个新的迁移文件,而不是直接修改已经执行过的文件。
  2. 使用 flyway repair:如果你确定迁移脚本的变更不会影响数据库的当前状态,可以使用 flyway repair 来更新 checksum

6. 版本控制和迁移策略

Flyway 依赖版本号来管理数据库的迁移,每个迁移文件都有唯一的版本号。如果版本号重复或者不按顺序,Flyway 会抛出错误。

6.1 版本控制策略
  • 严格版本顺序:Flyway 要求迁移文件的版本号按顺序递增。例如,V1__create_user.sql 应该在 V2__add_email_column.sql 之前执行。
  • 平行开发:如果多个开发者同时开发,可以使用小数或点分版本号来处理并行开发的迁移文件。例如,开发者 A 创建 V2.1__create_orders.sql,开发者 B 可以创建 V2.2__add_order_status.sql
6.2 Baseline 和 Repair 机制
  • Baseline:Flyway 提供 baseline 功能,用于处理已经存在数据的数据库。在数据库初始化之前,开发者可以通过 flyway baseline 创建一个基准点,使 Flyway 只应用新迁移文件。

    flyway baseline
    
  • Repairrepair 功能可以用于修复元数据表中的问题,例如修复失败的迁移或不匹配的校验和。


7. 总结

Flyway 通过元数据表 flyway_schema_history 来记录和管理数据库迁移的状态。元数据表确保每个迁移文件只会执行一次,并提供校验和机制来确保迁移文件的内容一致。通过 Flyway 提供的命令,如 cleanrepairbaseline 等,开发者可以有效地管理和维护数据库迁移过程。

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

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

相关文章

在Web开发中使用和风天气接口

介绍 和风天气是一个提供全球天气预报和气象数据的服务平台,支持多种语言,提供实时天气、未来天气预报、空气质量指数、生活建议等多种气象数据,可以广泛用于网页开发、移动应用和物联网设备等场景。 开发文档:文档 | 和风天气开…

intellij idea 控制台运行java出现中文乱码的解决方法

原因: 字符编码不一致: 当你在intellij idea使用了UTF-8编码,而在控制台使用了其他编码(比如gbk),就可能导致乱码。 文件读写编码问题: 如果读取文件时使用的编码与文件实际编码不一致&#xf…

Chainlit集成LlamaIndex实现知识库高级检索(自动合并检索)

检索原理 自动合并检索 自动合并检索原理,和我的上一篇文章的检索方案: 将文本分割成512大小(一般对应段落大小)和128(一般对句子大小不是严格的句子长度)大小两种分别存储到索引库,再用llama_…

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

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

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

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

通信工程学习:什么是NFVI网络功能虚拟化基础设施层

NFVI:网络功能虚拟化基础设施层 NFVI(Network Functions Virtualization Infrastructure)即网络功能虚拟化基础设施层,是NFV(Network Functions Virtualization,网络功能虚拟化)架构中的一个重要…

精准农业中遥感技术应用(五)- 一站式遥感数据服务平台AIEarth

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案,帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、领域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

【LeetCode:116. 填充每个节点的下一个右侧节点指针 + BFS(层次遍历)】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

redis主从复制的理论和实战详细教程

0 前言 就是主从复制,master以写为主,slave以读为主,当master数据变化的时候,自动将新的数据异步同步到其他的slave数据库。也就是redis主从复制异步同步数据的,所以在主从架构中使用分布式锁时,可能会出现…

4--SpringBoot项目中分类管理

目录 新增分类 分类分页查询 启用禁用分类 根据类型查询 修改分类 本文介绍SpringBoot项目中的分类管理,操作类似员工管理模块,具体详解可见以下博客,此处给出各部分代码 2--SpringBoot项目中员工管理 详解(一)-C…

基于51单片机的手环设计仿真

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机,DHT11温湿度采集温湿度,滑动变阻器连接ADC0832数模转换器模拟水位传感器检测水位,通过LCD1602显示信息,然后在程序里设置好是否…

vue3项目中引入词云图

在vue3中的项目引入词云图 前言&#xff1a;先看效果图步骤如下 前言&#xff1a; 公司产品要求项目中使用词云图&#xff0c;我算是第一次用&#xff0c;于是在网上查找资料&#xff0c;最后做出来了。 先看效果图 步骤如下 npm i echarts-wordcloud -S <template> …

恶意AI大模型的兴起将改变网络安全

LLM 的恶意版本&#xff08;如 ChatGPT 的黑暗变体&#xff09;的兴起正在通过使用更复杂和自动化的攻击来升级网络战。 这些模型可以生成令人信服的网络钓鱼电子邮件、传播虚假信息并制作有针对性的社会工程消息。 所有这些非法功能都对在线安全构成了重大威胁&#xff0c;并加…

2024年最新前端工程师 TypeScript 基础知识点详细教程(更新中)

1. TypeScript 概述 TypeScript 是由微软开发的、基于 JavaScript 的一种强类型编程语言。它是在 JavaScript 的基础上添加了静态类型检查、面向对象编程等功能的超集&#xff0c;最终会被编译为纯 JavaScript 代码。由于其扩展了 JavaScript 的功能&#xff0c;TypeScript 特…

[Redis][数据类型]详细讲解

1.Redis 特殊数据结构 1.Streams 应用场景&#xff1a;主要用为队列(阻塞队列) 2.Geospatial 应用场景&#xff1a;用来存储坐标(经纬度) 3.HyperLogLog 应用场景&#xff1a;估算集合中的元素个数注意&#xff1a; HyperLogLog不存储元素的内容&#xff0c;但是能够记录“…

【机器学习】ROC曲线

【机器学习】ROC曲线 1、ROC曲线简介2、ROC曲线和AUC值2.1 ROC曲线2.2 AUC值 3、实验内容3.1 准备数据集3.2 特征提取3.3 数据集划分3.4 模型训练与预测3.5 计算和绘制ROC曲线3.6 绘制混淆矩阵3.7 三分类混淆矩阵 4 源代码4.1 实现ROC二分类4.2 三分类混淆例子 1、ROC曲线简介 …

cnn机器学习时python版本不兼容报错

在使用python执行CNN算法时&#xff0c;发生如下报错&#xff1a; A module that was compiled using NumPy 1.x cannot be run in NumPy 2.1.1 as it may crash. To support both 1.x and 2.x versions of NumPy, modules must be compiled with NumPy 2.0. Some module may …

网络高级day03(Http)

目录 【1】HTTP简介 【2】 HTTP特点 【3】 HTTP协议格式 1》客户端请求消息格式 1> 请求行 2> 请求头 3> 空行 4> 请求数据 2》服务器响应消息格式 【1】HTTP简介 HTTP协议是Hyper Text Transfer Protocol &#xff08;超文本传输协议&#xff09;的缩写&a…

低代码平台:数据筛选功能的全新变革

随着软件开发需求的不断增长&#xff0c;传统的开发方法因其复杂性和耗时性而逐渐无法满足市场对快速交付和迭代的需求。低代码开发平台作为一种新型的软件开发工具&#xff0c;以其高效、易用的特点受到了广泛的关注和应用。 在软件开发领域&#xff0c;数据筛选是一项基础且…

frpc内网穿透

官网地址&#xff1a;frp官网 本次用到的Liunx包&#xff1a; https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.gz下载&#xff1a; wget https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.g…