挺带劲!这款开源数据库迁移工具超牛逼
点击下方公众号「关注」和「星标」
回复“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 客户端工具!好用到爆
号称下一代监控系统!来看看它有多牛逼
觉得文章不错,请大家随手点在看、转发支持!
挺带劲!这款开源数据库迁移工具超牛逼相关推荐
- 这款Web SSH工具超牛逼!
[微信公众号:厦门微思网络] webssh简介 这个工具是使用Python开发,可以从下面地址了解详情. 官网:https://pypi.org/project/webssh/ webssh这个工具可 ...
- 超牛逼!这款开源性能监控系统真强大~
点击关注公众号,回复"1024"获取2TB学习资源! 当网站上线后,流量增加或短暂功能故障,都会造成使用者体验相当不好,而这时该怎么快速找到性能的瓶颈呢?通常 CPU 达到 100 ...
- 还在付费使用 XShell?我选择这款超牛逼的 SSH 客户端,完全免费!
点击关注公众号,回复"1024"获取2TB学习资源! 分享过 FinallShell 这款 SSH 客户端,也是我目前常用的 SSH 客户端工具,FinalShell 使用起来方便 ...
- 几款超牛逼的 SSH 客户端工具!好用到爆
点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! 一.Windows 想来占有量最大的操作系统,得非莫属了吧,相信 Windows 系统肯定是陪伴了很多小 ...
- 什么中文版软件可以操作mysql_一款软件,几乎可以操作~所有的~“数据库”,太牛逼了!...
DBeaver是一个基于 Java 开发,免费开源的通用数据库管理和开发工具,使用非常友好的 ASL 协议.可以通过官方网站或者 Github 进行下载. 下载与安装 DBeaver 社区版可以通过官 ...
- 几款超牛逼的终端命令行工具!好用到爆
点击关注公众号,回复"1024"获取2TB学习资源! 终端是程序员的必备工具之一,本文将介绍许多牛逼且实用的开源工具,本文仅对工具做基本介绍,不提供安装方法,因为这些工具的安装方法 ...
- 再见 Teamviewer!这款国产轻量级远程桌面软件超牛逼
点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! 对很多 Mac 用户来说,想用远程控制请教下大佬,太难了. 在 Windows 上一个 QQ 就能搞定的 ...
- 开源数据库迁移工具canal
1. canal 1.1. 产品特性 canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB) ...
- 超牛逼!100 个开箱即用的 Shell 脚本,拿好了~
点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! shell脚本是帮助程序员和系统管理员完成费时费力的枯燥工作的利器,是与计算机交互并管理文件和系统操作的 ...
最新文章
- 对标Pytorch,清华团队推出自研AI框架“计图”
- 罚函数法求解约束问题最优解
- 中文表示什么_越南水果摊贴出中文标语,看清文字内容后,中国游客:不再吃了...
- python中什么可变_Python中的可变类型与不可变类型
- linux线程间通信优点,进程间通信与线程间通信【转】
- dao层如何调用对象_你的项目应该如何正确分层?
- 《101 Windows Phone 7 Apps》读书笔记-BABY MILESTONES
- 加密算法在windows,linux下的检测办法[md5,sha1]
- C#中使用ribbon界面
- morning 是字符串的内容变成good_小洁详解《R数据科学》--第十章 使用stringr处理字符串(上)...
- 用代码实现windows10下的虚拟桌面创建功能
- 生病吃什么水果你知道吗?
- Linux centos7 mysql 配置支持emoji表情包,笔记
- 您应该了解的云管理知识
- 两个苹果手机怎么定位_苹果手机录屏怎么开
- 实验三:Windows7操作系统安全
- TCP/ip 协议端口范围 详解
- ERROR: Cannot uninstall 'PyYAML'. It is a distutils installed project and thus we cannot accurately
- blog群发王(价值1980元)源代码提供 1
- 最后教一次:完美解决电脑上的流氓软件