挺帶勁!這款開源數據庫遷移工具超牛
遷移數據庫可以說是日常工作中的家常便飯,不過,如果一不小心把數據庫搞炸了,那就麻煩大了(搞不好就得背鍋了)。隨著數據量的逐漸增加、表結構的改動,數據庫各類遷移、升級是勢在必行。所以,有一款好的遷移工具是可以大大提高工作效率,還能很大程度上避免手動操作帶來的失誤或數據損壞、丟失的風險。
今天,民工哥就給大家介紹一款這樣的數據庫遷移神器。
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 = 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/documentation/usage/maven/
更多更詳細的使用指南大家有興趣的可以參閱官方文檔:https://flywaydb.org/documentation/