文章目录
可以类比git来了解学习
flyway
Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。
用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同 人的sql脚本,从而做到数据库同步。
常用场景:
所有开发人员 在dev环境用migration记录数据库变更,上线时用flyway一键迁移到prod环境
概念
基线迁移 baseline migration
相当于git的.git文件,把当前目录纳入管理,记录变化,知道哪些文件要提交,哪些不用提交
对flyway来说是
flyway_schemo_history表
用来记录数据库已经执行过的migration,知道当前的基线在哪里,哪些不用执行,哪些要执行
仅在部署到新环境时可用,对于已经有数据的数据库,必须先baseline,然后才能migrate;
迁移 migration
Flyway将对数据库的所有更改都称为:migrations
直观理解为 sql脚本
migration的类型
flyway支持三种类型的migration:
Versioned migrations
:最常用的migration,可以简单的理解为数据库升级脚本Undo migrations
:数据库版本回退脚本,需要Pro版本,而且使用过程存在较大风险,undo操作目前只能通过plugin或者command-line来执行Repeatable migrations
:可重复执行的脚本,例如create or replace脚本,当脚本checksums改变时会重新执行
回调 Callbacks
一遍又一遍地执行相同的操作
Flyway在执行migrations时提供了一些列的hook,使用回调来挂钩其生命周期。
使你可以在执行过程中加入额外的操作.
migration的名称以hook名称开头即可,例如: beforeMigrate.sql
、 beforeEachMigrate.sql
、 beforeRepair__vacuum.sql
命令
*** Migrate
- 执行流程
- flyway连接到数据库database
- 检查有没有flyway_schemo_history表,没有则创建
- 获取flyway_schemo_history表的记录,获取本地migration脚本
- 对比migration脚本与flyway_schemo_history的基线记录
- 对比结果1:flyway_schemo_history空表 --> 继续向下执行
- 对比结果2:flyway_schemo_history记录与migration不匹配 --> 报错停止
- 对比结果3:flyway_schemo_history记录与migration一样 --> 忽略flyway_schemo_history记录的所有脚本
- 依次执行剩下的migration脚本,将执行结果记录到flyway_schemo_history
Clean
删除所有表 删库跑路命令,别在生产环境用
Validate
对比migration脚本与flyway_schemo_history的记录
校验迁移记录与migration脚本是否匹配
Undo
撤销 表与记录
Baseline
在有数据表 但没flyway_schemo_history的数据库中 设置基线
Repair
修复flyway_schemo_history表
删除失败的迁移条目(仅适用于不支持 DDL 事务的数据库)
将应用迁移的校验和、描述和类型与可用迁移重新对齐
将所有丢失的迁移标记为已删除
创建migration几种方式
-
SQL脚本文件
V1_2__Another_user.sql
-
java代码实现
通过JDBC来执行SQL。实现org.flywaydb.core.api.migration.jdbc.JdbcMigratio
接口来创建一个Java migration
package db.migration;
import org.flywaydb.core.api.migration.jdbc.JdbcMigration;
import java.sql.Connection;
import java.sql.PreparedStatement;
/**
* Example of a Java-based migration.
*/
public class V1_2__Another_user implements JdbcMigration {
public void migrate(Connection connection) throws Exception {
PreparedStatement statement = connection.prepareStatement("INSERT INTO test_user (name) VALUES ('Obelix')");
try {
statement.execute();
} finally {
statement.close();
}
}
}
migration命名规范:
3种使用方式
官方提供了3种使用方式
- Flyway Desktop
页面gui操作数据库版本 - Flyway CLI
独立的 Flyway 发行版。它在 Windows、macOS 和 Linux 上运行,
主要适用于希望从命令行迁移数据库而无需将 Flyway 集成到他们的应用程序或安装构建工具的用户。
比如CI/CD机器,命令行使用 - Flyway API
集成在程序中调用
下载
-
官网下载免费社区版
https://documentation.red-gate.com/fd/installers-172490864.html?_ga=2.34603878.694409062.1680082696-605502746.1678865635 -
官网有点卡,有币来我这下
【mac intel】https://download.csdn.net/download/xyc1211/87630232
Flyway Desktop
- 首页
创建项目
配置数据库
添加、导入migrations
- 点击
Add migration
添加,
- 或者点击文件图标,打开文件目录,直接把脚本放在migrations下,
然后点击Refresh
添加后如下
选择命令、执行
执行结果
- 执行完成
- 数据库里 表、数据 已经有了
- flyway_schema_history表也记录了执行的脚本
todo 高级用法
模式模型
影子数据库
将存量数据库纳入管理
Flyway CLI
- 下载,解压,目录如下:
flyway-9.16.1
conf
flyway.conf configuration file
drivers JDBC drivers
jars Java-based migrations (as jars)
jre
lib
licenses
sql SQL migrations
flyway macOS/Linux 可执行文件
flyway.cmd Windows 可执行文件
-
将“flyway-9.16.1”目录添加到“PATH”中,使“flyway”命令在系统的任何位置都可用。
-
命令用法:
> flyway [选项] 命令
Flyway API
Maven项目
pom引入 免费社区版Flyway
<dependencies>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>9.16.1</version>
</dependency>
<!-- 基线迁移 -->
<groupId>org.flywaydb.enterprise</groupId>
<artifactId>flyway-proprietary</artifactId>
<version>9.16.1</version>
</dependencies>
编写 Flyway 类
import org.flywaydb.core.Flyway;
...
// 连接数据库
Flyway flyway = Flyway.configure().dataSource(url, user, password).load();
// 执行命令
flyway.migrate();
// Start the rest of the application (incl. Hibernate)
...