欢迎投稿

今日深度:

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

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


 

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

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

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系统

  1. 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

  1. sh -c 'echo "docker run --rm flyway/flyway:7.11.0 $*" > /usr/local/bin/flyway && chmod +x /usr/local/bin/flyway' 

目录结构

  1. [root@centos7 ~]# tree -L 1 ./flyway-7.11.0 
  2. ./flyway-7.11.0 
  3. ├── conf       #配置文件 
  4. ├── drivers    #JDBD驱动程序 
  5. ├── flyway     #macOS/Linux 可执行文件 
  6. ├── flyway.cmd #Windows 可执行文件 
  7. ├── jars       #基于 Java 的迁移(作为 jars) 
  8. ├── jre 
  9. ├── lib 
  10. ├── licenses 
  11. ├── README.txt 
  12. └── sql       #SQL 迁移 
  13.  
  14. 7 directories, 3 files 

使用

使用之前需要了解的一些概念

  • 版本:对数据库的每一次变更可称为一个版本

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

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

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

命令行使用

  1. > flyway [options] command 

flyway主要基于6种基本命令

  1. migrate  #迁移数据库 
  2. clean    #清除所有配置 
  3. info     #打印迁移相关的详细信息与状态信息 
  4. validate #验证迁移的可用性 
  5. baseline #为现有数据库创建基准版本,高于基准版本的才会被执行迁移动作 
  6. repair   #修改 schema history 表 

修改配置文件

  1. [root@centos7 ~]# cd ./flyway-7.11.0/conf/ 
  2. [root@centos7 conf]# ll 
  3. total 24 
  4. -rw-r--r-- 1 root root 22943 Jul  1  2021 flyway.conf 
  5. [root@centos7 conf]# vim flyway.conf 
  6. flyway.url=jdbc:mysql://localhost:3306/mingongge?useUnicode=true 
  7. flyway.user=root 
  8. flyway.password=123456 

准备一个测试用的sql脚本

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

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

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

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

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

  • Suffix(后缀):.sql文件

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

  1. [root@centos7 sql]# pwd 
  2. /root/flyway-7.11.0/sql 
  3. [root@centos7 sql]# cat V1.0__Create_test_table.sql 
  4. CREATE TABLE `test_table` 
  5.   `id`          bigint(10)   NOT NULL, 
  6.   `username`    varchar(64)  DEFAULT NULL, 
  7.   `password`    varchar(64)  DEFAULT NULL, 
  8.   PRIMARY KEY (`id`) 
  9. ) ENGINE = InnoDB 
  10.   DEFAULT CHARSET = utf8 COMMENT ='测试表'; 

开始迁移

  1. [root@centos7 ~]# flyway migrate 
  2. Flyway Teams Edition 7.11.0 by Redgate 
  3. Database: jdbc:mysql://localhost:3306/mingongge (MySQL 5.7) 
  4. ---------------------------------------- 
  5. Flyway Teams features are enabled by default for the next 27 days. Learn more at https://flywaydb.org/?ref=v7.11.0_teams 
  6. ---------------------------------------- 
  7. Successfully validated 0 migrations (execution time 00:00.028s) 
  8. WARNING: No migrations found. Are your locations set up correctly? 
  9. 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,那么好吧,创建一个呗。

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

再次执行

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

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

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

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

执行迁移动作

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

查看状态信息

回滚

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

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

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

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

执行回滚

  1. [root@centos7 ~]# flyway undo 
  2. Flyway Teams Edition 7.11.0 by Redgate 
  3. Database: jdbc:mysql://localhost:3306/mingongge (MySQL 5.7) 
  4. ---------------------------------------- 
  5. Flyway Teams features are enabled by default for the next 27 days. Learn more at https://flywaydb.org/?ref=v7.11.0_teams 
  6. ---------------------------------------- 
  7. Current version of schema `mingongge`: 1.0.1 
  8. Undoing migration of schema `mingongge` to version 1.0.1 - delete data 
  9. 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文件中配置连接数据的信息。

  1. <!--引入flyway插件--> 
  2. <plugin> 
  3.     <groupId>org.flywaydb</groupId> 
  4.     <artifactId>flyway-maven-plugin</artifactId> 
  5.     <version>7.11.0</version> 
  6.     <configuration> 
  7.         <url>jdbc:mysql://localhost:3306/mingongge</url> 
  8.         <user>root</user> 
  9.         <password>root</password> 
  10.     </configuration> 
  11.     <dependencies> 
  12.         <dependency> 
  13.             <groupId>mysql</groupId> 
  14.             <artifactId>mysql-connector-java</artifactId> 
  15.             <version>8.0.15</version> 
  16.         </dependency> 
  17.     </dependencies> 
  18. </plugin> 

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

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

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

www.htsjk.Com true http://www.htsjk.com/shujukugl/43640.html NewsArticle 挺带劲!这款开源数据库迁移工具超牛, 迁移数据库可以说是日常工作中的家常便饭,不过,如果一不小心把数据库搞炸了,那就麻烦大了(搞不好就得背锅了)。随着数据量的逐渐增...
评论暂时关闭