使用Flyway來管理數據庫版本
使用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
參考文章:
//flywaydb.org/documentation/