迁徙数据库能够说是日常工作常有的事,不过,如果一不小心把数据库搞炸了,那就麻烦大了,随着数据量的逐步减少、表构造的改变,数据库各类迁徙、降级是势在必行,所以,有一款好的迁徙工具是能够大大提高工作效率,还能很大水平上防止手动操作带来的失误或数据损坏、失落的危险。
明天,民工哥就给大家介绍一款这样的数据库迁徙神器。
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/document…
下载
下载地址: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 = InnoDB
DEFAULT 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/document…
更多更具体的使用指南大家有趣味的能够参阅官网文档:https://flywaydb.org/document…