flyway:数据库版本管理

文章目录

  • flyway
  • 概念
    • 迁移 migration
    • 基线迁移 baseline migration
    • 回调 Callbacks
  • 命令
    • *** Migrate
    • Clean
    • Validate
    • Undo
    • Baseline
    • Repair
  • 创建migration几种方式
    • migration命名规范:
  • 使用
      • Maven项目
      • maven插件

https://flywaydb.org/

flyway

Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。
用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同 人的sql脚本,从而做到数据库同步。

常用场景:所有开发人员 在dev环境用migration记录数据库变更,上线时用flyway一键迁移到prod环境

概念

迁移 migration

Flyway将对数据库的所有更改都称为:migrations
直观理解为 sql脚本

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

基线迁移 baseline migration

flyway_schemo_history表,用来记录数据库已经执行过的migration

仅在部署到新环境时,对于已经有数据的数据库,必须先baseline,然后才能migrate;

回调 Callbacks

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

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

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


命令

*** Migrate

flyway:数据库版本管理_第1张图片

  • 执行流程
  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

删除所有表 删库跑路命令,别在生产环境用
flyway:数据库版本管理_第2张图片

Validate

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

Undo

撤销 表与记录
flyway:数据库版本管理_第3张图片

Baseline

在有数据表 但没flyway_schemo_history的数据库中 设置基线
flyway:数据库版本管理_第4张图片

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命名规范:

flyway:数据库版本管理_第5张图片

使用

官方提供了命令行、API、以及 Maven 和 Gradle 插件的方式

Maven项目

pom引入 Flyway

<dependency>
    <groupId>org.flywaydbgroupId>
    <artifactId>flyway-coreartifactId>
dependency>

在应用启动时,会在默认路径 classpath:db/migration 查找 sql 脚本自动执行。如果没找到会报错,影响应用启动。

无需其他配置,Flyway 的功能是自动启用的,如果想停用 Flyway,需设置 spring.flyway.enabled=false

启动成功后,可在所指定的数据库中的 flyway_schema_history 表中查看初始化脚本执行状态。

maven插件

pom引入flyway的插件,同时配置好对应的数据库连接。

            <plugin>
                <groupId>org.flywaydbgroupId>
                <artifactId>flyway-maven-pluginartifactId>
                <version>5.2.4version>
                <configuration>
                    <url>jdbc:mysql://localhost:3306/flyway?useUnicode=true&characterEncoding=utf8&serverTimezone=GMTurl>
                    <user>rootuser>
                    <password>rootpassword>![enter image description here](/tencent/api/attachments/s3/url?attachmentid=176209)
                    <driver>com.mysql.cj.jdbc.Driverdriver>
                configuration>
            plugin>

你可能感兴趣的:(中间件,数据库,git,database)