Flyway by Redgate • 数据库迁移变得简单。 ---- 数据库的版本控制
Flyway 是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本。
用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。
应用场景:
在项目或产品中,很难一开始就把业务理清楚,把数据库表设计好,因此数据表也会在迭代周期不断迭代。在Java应用程序中使用Flyway,能快速有效地用于迭代数据库表结构,并保证部署到测试环境或生产环境时,数据表都是保持一致的。
适用人员:
支持的数据库包括:
当 Flyway 连接数据库中的 schema 后,会先检查是否已存在 flyway_schema_history 表,如果没有则创建。该表用于跟踪数据库的状态,如数据迁移的版本,迁移成功状态等信息。
flyway_schema_history 表结构:
当 flyway_schema_history 存在后,Flyway 会扫描文件系统或应用中的 classpath 目录的数据迁移文件,然后根据它们的版本号进行按序迁移,如下图:
由于 flyway_schema_history 表中记录了迁移的版本号,如果文件的版本号小于或等于标记为当前版本的版本号,则忽略它们不执行。(并非真正忽略,而是会校验checksum值是否一致,以此来保证历史版本文件未被篡改)
所以每次当你打算升级数据库时(包含DDL、DML语句),只需要在指定路径下创建一个版本号大于历史记录表中当前最大的版本号的迁移文件即可。在下次flyway启动时(随项目启动或其他形式),数据库将会自动完成升级,你无须再手动执行脚本。
使用 Flyway,对数据库的所有更改都称为迁移。迁移可以是版本化的或 可重复的。版本化迁移有两种形式:常规和撤消。
Migration的方式包括:
迁移最常使用SQL编写。这使得上手和利用任何现有的脚本、工具和技能变得容易。它使您可以访问数据库的全部功能,并且无需了解任何中间翻译层。
基于 SQL 的迁移通常用于
**命名:**为了被 Flyway 采用,SQL migrations 必须符合以下命名模式:
Flyway 命令行工具是一个独立的 Flyway 发行版。它在 Windows、macOS 和 Linux 上运行,主要适用于希望从命令行迁移数据库而无需将 Flyway 集成到其应用程序中也无需安装构建工具的用户。 Flyway命令行工具下载地址
注意:Flyway社区版删除了Mysql5.7的支持!!!!社区版不支持undo等命令
目录结构
配置环境变量
# Win+R 输入:
rundll32.exe sysdm.cpl,EditEnvironmentVariables
添加目录到环境变量:
添加到path中:
使用命令行测试环境变量:
示例前置条件: 一个名为 flyway的MySQL数据库。
配置数据库连接信息
在conf/flyway.conf
中配置如下信息:
配置sql文件路径
flyway.locations=filesystem:\\D:\Flyway\flyway-commandline-9.1.5-windows-x64\flyway-9.1.5\sql
添加sql脚本
执行命令flyway migrate
查看数据库中的表信息
再次执行flyway migrate
因为当前sql文件与之前没有变化,所以不会执行任何sql。
migrate
# 将架构迁移到最新版本。如果Flyway不存在,它将自动创建架构历史记录表。
flyway migrate
clean
# Clean 对开发和测试有很大帮助。通过彻底清除已配置的模式,它将有效地为您提供新的开始。所有对象(表、视图、过程……)都将被删除。注意:谨慎使用,配置中默认禁用
flyway clean
info
# 打印有关所有迁移的详细信息和状态信息。
flyway info
validate
# 根据可用的migration验证应用的迁移。验证可帮助您验证应用于数据库的迁移是否与本地可用的迁移相匹配。
flyway validate
undo
# 撤消最近应用的版本化迁移。(社区版不支持)
flyway undo
baseline
# Baseline 用于通过在特定版本上对现有数据库进行基线来将 Flyway 引入现有数据库。这将导致Migrate忽略直到并包括基线版本的所有迁移。然后将照常应用较新的迁移。
flyway baseline
repair
# 修复Flyway模式历史记录表。这将执行以下操作:
- 删除失败的迁移条目(仅适用于不支持 DDL 事务的数据库)
- 将应用迁移的校验和、描述和类型与可用迁移重新对齐
- 将所有丢失的迁移标记为已删除
flyway repair
引入依赖
<dependency>
<groupId>org.flywaydbgroupId>
<artifactId>flyway-coreartifactId>
<version>5.2.4version>
dependency>
配置迁移文件
在项目的 src/main/resources 下创建 db/migration 目录,该目录下放置需要数据迁移的文件。
编写Java程序
import org.flywaydb.core.Flyway;
/**
* @ClassName: FlywayTest
* @Description: Flyway
* @Author: Ze WANG
* @Date: 2022/8/18
**/
public class FlywayTest {
public static void main(String[] args) {
String url = "jdbc:mysql://ip:3306/flyway?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false&serverTimezone=GMT%2B8";
String user = "root";
String password = "123456";
Flyway flyway = Flyway.configure().dataSource(url, user, password).load();
flyway.migrate();
}
}
初始化数据库,运行程序观察:
前提条件,一个SpringBoot 程序
引入依赖
<dependency>
<groupId>org.flywaydbgroupId>
<artifactId>flyway-coreartifactId>
dependency>
配置application
flyway:
enabled: true
# 默认clean为false,这里为了测试,谨慎使用
clean-disabled: true
# 如果数据库不是空表需要配置为true
baseline-on-migrate: true
baseline-version: 0
locations:
- classpath:db/migration/
启动项目
# 启动项目后数据库会根据脚本变更