使用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 將自動創建示模式歷史表。
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

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

福祿·研發中心
福小雄
Tags: