使用Flyway來管理資料庫版本
Flyway是什麼
Flyway是一款資料庫遷移(migration)工具。
它可以幫助我們在不同環境保持資料庫的同步,減少手工操作,避免資料匯入的順序錯誤,同時也減少了遺漏的機會。
flyway可以整合在專案中,可以與Spring 框結合。在專案發版時,自動執行資料庫指令碼,無需人為執行資料庫同步操作。
就目前而言,
我們部署應用的流程大概是這樣的:
開發人員將應用程式打包、按順序彙總並整理資料庫升級指令碼DBA拿到資料庫升級指令碼檢查、備份、執行,以完成資料庫升級應部署人員拿到應用部署包,備份、替換,以完成應用程式升級
引入Flyway之後的應用部署流程大概是這樣的:
開發人員將應用程式打包應部署人員拿到應用部署包,備份、替換,以完成應用程式升(Flyway將自動執行升級/備份指令碼)
Flyway的介紹
1、概念:
Flyway是獨立於資料庫的應用、管理並跟蹤資料庫變更的資料庫版本管理工具。用通俗的話講,Flyway可以像git管理不同人的程式碼那樣,管理不同人的sql指令碼,從而做到資料庫同步。
2、支援的資料庫型別:
Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL (including Amazon RDS), MariaDB, Google Cloud SQL, PostgreSQL (including Amazon RDS and Heroku), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoenix。
3、sql指令碼的命名規範:
V+版本號(版本號的數字間以".“或”_"分隔開)+雙下劃線(用來分隔版本號和描述)+檔案描述+字尾名,例如:V2017.9.30__Update.sql。
4、Flyway讀取sql指令碼的預設位置:
專案的原始檔夾下的db/migration目錄。
5、指令:
一共就6個基本指令:migrate、clean、info、validate、baseline、repair。
Flyway的命令
Migrate:
manven命令 mvn flyway:migrate
將資料庫遷移到最新版本。當資料如果不存在,Flyway 將自動建立示模式歷史表。
Migrate是flyway工作流程的核心。它將掃描檔案系統或您的類路徑以獲取可用的遷移。它將它們與應用於資料庫的遷移進行比較。如果發現任何差異,它將遷移資料庫以縮小差距。
Migrate最好在應用程式啟動時執行,以避免資料庫與程式碼期望之間的任何不相容性。
示例 1: 我們有Migrate可用到版本 9, 資料庫在版本 5 。Migrate將按順序應用遷移 6、7、8 和 9。
示例 2: 我們有Migrate可用到版本 9,資料庫位於第 9 版。遷移不起任何作用。
Clean:
manven命令 mvn flyway:clean
Clean可以很好的幫助開發和測試。 它將有效地給你一個全新的開始,通過Clean來清除你的資料庫。 所有物件(表、檢視、過程…)將會刪除。
不用說: 不要對生產資料庫使用!
Info:
manven命令 mvn flyway:info
列印有關所有Migrate的詳細資訊和狀態資訊。
Info讓你知道你的立場。一目瞭然,您就會看到哪些Migrate已經應用,哪些其他Migrate仍在等待執行中,何時執行,以及它們是否成功。
Validate:
manven命令 mvn flyway:validate
用於校驗,範圍包括已升級的指令碼是否改名,已執行的版本內容是否修改。所有針對已執行的版本進行的改動都會導致校驗失敗。
執行migrate會自動進行校驗,如果失敗將不會做任何的migrate。
flyway希望使用者提供的指令碼是穩定的,以免造成額外的複雜性和混亂。
Undo:
manven命令 mvn flyway:undo
撤消最近應用的版本遷移。
Baseline:
manven命令 mvn flyway:baseline
對現有資料庫進行基準測試,如果不存在flyway_schema_history檔案,則會直接建立,並以當前狀態為版本1
Repair:
manven命令 mvn flyway:repair
修復Flyway模式歷史記錄表。這將執行以下操作:
在沒有DDL事務的資料庫上刪除所有失敗的遷移(留下的使用者物件仍必須手動清理)
將可用遷移的校驗和,描述和型別與可用遷移重新對齊
結合spring使用
pom.xml引入
<!-- flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.4</version>
</dependency>
引數配置
flyway.baseline-description對執行遷移時基準版本的描述.
flyway.baseline-on-migrate當遷移時發現目標schema非空,而且帶有沒有後設資料的表時,是否自動執行基準遷移,預設false.
flyway.baseline-version開始執行基準遷移時對現有的schema的版本打標籤,預設值為1.
flyway.check-location檢查遷移指令碼的位置是否存在,預設false.
flyway.clean-on-validation-error當發現校驗錯誤時是否自動呼叫clean,預設false.
flyway.enabled是否開啟flywary,預設true.
flyway.encoding設定遷移時的編碼,預設UTF-8.
flyway.ignore-failed-future-migration當讀取後設資料表時是否忽略錯誤的遷移,預設false.
flyway.init-sqls當初始化好連線時要執行的SQL.
flyway.locations遷移指令碼的位置,預設db/migration.
flyway.out-of-order是否允許無序的遷移,預設false.
flyway.password目標資料庫的密碼.
flyway.placeholder-prefix設定每個placeholder的字首,預設${.
flyway.placeholder-replacementplaceholders是否要被替換,預設true.
flyway.placeholder-suffix設定每個placeholder的字尾,預設}.
flyway.placeholders.[placeholder name]設定placeholder的value
flyway.schemas設定需要flywary遷移的schema,大小寫敏感,預設為連線預設的schema.
flyway.sql-migration-prefix遷移檔案的字首,預設為V.
flyway.sql-migration-separator遷移指令碼的檔名分隔符,預設__
flyway.sql-migration-suffix遷移指令碼的字尾,預設為.sql
flyway.tableflyway使用的後設資料表名,預設為schema_version
flyway.target遷移時使用的目標版本,預設為latest version
flyway.url遷移時使用的JDBC URL,如果沒有指定的話,將使用配置的主資料來源
flyway.user遷移資料庫的使用者名稱
flyway.validate-on-migrate遷移時是否校驗,預設為true.
plugins配置
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<configuration>
<url>url</url>
<user>賬號</user>
<password>密碼</password>
<driver>com.mysql.cj.jdbc.Driver</driver>
<locations>
<location>地址</location>
</locations>
</configuration>
</plugin>
idea