1.摘要

当我们的应用升级时往往会伴随着数据库表结构的升级,此时就需要迁移数据库的表结构。一般我们会使用工具或者脚本来实现,手动操作毕竟有一定风险,要是能在应用启动时自动升级数据库表结构就好了!Flyway正是这么一款工具,通过Flyway和SpringBoot结合使用,在应用启动时就可以自动升级数据库表结构,非常方便,推荐给大家!

2.Flyway简介

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

Flyway具有如下特点:

  • 简单:使用和学习简单,通过不同版本的SQL脚本实现数据库迁移。
  • 专业:专注于数据库迁移功能,你无需担心有任何问题。
  • 功能强大:支持多种数据库,拥有大量的第三方工具,支持CI/DI。

3.相关概念

3.1 工作原理

使用Flyway时我们需要编写好数据库迁移的SQL脚本,比如 V1__Initial_Setup.sql中初始化了三种表,V2__First_Changes.sql中又新增了两种表。Flyway会创建flyway_schema_history表,用于存储这些SQL脚本的执行情况,从而对数据库进行版本控制。当我们使用Flyway进行数据库迁移时,Flyway会根据flyway_schema_history表中的记录,自行决定需要执行哪些SQL脚本,从而实现数据库迁移。

3.2 脚本命名规范

在创建Flyway的SQL脚本时,有些命名规范需要遵守,这些命名规范决定了Flyway执行脚本的顺序和方式,可以先参考下面的示意图。

为了能被Flyway正确执行,SQL迁移脚本需要遵循如下规范:

  • Prefix(前缀):V表示有版本号的数据库迁移,U表示一些数据库版本的回滚,R表示可重复执行的数据库迁移
  • Version(版本号):Flyway会按照版本号的大小顺序来执行数据库迁移脚本;
  • Separator(分隔符):命名时使用双下划线分隔符;
  • Description(描述):用于描述该迁移脚本的具体操作说明;
  • Suffix(后缀):表示.sql文件。

3.3 相关命令

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

3.4 命令行工具

使用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两个回滚脚本;
DROP TABLE ums_adminDELETE FROM ums_admin;
  • 使用flyway undo命令可以执行回滚,很遗憾的是社区版本不支持回滚,看样子数据库升级之前还是得通过工具做好备份才行!

3.5 Maven插件

Flyway也提供了Maven插件,插件所支持功能与命令行工具基本一致。

  • 想要在Maven项目通过插件使用Flyway,首先需要在pom.xml中添加Flyway的插件并配置好数据库连接信息;
org.flywaydb flyway-maven-plugin 7.3.2
jdbc:mysql://localhost:3306/flyway?serverTimezone=Asia/Shanghai root root
mysql mysql-connector-java 8.0.15
  • 在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

4.本地试运行

4.1 application.properties

# 是否启用flyway
spring.flyway.enabled=true
# 编码格式,默认UTF-8
spring.flyway.encoding=UTF-8
# 迁移sql脚本文件存放路径,默认db/migration
spring.flyway.locations=classpath:db/migration
# 执行前清空数据库中表,建议关闭自动清除
spring.flyway.clean-disabled=true
# 迁移sql脚本文件名称的前缀,默认V
spring.flyway.sql-migration-prefix=V
# 迁移sql脚本文件名称的分隔符,默认2个下划线__
spring.flyway.sql-migration-separator=__
# 迁移sql脚本文件名称的后缀
spring.flyway.sql-migration-suffixes=.sql
# 迁移时是否进行校验,默认true
spring.flyway.validate-on-migrate=true
# 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
spring.flyway.baseline-on-migrate=true
# 配置数据库信息表的名称
spring.flyway.table=flyway_schema_history

4.2 pom.xml

<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId>
</dependency><plugin><groupId>org.flywaydb</groupId><artifactId>flyway-maven-plugin</artifactId>
</plugin>

4.3 resources

添加需要执行的SQL(按照上述命名规范),例如

INSERT INTO `XXXXXXXXXXXXXXX`.`t_user_vaccination`(`id`, `user_id`, `actual_name`, `identity_number`, `mobile`, `type`, `street_name`, `collective_name`, `detailed_address`, `building_number`, `unit_number`, `house_number`, `member_number`, `created_by`, `created_date`, `last_modified_by`, `last_modified_date`, `remarks`, `del_flag`, `version`, `disabled_date`)
VALUES (5, 21080603, '张三', '22072319960403061X', '13666666666', 1, '街道名称', '所在集体名称', '所在集体详细地址', '所在集体楼号', '所在楼单元号', '所在单元室号', 1, '11005304', '2021-08-06 16:36:25', '11005304', '2021-08-06 14:10:42', NULL, 1, 0, NULL);

4.4 创建flyway_schema_history

CREATE TABLE `XXXXXXXXXXX`.`flyway_schema_history` (`installed_rank` INT NOT NULL,`version` VARCHAR(50),`description` VARCHAR(200) NOT NULL,`type` VARCHAR(20) NOT NULL,`script` VARCHAR(1000) NOT NULL,`checksum` INT,`installed_by` VARCHAR(100) NOT NULL,`installed_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,`execution_time` INT NOT NULL,`success` BOOL NOT NULL,CONSTRAINT `flyway_schema_history_pk` PRIMARY KEY (`installed_rank`)
) ENGINE=InnoDB

4.5 flyway_schema_history记录

本地启动后,执行SQL,并生成记录,查看数据。

Flyway-数据库迁移工具相关推荐

  1. 数据库迁移工具(一)

    数据库迁移工具(一) Flyway定义数据库的迁移 Flyway版本:5.2.4 <dependency><groupId>org.flywaydb</groupId&g ...

  2. Flyway 数据库版本管理控制

    Flyway 数据库版本管理控制 Flyway 是一个用Java编写的开源数据库版本管理工具,或者说是数据库结构变更工具,主要用于帮助开发和运维更容易地管理数据库演进过程中的各个版本. Maven 所 ...

  3. 不同库表数据库迁移工具_Microsoft提供的数据库迁移助手工具概述

    不同库表数据库迁移工具 This article gives the overview of the Database Migration Assistant Tool to access, plan ...

  4. 没有契合的数据库迁移工具,用pymysql实现一个

    版本迭代少不了数据迁移,python有自己的数据库迁移工具migrate.如果有的是其它开发语言,或者没有契合的迁移工具. 怎么自己做一个? 环境说明 项目开发语言:java 数据库: mysql 迁 ...

  5. Alembic数据库迁移工具使用

    Flask下数据库迁移 背景 在很多时候,在我们设计好模型之后,又需要进行一定的改变和更新数据操作:最直接的方式就是删除原来的旧表,但我们之前的数据也会删除:究其原因是我们不能精确记住每个修改和对应D ...

  6. python数据库迁移命令_Python 数据库迁移工具 Alembic

    Alembic 是一款轻量型的数据库迁移工具,它与 SQLAlchemy 一起共同为 Python 提供数据库管理与迁移支持. Alembic 的应用 Alembic 使用 SQLAlchemy 作为 ...

  7. flyway数据库版本控制

    一.Flyway简介 Flyway是一款数据库迁移(migration)工具.简单点说,就是在你部署应用的时候,帮你执行数据库脚本的工具.Flyway支持SQL和Java两种类型的脚本,你可以将脚本打 ...

  8. sql脚本对比工具_Java开发中用到的数据库迁移工具(flyway)

    什么是数据库版本管理? 任何web软件和应用程序都需要强大的数据库管理工具,因此开发者选择一款合适的数据库管理工具尤为重要.本文列出了几款好用的数据库管理工具(有些并非开源或免费),以供开发者们参考选 ...

  9. Spring Boot学习总结(27)—— Spring Boot中两个数据库迁移工具Liquibase和Flyway的比较

    前言 当您需要使用Java创建Web应用程序或API时,可以使用RESTful,SOAP或GraphQL.无论您是查看同步HTTP,异步还是反应式,队列中的消息或来自Kafka的事件,都很难超越Spr ...

  10. 挺带劲!这款开源数据库迁移工具超牛逼

    点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! 迁移数据库可以说是日常工作中的家常便饭,不过,如果一不小心把数据库搞炸了,那就麻烦大了(搞不好就得背锅了 ...

最新文章

  1. 云计算机机房怎么样,如何知道云电脑配置多少?怎么选择云电脑机房?
  2. 浅谈自考学习方法(二)
  3. Spring event 使用完全指南
  4. 中职计算机专业选修课程,中职学校计算机专业选修课开设的实践与研究
  5. 十 Java集合框架(2):Set接口
  6. Awesome Deep Vision
  7. php 其他页面获取session_PHP五十个提升执行效率的小技巧,和常见问题
  8. c语言参数string类型,C语言main方法的参数打印
  9. php中echo(),print(),print_r()的区别
  10. c语言 图书管理系统
  11. 微软的傲慢与偏见——Cortana小娜失败根源
  12. SOLIDWORKS生成URDF文件后部分文件散乱分布
  13. Golang http server 跨域问题与解决办法
  14. 改springboot项目遇到的@Restcontroller返回网页问题
  15. 王亮 中国科学院自动化研究所
  16. lecture11-hopfiled网络与玻尔兹曼机
  17. rand随机函数和srand初始化种子函数
  18. 清分系统层即综合中央计算机,轨道交通AFC系统介绍
  19. 自动产生一年多少周及月
  20. 面试展示:CRM项目客户管理模块展示

热门文章

  1. java lstm pb_在Tensorflow Serving上部署基于LSTM的文本分类模型
  2. 截止到20190828的前沿汇总
  3. 紫砂壶的起源 计算机操作题,紫砂壶的起源与历史发展
  4. 在远程linux服务器上用wget命令下载nuscenes数据集出现HTTP request sent, awaiting response... 403 Forbidden错误
  5. 三国演义人物词频统计-4
  6. BMFont制作字体
  7. photoshop cs5 安装过程及序列号
  8. 一键脚本搭建docker redis 集群(cluster)
  9. Ubuntu下有线连接开无线WIFI的3种方式
  10. windows键盘按键输入错乱;