flyway:数据库版本管理

https://flywaydb.org/

可以类比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:

  1. Versioned migrations:最常用的migration,可以简单的理解为数据库升级脚本
  2. Undo migrations:数据库版本回退脚本,需要Pro版本,而且使用过程存在较大风险,undo操作目前只能通过plugin或者command-line来执行
  3. Repeatable migrations可重复执行的脚本,例如create or replace脚本,当脚本checksums改变时会重新执行

回调 Callbacks

一遍又一遍地执行相同的操作

Flyway在执行migrations时提供了一些列的hook,使用回调来挂钩其生命周期。
使你可以在执行过程中加入额外的操作.

migration的名称以hook名称开头即可,例如: beforeMigrate.sqlbeforeEachMigrate.sqlbeforeRepair__vacuum.sql


命令

*** Migrate

在这里插入图片描述

  • 执行流程
  1. flyway连接到数据库database
  2. 检查有没有flyway_schemo_history表,没有则创建
  3. 获取flyway_schemo_history表的记录,获取本地migration脚本
  4. 对比migration脚本与flyway_schemo_history的基线记录
    1. 对比结果1:flyway_schemo_history空表 --> 继续向下执行
    2. 对比结果2:flyway_schemo_history记录与migration不匹配 --> 报错停止
    3. 对比结果3:flyway_schemo_history记录与migration一样 --> 忽略flyway_schemo_history记录的所有脚本
  5. 依次执行剩下的migration脚本,将执行结果记录到flyway_schemo_history

Clean

删除所有表 删库跑路命令,别在生产环境用
在这里插入图片描述

Validate

对比migration脚本与flyway_schemo_history的记录
校验迁移记录与migration脚本是否匹配

Undo

撤销 表与记录
在这里插入图片描述

Baseline

在有数据表 但没flyway_schemo_history的数据库中 设置基线
在这里插入图片描述

Repair

修复flyway_schemo_history表

删除失败的迁移条目(仅适用于不支持 DDL 事务的数据库)
将应用迁移的校验和、描述和类型与可用迁移重新对齐
将所有丢失的迁移标记为已删除


创建migration几种方式

  1. SQL脚本文件
    V1_2__Another_user.sql

  2. 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种使用方式

  1. Flyway Desktop
    页面gui操作数据库版本
  2. Flyway CLI
    独立的 Flyway 发行版。它在 Windows、macOS 和 Linux 上运行,
    主要适用于希望从命令行迁移数据库而无需将 Flyway 集成到他们的应用程序或安装构建工具的用户。
    比如CI/CD机器,命令行使用
  3. 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

在这里插入图片描述

  1. 点击 Add migration 添加,
    在这里插入图片描述
  2. 或者点击文件图标,打开文件目录,直接把脚本放在migrations下,
    然后点击Refresh
    在这里插入图片描述
    添加后如下
    在这里插入图片描述

选择命令、执行

在这里插入图片描述

执行结果

  • 执行完成
    在这里插入图片描述
  • 数据库里 表、数据 已经有了
    在这里插入图片描述
  • flyway_schema_history表也记录了执行的脚本
    在这里插入图片描述
todo 高级用法

模式模型
影子数据库
将存量数据库纳入管理

Flyway CLI

  1. 下载,解压,目录如下:
 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 可执行文件
  1. 将“flyway-9.16.1”目录添加到“PATH”中,使“flyway”命令在系统的任何位置都可用。

  2. 命令用法:

> 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)
...
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值