点击下方公众号「关注」和「星标」

回复“1024”获取独家整理的学习资料!

迁移数据库可以说是日常工作中的家常便饭,不过,如果一不小心把数据库搞炸了,那就麻烦大了(搞不好就得背锅了)。随着数据量的逐渐增加、表结构的改动,数据库各类迁移、升级是势在必行。所以,有一款好的迁移工具是可以大大提高工作效率,还能很大程度上避免手动操作带来的失误或数据损坏、丢失的风险。

今天,民工哥就给大家介绍一款这样的数据库迁移神器。

Flyway简介

flyway 是一个敏捷工具,用于数据库的移植。采用 Java 开发,支持所有兼容 JDBC 的数据库。主要用于在你的应用版本不断升级的同时,升级你的数据库结构和里面的数据。

Flyway 特点
  • 简单:使用和学习简单,通过不同版本的SQL脚本实现数据库迁移。

  • 专业:专注于数据库迁移功能,你无需担心有任何问题。

  • 功能强大:支持多种数据库,拥有大量的第三方工具,支持CI/DI。

工作平台

Windows,macOS,Linux,Docker,Java 和 Android

支持的构建工具

Maven 和 Gradle

支持的数据库

Oracle、SQL Server、DB2、MySQL、Aurora MySQL、MariaDB、Percona XtraDB群集、PostgreSQL、Aurora PostgreSQL、Redshift、CockroachDB、SAP HANA、Sybase ASE、Informix、H2、HSQLDB、Derby、SQLite、Firebird

Flyway 工作原理

一开始你向Flyway指向一个空数据库时:

它就会去查找schema历史表,如果此时数据库是空的,FlyWAY会自己创建一张历史表,然后现在就有了一个仅包含空表flyway_schema_history(默认)的数据库。

flyway_schema_history 这个表用来跟踪数据库的状态。

数据库的迁移是按版本号来顺序执行的:

每次迁移被执行后 schema_history表会依此更新记录

后面如果再次迁移的话,Flyway会再次扫描应用的文件系统和类路径、历史表检查,如果版本号低于或等于当前版本号,则忽略迁移操作。

增量迁移

仍然按版本号进行:

schema_history历史表会依此更新记录

整个过程就是这样的!每次需要修改数据库时,无论是结构 (DDL) 还是参考数据 (DML),只需创建一个版本号高于当前版本号的新迁移。下次 Flyway 启动时,它会找到它并相应地升级数据库。

参考地址:https://flywaydb.org/documentation/getstarted/how

下载

下载地址:https://flywaydb.org/download

有免费与收费版本可供选择,我们当然选择最好用的免费版本了,哈哈哈哈。。。。

Linux系统
wget -qO- https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/7.11.0/flyway-commandline-7.11.0-linux-x64.tar.gz | tar xvz && ln -s `pwd`/flyway-7.11.0/flyway /usr/local/bin
Docker
sh -c 'echo "docker run --rm flyway/flyway:7.11.0 $*" > /usr/local/bin/flyway && chmod +x /usr/local/bin/flyway'
目录结构
[root@centos7 ~]# tree -L 1 ./flyway-7.11.0
./flyway-7.11.0
├── conf       #配置文件
├── drivers    #JDBD驱动程序
├── flyway     #macOS/Linux 可执行文件
├── flyway.cmd #Windows 可执行文件
├── jars       #基于 Java 的迁移(作为 jars)
├── jre
├── lib
├── licenses
├── README.txt
└── sql       #SQL 迁移7 directories, 3 files

使用

使用之前需要了解的一些概念
  • 版本:对数据库的每一次变更可称为一个版本

  • 迁移:Flyway把数据库结构从一个版本更新到另一个版本叫做迁移

  • 可用的迁移:Flyway的文件系统识别出来的迁移版本

  • 已经应用的迁移:Flyway已经对数据库执行过的迁移

命令行使用
> flyway [options] command
flyway主要基于6种基本命令
migrate  #迁移数据库
clean    #清除所有配置
info     #打印迁移相关的详细信息与状态信息
validate #验证迁移的可用性
baseline #为现有数据库创建基准版本,高于基准版本的才会被执行迁移动作
repair   #修改 schema history 表

修改配置文件

[root@centos7 ~]# cd ./flyway-7.11.0/conf/
[root@centos7 conf]# ll
total 24
-rw-r--r-- 1 root root 22943 Jul  1  2021 flyway.conf
[root@centos7 conf]# vim flyway.conf
flyway.url=jdbc:mysql://localhost:3306/mingongge?useUnicode=true
flyway.user=root
flyway.password=123456
准备一个测试用的sql脚本

这里还得提一下命令规范的问题,否则后续的sql脚本无法执行。

  • Prefix(前缀):V 用于数据库迁移的版本号,U 用于数据库回滚的版本号,R 表示可重复执行的数据库迁移

  • Version(版本号):Flyway会按照版本号的大小顺序来执行数据库迁移脚本

  • Separator(分隔符):使用双下划线分隔符

  • Description(描述):用于描述迁移脚本的说明性文字

  • Suffix(后缀):.sql文件

在sql目录下面添加一个测试sql脚本,这里是一个简单的创建表的语句。

[root@centos7 sql]# pwd
/root/flyway-7.11.0/sql
[root@centos7 sql]# cat V1.0__Create_test_table.sql
CREATE TABLE `test_table`
(`id`          bigint(10)   NOT NULL,`username`    varchar(64)  DEFAULT NULL,`password`    varchar(64)  DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8 COMMENT ='测试表';
开始迁移
[root@centos7 ~]# flyway migrate
Flyway Teams Edition 7.11.0 by Redgate
Database: jdbc:mysql://localhost:3306/mingongge (MySQL 5.7)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://flywaydb.org/?ref=v7.11.0_teams
----------------------------------------
Successfully validated 0 migrations (execution time 00:00.028s)
WARNING: No migrations found. Are your locations set up correctly?
ERROR: Found non-empty schema(s) `mingongge` but no schema history table. Use baseline() or set baselineOnMigrate to true to initialize the schema history table.

最后的提示很明白,需要创建schema history table,那么好吧,创建一个呗。

[root@centos7 ~]# flyway baseline
Flyway Teams Edition 7.11.0 by Redgate
Database: jdbc:mysql://localhost:3306/mingongge (MySQL 5.7)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://flywaydb.org/?ref=v7.11.0_teams
----------------------------------------
Creating Schema History table `mingongge`.`flyway_schema_history` with baseline ...
Successfully baselined schema with version: 1

再次执行

[root@centos7 sql]# flyway migrate
Flyway Teams Edition 7.11.0 by Redgate
Database: jdbc:mysql://localhost:3306/mingongge (MySQL 5.7)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://flywaydb.org/?ref=v7.11.0_teams
----------------------------------------
Successfully validated 1 migration (execution time 00:00.225s)
Migrating schema `mingongge` to version "1.0 - Create test table"
Successfully applied 1 migration to schema `mingongge`, now at version v1.0 (execution time 00:00.356s)

增加数据进行迁移测试。还是在sql目录下创建脚本V1.0.1__add_data.sql

[root@centos7 ~]# cat flyway-7.11.0/sql/V1.0.1__add_data.sql
INSERT INTO test_table (id,username, PASSWORD)
VALUES ('001','test1', '123456');
INSERT INTO test_table (id,username, PASSWORD)
VALUES ('002','test2', '123456');

这个时候查看状态信息,可以发现如下:

执行迁移动作

[root@centos7 ~]# flyway migrate
Flyway Teams Edition 7.11.0 by Redgate
Database: jdbc:mysql://localhost:3306/mingongge (MySQL 5.7)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://flywaydb.org/?ref=v7.11.0_teams
----------------------------------------
Successfully validated 2 migrations (execution time 00:00.042s)
Current version of schema `mingongge`: 1.0
Migrating schema `mingongge` to version "1.0.1 - add data"
Successfully applied 1 migration to schema `mingongge`, now at version v1.0.1 (execution time 00:00.170s)

查看状态信息

回滚

先创建一个回滚脚本,注意命名规范,这个会让很多人踩坑的。。。。切记!!!!

[root@centos7 sql]# cat U1.0.1__delete_data.sql
DELETE FROM test_table;

注意:这里的回滚,一定是回滚到已存在的版本号,所以命名时注意版本号这块,如果这里写成1.0,就会出现报错:

ERROR: Unable to undo migration to version 1.0.1 as no corresponding undo migration has been found.

执行回滚

[root@centos7 ~]# flyway undo
Flyway Teams Edition 7.11.0 by Redgate
Database: jdbc:mysql://localhost:3306/mingongge (MySQL 5.7)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://flywaydb.org/?ref=v7.11.0_teams
----------------------------------------
Current version of schema `mingongge`: 1.0.1
Undoing migration of schema `mingongge` to version 1.0.1 - delete data
Successfully undid 1 migration to schema `mingongge`, now at version v1.0 (execution time 00:00.256s)

查看状态

从上图中也可以看出V1.0.1这个版本的脚本现处于Pending状态。

其它集成

Flyway也提供了Maven插件,也可以在Maven中使用这个工具,添加maven依赖,在pom.xml文件中配置连接数据的信息。

<!--引入flyway插件-->
<plugin><groupId>org.flywaydb</groupId><artifactId>flyway-maven-plugin</artifactId><version>7.11.0</version><configuration><url>jdbc:mysql://localhost:3306/mingongge</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>

然写同上面的方法一样写脚本,放在resources/db/migration目录下。打开idea控制台,输入mvn flyway:migrate,出现BUILD SUCCESS即执行成功。

详细的配置及用法请参阅官方手册:https://flywaydb.org/documentation/usage/maven/

更多更详细的使用指南大家有兴趣的可以参阅官方文档:https://flywaydb.org/documentation/

我的新书:《 Linux系统运维指南 》已出版

推荐阅读 点击标题可跳转

干掉 Swagger (丝袜哥),试试这个新工具!

再见!Eclipse

程序员缺乏经验的 7 种表现!

北京最最最牛逼的 IT 公司全在这了!

分布式事务的 6 种解决方案,写得非常好!

几款超牛逼的 SSH 客户端工具!好用到爆

号称下一代监控系统!来看看它有多牛逼

觉得文章不错,请大家随手点在看、转发支持!

挺带劲!这款开源数据库迁移工具超牛逼相关推荐

  1. 这款Web SSH工具超牛逼!

    [微信公众号:厦门微思网络] webssh简介 这个工具是使用Python开发,可以从下面地址了解详情. 官网:https://pypi.org/project/webssh/ webssh这个工具可 ...

  2. 超牛逼!这款开源性能监控系统真强大~

    点击关注公众号,回复"1024"获取2TB学习资源! 当网站上线后,流量增加或短暂功能故障,都会造成使用者体验相当不好,而这时该怎么快速找到性能的瓶颈呢?通常 CPU 达到 100 ...

  3. 还在付费使用 XShell?我选择这款超牛逼的 SSH 客户端,完全免费!

    点击关注公众号,回复"1024"获取2TB学习资源! 分享过 FinallShell 这款 SSH 客户端,也是我目前常用的 SSH 客户端工具,FinalShell 使用起来方便 ...

  4. 几款超牛逼的 SSH 客户端工具!好用到爆

    点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! 一.Windows 想来占有量最大的操作系统,得非莫属了吧,相信 Windows 系统肯定是陪伴了很多小 ...

  5. 什么中文版软件可以操作mysql_一款软件,几乎可以操作~所有的~“数据库”,太牛逼了!...

    DBeaver是一个基于 Java 开发,免费开源的通用数据库管理和开发工具,使用非常友好的 ASL 协议.可以通过官方网站或者 Github 进行下载. 下载与安装 DBeaver 社区版可以通过官 ...

  6. 几款超牛逼的终端命令行工具!好用到爆

    点击关注公众号,回复"1024"获取2TB学习资源! 终端是程序员的必备工具之一,本文将介绍许多牛逼且实用的开源工具,本文仅对工具做基本介绍,不提供安装方法,因为这些工具的安装方法 ...

  7. 再见 Teamviewer!这款国产轻量级远程桌面软件超牛逼

    点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! 对很多 Mac 用户来说,想用远程控制请教下大佬,太难了. 在 Windows 上一个 QQ 就能搞定的 ...

  8. 开源数据库迁移工具canal

    1. canal 1.1. 产品特性 canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB) ...

  9. 超牛逼!100 个开箱即用的 Shell 脚本,拿好了~

    点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! shell脚本是帮助程序员和系统管理员完成费时费力的枯燥工作的利器,是与计算机交互并管理文件和系统操作的 ...

最新文章

  1. 对标Pytorch,清华团队推出自研AI框架“计图”
  2. 罚函数法求解约束问题最优解
  3. 中文表示什么_越南水果摊贴出中文标语,看清文字内容后,中国游客:不再吃了...
  4. python中什么可变_Python中的可变类型与不可变类型
  5. linux线程间通信优点,进程间通信与线程间通信【转】
  6. dao层如何调用对象_你的项目应该如何正确分层?
  7. 《101 Windows Phone 7 Apps》读书笔记-BABY MILESTONES
  8. 加密算法在windows,linux下的检测办法[md5,sha1]
  9. C#中使用ribbon界面
  10. morning 是字符串的内容变成good_小洁详解《R数据科学》--第十章 使用stringr处理字符串(上)...
  11. 用代码实现windows10下的虚拟桌面创建功能
  12. 生病吃什么水果你知道吗?
  13. Linux centos7 mysql 配置支持emoji表情包,笔记
  14. 您应该了解的云管理知识
  15. 两个苹果手机怎么定位_苹果手机录屏怎么开
  16. 实验三:Windows7操作系统安全
  17. TCP/ip 协议端口范围 详解
  18. ERROR: Cannot uninstall 'PyYAML'. It is a distutils installed project and thus we cannot accurately
  19. blog群发王(价值1980元)源代码提供 1
  20. 最后教一次:完美解决电脑上的流氓软件

热门文章

  1. 适用于编程开发自学的学习网站
  2. NATO(北大西洋公约组织)采用ADOBE FLEX作为作战支持系统
  3. Java毕设_装修公司业务流程管理系统的设计与实现
  4. 国产手机销量大跌,终于被迫降价抛售清理库存
  5. 联想拯救者Y9000P 2022 配置
  6. python写金字塔(数字金字塔)
  7. python高阶学习之一:c++调用python
  8. 电脑录屏怎么把声音录进去?这些方法可以帮到你!
  9. 如何在vue中设置全局方法
  10. 关于Linux中的apt-get的相关操作及原理