• FlyWay入门教程


    Flyway

    Flyway by Redgate • 数据库迁移变得简单。 ---- 数据库的版本控制

    1. 概述

    Flyway 是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本。

    用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。

    应用场景:

    在项目或产品中,很难一开始就把业务理清楚,把数据库表设计好,因此数据表也会在迭代周期不断迭代。在Java应用程序中使用Flyway,能快速有效地用于迭代数据库表结构,并保证部署到测试环境或生产环境时,数据表都是保持一致的。

    适用人员:

    • 架构人员:搭建框架初始数据库的;
    • 开发人员:在Flyway框架下做sql改动的;

    支持的数据库包括:

    image-20220818131622705

    2. 工作原理与基本概念

    工作原理概述

    当 Flyway 连接数据库中的 schema 后,会先检查是否已存在 flyway_schema_history 表,如果没有则创建。该表用于跟踪数据库的状态,如数据迁移的版本,迁移成功状态等信息。

    flyway_schema_history 表结构:

    image-20220818141409855

    flyway_schema_history 存在后,Flyway 会扫描文件系统或应用中的 classpath 目录的数据迁移文件,然后根据它们的版本号进行按序迁移,如下图:

    img

    由于 flyway_schema_history 表中记录了迁移的版本号,如果文件的版本号小于或等于标记为当前版本的版本号,则忽略它们不执行。(并非真正忽略,而是会校验checksum值是否一致,以此来保证历史版本文件未被篡改)

    所以每次当你打算升级数据库时(包含DDL、DML语句),只需要在指定路径下创建一个版本号大于历史记录表中当前最大的版本号的迁移文件即可。在下次flyway启动时(随项目启动或其他形式),数据库将会自动完成升级,你无须再手动执行脚本。

    基本概念

    Migration(迁移)

    使用 Flyway,对数据库的所有更改都称为迁移。迁移可以是版本化的或 可重复的。版本化迁移有两种形式:常规和撤消

    Migration的方式包括:

    • SQL
    • Java
    • 脚本

    迁移最常使用SQL编写。这使得上手和利用任何现有的脚本、工具和技能变得容易。它使您可以访问数据库的全部功能,并且无需了解任何中间翻译层。

    基于 SQL 的迁移通常用于

    • DDL 更改(TABLES、VIEWS、TRIGGERS、SEQUENCES……的 CREATE/ALTER/DROP 语句)
    • 简单的参考数据更改(参考数据表中的 CRUD)
    • 简单的批量数据更改(常规数据表中的 CRUD)

    **命名:**为了被 Flyway 采用,SQL migrations 必须符合以下命名模式:

    image-20220818162235059

    3. 安装和基本使用

    命令行

    Flyway 命令行工具是一个独立的 Flyway 发行版。它在 Windows、macOS 和 Linux 上运行,主要适用于希望从命令行迁移数据库而无需将 Flyway 集成到其应用程序中也无需安装构建工具的用户。 Flyway命令行工具下载地址

    注意:Flyway社区版删除了Mysql5.7的支持!!!!社区版不支持undo等命令

    安装

    目录结构

    image-20220818135026929

    配置环境变量

    # Win+R 输入:
    rundll32.exe sysdm.cpl,EditEnvironmentVariables
    
    • 1
    • 2

    添加目录到环境变量:

    image-20220818143441301

    添加到path中:

    image-20220818143702882

    使用命令行测试环境变量:

    image-20220818143842268

    使用

    示例前置条件: 一个名为 flyway的MySQL数据库。

    image-20220818155834175

    1. 配置数据库连接信息

      conf/flyway.conf中配置如下信息:

      image-20220818150814144

    2. 配置sql文件路径

      flyway.locations=filesystem:\\D:\Flyway\flyway-commandline-9.1.5-windows-x64\flyway-9.1.5\sql
      
      • 1
    3. 添加sql脚本

      image-20220818160444917

    4. 执行命令flyway migrate

      image-20220818160404109

    5. 查看数据库中的表信息

      image-20220818160608227

    6. 再次执行flyway migrate

      在这里插入图片描述

      因为当前sql文件与之前没有变化,所以不会执行任何sql。

    命令
    1. migrate

      # 将架构迁移到最新版本。如果Flyway不存在,它将自动创建架构历史记录表。
      flyway migrate
      
      • 1
      • 2

      迁移

    2. clean

      # Clean 对开发和测试有很大帮助。通过彻底清除已配置的模式,它将有效地为您提供新的开始。所有对象(表、视图、过程……)都将被删除。注意:谨慎使用,配置中默认禁用
      flyway clean
      
      • 1
      • 2

      干净的

    3. info

      # 打印有关所有迁移的详细信息和状态信息。
      flyway info
      
      • 1
      • 2

      image-20220818163142367

    4. validate

      # 根据可用的migration验证应用的迁移。验证可帮助您验证应用于数据库的迁移是否与本地可用的迁移相匹配。
      flyway validate
      
      • 1
      • 2

      证实

    5. undo

      # 撤消最近应用的版本化迁移。(社区版不支持)
      flyway undo
      
      • 1
      • 2

      Undo

    6. baseline

      # Baseline 用于通过在特定版本上对现有数据库进行基线来将 Flyway 引入现有数据库。这将导致Migrate忽略直到并包括基线版本的所有迁移。然后将照常应用较新的迁移。
      flyway baseline
      
      • 1
      • 2

      基线

    7. repair

      # 修复Flyway模式历史记录表。这将执行以下操作:
      - 删除失败的迁移条目(仅适用于不支持 DDL 事务的数据库)
      - 将应用迁移的校验和、描述和类型与可用迁移重新对齐
      - 将所有丢失的迁移标记为已删除
      flyway repair
      
      • 1
      • 2
      • 3
      • 4
      • 5

      修理

    8. 其他(快照处于测试阶段、check需要.net支持)

    Java API

    1. 引入依赖

        
              <dependency>
                  <groupId>org.flywaydbgroupId>
                  <artifactId>flyway-coreartifactId>
                  <version>5.2.4version>
              dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    2. 配置迁移文件

      在项目的 src/main/resources 下创建 db/migration 目录,该目录下放置需要数据迁移的文件。

      image-20220818170421389

    3. 编写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();
      
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19

      初始化数据库,运行程序观察:

      image-20220818170739390

    Spring Boot

    前提条件,一个SpringBoot 程序

    1. 引入依赖

      <dependency>
          <groupId>org.flywaydbgroupId>
          <artifactId>flyway-coreartifactId>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
    2. 配置application

        flyway:
          enabled: true
      #    默认clean为false,这里为了测试,谨慎使用
          clean-disabled: true
      #    如果数据库不是空表需要配置为true
          baseline-on-migrate: true
          baseline-version: 0
          locations:
            - classpath:db/migration/
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    3. 启动项目

      # 启动项目后数据库会根据脚本变更
      
      • 1
  • 相关阅读:
    Flink1.12.7 Standalone版本安装
    【数据结构】手撕双向链表
    交换机与路由器技术-07-静态路由配置
    VIO/VINS中关于能观性/可观性的详细讲解
    C++基础篇之引用和其他细碎语法
    ResNet 09
    Java on Azure Tooling 8月更新|以应用程序为中心的视图支持及 Azure 应用服务部署状态改进
    c++ - 第11节 - stack和queue类
    java8新特性-stream流漫谈
    CANoe-vTESTstudio之Test Diagram编辑器(元素介绍)
  • 原文地址:https://blog.csdn.net/Ares___/article/details/126450394