关于mysql:数据库迁移搞炸了没用这款开源神器的锅

42次阅读

共计 7500 个字符,预计需要花费 19 分钟才能阅读完成。

当咱们的利用降级时往往会随同着数据库表构造的降级,此时就须要迁徙数据库的表构造。个别咱们会应用工具或者脚本来实现,手动操作毕竟有肯定危险,要是能在利用启动时主动降级数据库表构造就好了!Flyway 正是这么一款工具,通过 Flyway 和 SpringBoot 联合应用,在利用启动时就能够主动降级数据库表构造,十分不便,举荐给大家!

SpringBoot 实战电商我的项目 mall(40k+star)地址:https://github.com/macrozheng/mall

Flyway 简介

Flyway 是一款数据库迁徙工具,它让数据库迁徙变得更加简略。它能像 Git 一样对数据库进行版本控制,反对命令行工具、Maven 插件、第三方工具(比方 SpringBoot)等多种应用形式。

Flyway 具备如下特点:

  • 简略:应用和学习简略,通过不同版本的 SQL 脚本实现数据库迁徙。
  • 业余:专一于数据库迁徙性能,你无需放心有任何问题。
  • 功能强大:反对多种数据库,领有大量的第三方工具,反对 CI/DI。

相干概念

工作原理

应用 Flyway 时咱们须要编写好数据库迁徙的 SQL 脚本,比方 V1__Initial_Setup.sql 中初始化了三种表,V2__First_Changes.sql中又新增了两种表。Flyway 会创立 flyway_schema_history 表,用于存储这些 SQL 脚本的执行状况,从而对数据库进行版本控制。当咱们应用 Flyway 进行数据库迁徙时,Flyway 会依据 flyway_schema_history 表中的记录,自行决定须要执行哪些 SQL 脚本,从而实现数据库迁徙。

脚本命名标准

在创立 Flyway 的 SQL 脚本时,有些命名标准须要恪守,这些命名标准决定了 Flyway 执行脚本的程序和形式,能够先参考上面的示意图。

为了能被 Flyway 正确执行,SQL 迁徙脚本须要遵循如下标准:

  • Prefix(前缀):V示意有版本号的数据库迁徙,U示意一些数据库版本的回滚,R示意可反复执行的数据库迁徙;
  • Version(版本号):Flyway 会依照版本号的大小程序来执行数据库迁徙脚本;
  • Separator(分隔符):命名时应用双下划线分隔符;
  • Description(形容):用于形容该迁徙脚本的具体操作阐明;
  • Suffix(后缀):示意 .sql 文件。

相干命令

  • migrate:数据库迁徙命令,会依据设置好的 SQL 脚本间接将数据库表降级至最新版本。
  • clean:删除数据库中所有的表,千万别在生产环境上应用。
  • info:打印所有对于数据库迁徙的详细信息和状态信息。
  • validate:验证数据库迁徙是否可用。
  • undo:对数据库迁徙进行回滚操作。
  • baseline:以现有数据库为基准,创立 flyway_schema_history 表,大于基准版本的数据库迁徙才会被利用。
  • repair:修复 flyway_schema_history 表。

命令行工具

应用 Flyway 实现数据迁徙有多种形式,咱们先通过命令行工具的办法来体验下 Flyway 的应用。

  • 首先须要下载 Flyway 的命令行工具,下载社区版即可,下载地址:https://flywaydb.org/download

  • 下载实现后进行解压,解压实现后目录构造如下;

  • 批改 Flyway 的配置文件/conf/flyway.conf,批改下数据库配置即可;
flyway.url=jdbc:mysql://localhost:3306/flyway?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai 
flyway.user=root
flyway.password=root
  • /sql 目录下增加 SQL 执行脚本,这里增加创立 ums_admin 表的执行脚本V1.0.1__Create_ums_admin_table.sql
CREATE TABLE `ums_admin`
(`id`          bigint(20) NOT NULL AUTO_INCREMENT,
  `username`    varchar(64)  DEFAULT NULL,
  `password`    varchar(64)  DEFAULT NULL,
  `icon`        varchar(500) DEFAULT NULL COMMENT '头像',
  `email`       varchar(100) DEFAULT NULL COMMENT '邮箱',
  `nick_name`   varchar(200) DEFAULT NULL COMMENT '昵称',
  `note`        varchar(500) DEFAULT NULL COMMENT '备注信息',
  `create_time` datetime     DEFAULT NULL COMMENT '创立工夫',
  `login_time`  datetime     DEFAULT NULL COMMENT '最初登录工夫',
  `status`      int(1)       DEFAULT '1' COMMENT '帐号启用状态:0-> 禁用;1-> 启用',
  PRIMARY KEY (`id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 8
  DEFAULT CHARSET = utf8 COMMENT ='后盾用户表';
  • 应用 flyway migrate 命令进行数据迁徙,此时咱们会发现须要先应用 flyway baseline 命令创立保留迁徙记录的表 flyway_schema_history 才行;

  • 先应用 flyway baseline 命令,再应用 flyway migrate 命令,命令行会输入执行胜利的信息;

  • \sql 目录下增加 SQL 执行脚本,给 ums_admin 表增加一些数据,执行脚本为V1.0.2__Add_ums_admin.sql
INSERT INTO ums_admin (username, PASSWORD, email, nick_name, STATUS)
VALUES ('test', '123456', 'test@qq.com', '测试账号', 1);
INSERT INTO ums_admin (username, PASSWORD, email, nick_name, STATUS)
VALUES ('macro', '123456', 'macro@qq.com', '一般账号', 1);
INSERT INTO ums_admin (username, PASSWORD, email, nick_name, STATUS)
VALUES ('andy', '123456', 'andy@qq.com', '一般账号', 1);
  • 咱们能够应用 flyway info 命令查看 flyway_schema_history 表中的数据迁徙记录,能够发现 1.0.2 版本的更新还处于 Pending 状态,应用 flyway migrate 命令后变为Success

  • 咱们能够创立可反复执行的 SQL 脚本,通常能够用来创立视图、存储过程、函数等,比方基于 ums_admin 表创立一个视图,执行脚本为R__Ums_admin_view.sql;
CREATE
  OR REPLACE VIEW ums_admin_view AS
SELECT username,
       PASSWORD,
       email
FROM ums_admin;
  • 应用 flyway migrate 命令能够反复执行(当 R 结尾的脚本有变更时),该脚本会在所有 V 结尾的脚本执行实现后执行;

  • Flyway 的回滚机制须要依赖 SQL 脚本,这里创立 U1.0.1__Create_ums_admin_table.sqlU1.0.2__Add_ums_admin.sql两个回滚脚本;
# U1.0.1__Create_ums_admin_table.sql
DROP TABLE ums_admin
# U1.0.2__Add_ums_admin.sql
DELETE FROM ums_admin;
  • 应用 flyway undo 命令能够执行回滚,很遗憾的是社区版本不反对回滚,看样子数据库降级之前还是得通过工具做好备份才行!

Maven 插件

Flyway 也提供了 Maven 插件,插件所反对性能与命令行工具基本一致。

  • 想要在 Maven 我的项目通过插件应用 Flyway,首先须要在 pom.xml 中增加 Flyway 的插件并配置好数据库连贯信息;
<!--Flyway 的 Maven 插件 -->
<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>7.3.2</version>
    <configuration>
        <url>jdbc:mysql://localhost:3306/flyway?serverTimezone=Asia/Shanghai</url>
        <user>root</user>
        <password>root</password>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
    </dependencies>
</plugin>
  • 在 resouce 目录下创立 db\migration 目录,将数据库降级应用的 SQL 脚本放入进去;

  • Flyway 的 Maven 插件反对如下几种命令;

  • 双击 flyway:info 命令应用,输入如下内容,此形式与命令行工具应用根本没啥区别。
[INFO] --- flyway-maven-plugin:7.3.2:info (default-cli) @ mall-tiny-flyway ---
[INFO] Flyway Community Edition 7.3.2 by Redgate
[INFO] Database: jdbc:mysql://localhost:3306/flyway (MySQL 5.7)
[INFO] Schema version: 1.0.2
[INFO] 
[INFO] +------------+---------+------------------------+----------+---------------------+----------+
| Category   | Version | Description            | Type     | Installed On        | State    |
+------------+---------+------------------------+----------+---------------------+----------+
|            | 1       | << Flyway Baseline >>  | BASELINE | 2020-12-24 11:17:35 | Baseline |
| Versioned  | 1.0.1   | Create ums admin table | SQL      | 2020-12-24 11:17:42 | Success  |
| Versioned  | 1.0.2   | Add ums admin          | SQL      | 2020-12-24 11:33:40 | Success  |
| Repeatable |         | Ums admin view         | SQL      | 2020-12-24 11:33:40 | Success  |
+------------+---------+------------------------+----------+---------------------+----------+

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.076 s
[INFO] Finished at: 2020-12-24T14:28:16+08:00
[INFO] Final Memory: 28M/286M
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

联合 SpringBoot 应用

因为 SpringBoot 官网曾经反对了 Flyway,所以 Flyway 联合 SpringBoot 应用非常简单!

  • 首先在 pom.xml 中增加 Flyway 相干依赖,留神无需增加 Flyway 的版本号:
<!--Flyway 相干依赖 -->
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>
  • 批改配置文件application.yml,对数据源和 Flyway 进行配置;
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/flyway?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
  flyway:
    # 启用 Flyway 性能
    enabled: true
    # 禁用 Flyway 的 clean 命令,应用 clean 命令会删除 schema 下的所有表
    clean-disabled: true
    # 设置 Flyway 的 SQL 脚本门路
    locations: classpath:db/migration
    # 设置版本信息管制表名称,默认 flyway_schema_history
    table: flyway_schema_history
    # 在执行 migrate 命令时须要有 flyway_schema_history 表,通过 baseline 命令能够生成该表
    baseline-on-migrate: true
    # 指定 baseline 版本号,低于该版本的 SQL 脚本在 migrate 是不会执行
    baseline-version: 1
    # 设置字符编码
    encoding: UTF-8
    # 不容许不按程序迁徙
    out-of-order: false
    # 设置 Flyway 管控的 schema,不设置的话为 datasourcel.url 中指定的 schema
    schemas: flyway
    # 执行 migrate 时开启校验
    validate-on-migrate: true
  • 最初间接运行 SpringBoot 利用,即可主动创立好对应的数据库,控制台会输入如下信息。
2020-12-24 14:38:15.659  INFO 10716 --- [main] o.f.c.internal.license.VersionPrinter    : Flyway Community Edition 6.4.1 by Redgate
2020-12-24 14:38:15.898  INFO 10716 --- [main] o.f.c.internal.database.DatabaseFactory  : Database: jdbc:mysql://localhost:3306/flyway (MySQL 5.7)
2020-12-24 14:38:15.972  INFO 10716 --- [main] o.f.core.internal.command.DbValidate     : Successfully validated 3 migrations (execution time 00:00.047s)
2020-12-24 14:38:15.988  INFO 10716 --- [main] o.f.c.i.s.JdbcTableSchemaHistory         : Creating Schema History table `flyway`.`flyway_schema_history` with baseline ...
2020-12-24 14:38:16.106  INFO 10716 --- [main] o.f.core.internal.command.DbBaseline     : Successfully baselined schema with version: 1
2020-12-24 14:38:16.122  INFO 10716 --- [main] o.f.core.internal.command.DbMigrate      : Current version of schema `flyway`: 1
2020-12-24 14:38:16.134  INFO 10716 --- [main] o.f.core.internal.command.DbMigrate      : Migrating schema `flyway` to version 1.0.1 - Create ums admin table
2020-12-24 14:38:16.248  INFO 10716 --- [main] o.f.core.internal.command.DbMigrate      : Migrating schema `flyway` to version 1.0.2 - Add ums admin
2020-12-24 14:38:16.281  INFO 10716 --- [main] o.f.core.internal.command.DbMigrate      : Migrating schema `flyway` with repeatable migration Ums admin view
2020-12-24 14:38:16.314  INFO 10716 --- [main] o.f.core.internal.command.DbMigrate      : Successfully applied 3 migrations to schema `flyway` (execution time 00:00.206s)

总结

比照手动降级数据库表构造,应用 Flyway 主动降级更有劣势。应用 Flyway 能够在咱们降级利用时同时降级数据库,因为社区版本目前不反对数据库回滚,降级前做好备份是很有必要的。

参考资料

官网文档:https://flywaydb.org/document…

我的项目源码地址

https://github.com/macrozheng…

本文 GitHub https://github.com/macrozheng/mall-learning 曾经收录,欢送大家 Star!

正文完
 0