使用Flyway來管理資料庫版本

福祿網路技術團隊發表於2021-07-13

使用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 將自動建立示模式歷史表。
20210706164823
Migrate是flyway工作流程的核心。它將掃描檔案系統或您的類路徑以獲取可用的遷移。它將它們與應用於資料庫的遷移進行比較。如果發現任何差異,它將遷移資料庫以縮小差距。

Migrate最好在應用程式啟動時執行,以避免資料庫與程式碼期望之間的任何不相容性。
示例 1: 我們有Migrate可用到版本 9, 資料庫在版本 5 。Migrate將按順序應用遷移 6、7、8 和 9。

示例 2: 我們有Migrate可用到版本 9,資料庫位於第 9 版。遷移不起任何作用。
Clean:

manven命令 mvn flyway:clean

20210706165256
Clean可以很好的幫助開發和測試。 它將有效地給你一個全新的開始,通過Clean來清除你的資料庫。 所有物件(表、檢視、過程…)將會刪除。

不用說: 不要對生產資料庫使用!
Info:

manven命令 mvn flyway:info

20210706165611
列印有關所有Migrate的詳細資訊和狀態資訊。
Info讓你知道你的立場。一目瞭然,您就會看到哪些Migrate已經應用,哪些其他Migrate仍在等待執行中,何時執行,以及它們是否成功。
Validate:

manven命令 mvn flyway:validate

20210706165928
用於校驗,範圍包括已升級的指令碼是否改名,已執行的版本內容是否修改。所有針對已執行的版本進行的改動都會導致校驗失敗。

執行migrate會自動進行校驗,如果失敗將不會做任何的migrate。

flyway希望使用者提供的指令碼是穩定的,以免造成額外的複雜性和混亂。
Undo:

manven命令 mvn flyway:undo

20210706170104
撤消最近應用的版本遷移。

Baseline:

manven命令 mvn flyway:baseline

20210706170641
對現有資料庫進行基準測試,如果不存在flyway_schema_history檔案,則會直接建立,並以當前狀態為版本1
Repair:

manven命令 mvn flyway:repair

20210706170938
修復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
20210706174048

參考文章:
https://flywaydb.org/documentation/

福祿·研發中心 福小雄

相關文章