迁移数据库可以说是日常工作中的家常便饭,不过,如果一不小心把数据库搞炸了,那就麻烦大了(搞不好就得背锅了)。随着数据量的逐渐增加、表结构的改动,数据库各类迁移、升级是势在必行。所以,有一款好的迁移工具是可以大大提高工作效率,还能很大程度上避免手动操作带来的失误或数据损坏、丢失的风险。
今天,民工哥就给大家介绍一款这样的数据库迁移神器。
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|tarxvz&&ln-s`pwd`/flyway-7.11.0/flyway/usr/local/bin
Docker
sh-c'echo"dockerrun--rmflyway/flyway:7.11.0$*">/usr/local/bin/flyway&&chmod+x/usr/local/bin/flyway'
目录结构
[root@centos7~]#tree-L1./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迁移 7directories,3files
使用
使用之前需要了解的一些概念
-
版本:对数据库的每一次变更可称为一个版本
-
迁移:Flyway把数据库结构从一个版本更新到另一个版本叫做迁移
-
可用的迁移:Flyway的文件系统识别出来的迁移版本
-
已经应用的迁移:Flyway已经对数据库执行过的迁移
命令行使用
>flyway[options]command
flyway主要基于6种基本命令
migrate#迁移数据库 clean#清除所有配置 info#打印迁移相关的详细信息与状态信息 validate#验证迁移的可用性 baseline#为现有数据库创建基准版本,高于基准版本的才会被执行迁移动作 repair#修改schemahistory表
修改配置文件
[root@centos7~]#cd./flyway-7.11.0/conf/ [root@centos7conf]#ll total24 -rw-r--r--1rootroot22943Jul12021flyway.conf [root@centos7conf]#vimflyway.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@centos7sql]#pwd /root/flyway-7.11.0/sql [root@centos7sql]#catV1.0__Create_test_table.sql CREATETABLE`test_table` ( `id`bigint(10)NOTNULL, `username`varchar(64)DEFAULTNULL, `password`varchar(64)DEFAULTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDB DEFAULTCHARSET=utf8COMMENT='测试表';
开始迁移
[root@centos7~]#flywaymigrate FlywayTeamsEdition7.11.0byRedgate Database:jdbc:mysql://localhost:3306/mingongge(MySQL5.7) ---------------------------------------- FlywayTeamsfeaturesareenabledbydefaultforthenext27days.Learnmoreathttps://flywaydb.org/?ref=v7.11.0_teams ---------------------------------------- Successfullyvalidated0migrations(executiontime00:00.028s) WARNING:Nomigrationsfound.Areyourlocationssetupcorrectly? ERROR:Foundnon-emptyschema(s)`mingongge`butnoschemahistorytable.Usebaseline()orsetbaselineOnMigratetotruetoinitializetheschemahistorytable.
最后的提示很明白,需要创建schema history table,那么好吧,创建一个呗。
[root@centos7~]#flywaybaseline FlywayTeamsEdition7.11.0byRedgate Database:jdbc:mysql://localhost:3306/mingongge(MySQL5.7) ---------------------------------------- FlywayTeamsfeaturesareenabledbydefaultforthenext27days.Learnmoreathttps://flywaydb.org/?ref=v7.11.0_teams ---------------------------------------- CreatingSchemaHistorytable`mingongge`.`flyway_schema_history`withbaseline... Successfullybaselinedschemawithversion:1
再次执行
[root@centos7sql]#flywaymigrate FlywayTeamsEdition7.11.0byRedgate Database:jdbc:mysql://localhost:3306/mingongge(MySQL5.7) ---------------------------------------- FlywayTeamsfeaturesareenabledbydefaultforthenext27days.Learnmoreathttps://flywaydb.org/?ref=v7.11.0_teams ---------------------------------------- Successfullyvalidated1migration(executiontime00:00.225s) Migratingschema`mingongge`toversion"1.0-Createtesttable" Successfullyapplied1migrationtoschema`mingongge`,nowatversionv1.0(executiontime00:00.356s)
增加数据进行迁移测试。还是在sql目录下创建脚本V1.0.1__add_data.sql
[root@centos7~]#catflyway-7.11.0/sql/V1.0.1__add_data.sql INSERTINTOtest_table(id,username,PASSWORD) VALUES('001','test1','123456'); INSERTINTOtest_table(id,username,PASSWORD) VALUES('002','test2','123456');
这个时候查看状态信息,可以发现如下:
执行迁移动作
[root@centos7~]#flywaymigrate FlywayTeamsEdition7.11.0byRedgate Database:jdbc:mysql://localhost:3306/mingongge(MySQL5.7) ---------------------------------------- FlywayTeamsfeaturesareenabledbydefaultforthenext27days.Learnmoreathttps://flywaydb.org/?ref=v7.11.0_teams ---------------------------------------- Successfullyvalidated2migrations(executiontime00:00.042s) Currentversionofschema`mingongge`:1.0 Migratingschema`mingongge`toversion"1.0.1-adddata" Successfullyapplied1migrationtoschema`mingongge`,nowatversionv1.0.1(executiontime00:00.170s)
查看状态信息
回滚
先创建一个回滚脚本,注意命名规范,这个会让很多人踩坑的。。。。切记!!!!
[root@centos7sql]#catU1.0.1__delete_data.sql DELETEFROMtest_table;
注意:这里的回滚,一定是回滚到已存在的版本号,所以命名时注意版本号这块,如果这里写成1.0,就会出现报错:
ERROR:Unabletoundomigrationtoversion1.0.1asnocorrespondingundomigrationhasbeenfound.
执行回滚
[root@centos7~]#flywayundo FlywayTeamsEdition7.11.0byRedgate Database:jdbc:mysql://localhost:3306/mingongge(MySQL5.7) ---------------------------------------- FlywayTeamsfeaturesareenabledbydefaultforthenext27days.Learnmoreathttps://flywaydb.org/?ref=v7.11.0_teams ---------------------------------------- Currentversionofschema`mingongge`:1.0.1 Undoingmigrationofschema`mingongge`toversion1.0.1-deletedata Successfullyundid1migrationtoschema`mingongge`,nowatversionv1.0(executiontime00: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/
转载请注明:IT运维空间 » 运维技术 » 挺带劲!这款开源数据库迁移工具超牛
发表评论