數據庫版本管理:Flyway探索與實踐

引言:
若是你是一個獨立開發者或者不須要維護多個系統,那麼維護數據庫版本並不複雜。可是若是你的團隊正在快速迭代或者同時開發多個功能,在多個環境版本並行,在多個生產服務器上部署你的服務,那麼數據庫的管理將變成一件麻煩事。如何更新全部的數據庫,並維護好全部的更新記錄,把多我的的操做合併起來帶來了挑戰。
​咱們團隊在開發的過程當中也有一樣的困擾。這篇文章將介紹咱們團隊是如何經過Flyway將這些問題逐一解決。html

Flyway基本概念

什麼是flyway,爲何要用flyway

flyway是數據庫版本控制管理工具,用於進行sql腳本版本控制和數據庫遷移。前端

之前咱們的數據庫更改都是經過在某一個文件夾中添加一條sql文件,而後手動執行的。mysql

這樣在一個新環境進行數據庫遷移時就會衍生出一系列的問題:spring

須要人工手動一條一條地執行這些腳本
有些時候,不恰當的命名會使這些sql腳本的執行順序變得難以肯定
若是手動執行時,腳本執行一半發生了一些其餘的事情中斷了執行人的操做,那麼在下次執行時怎麼知道當前數據庫的sql執行到哪裏了,哪些成功執行了哪些沒有執行成功sql

因此咱們迫切地須要一個工具來處理這些問題——flyway數據庫

flyway是如何工做的

flyway會在項目啓動時,完成創建數據庫鏈接池後自動執行以下操做:apache

1.若是數據庫是一個空的數據庫,flyway會建立一個名爲flyway_schema_history的sql執行記錄表,若是不是一個空的數據庫,flyway會跳過這一步
2.flyway會掃描項目指定路徑下(spring項目默認在classpath:db/migration下)的全部sql腳本,並和flyway_schema_history表下全部的腳本記錄進行比對,全部版本號小於或者等於當前版本的腳本將被忽略。可是flyway會計算這些腳本的校驗和,而後和數據庫記錄執行過的腳本比較,若是他們校驗和不一致就會報錯並中止項目執行
3.其他的全部腳本將會按照版本號進行排序,而後逐個執行後端

補充:
若是一條sql腳本執行出錯,flyway會在數據庫中留下一條執行出錯的記錄,而且這條腳本的執行將被自動回滾。版本號高於出錯腳本的待執行腳本將都不會被執行,也不會留下記錄服務器

WARNING: 若是flyway記錄表中有出錯記錄,那麼flyway將沒法執行,請手動更改腳本錯誤,並手動刪除記錄表中的這條出錯記錄從新啓動項目。工具

如何使用flyway

前提:

假設數據庫鏈接池等相關配置已經設置完畢,若是沒有能夠參考Alibaba Druid配置

1.導包

屏幕快照 2020-03-03 上午11.29.38.png

2.添加配置

屏幕快照 2020-03-03 上午11.29.56.png
屏幕快照 2020-03-03 上午11.30.04.png

3.創建sql腳本

默認配置下flyway的腳本在resources/db/migration下

命名格式爲V{describe}.sql

4.執行項目便可

flyway常見問題

如何中途集成flyway

問題描述

flyway集成的最佳時期是項目剛開始時,將數據庫初始化腳本等全權交由flyway來管理。
其次就是在項目起步不久,項目的sql腳本還尚且有序,且清楚當前腳本執行到哪裏時。

幸運的是,咱們當時集成flyway時就處於第二種階段。那麼到底如何集成呢,有什麼該注意的呢

解決方案

1.按照如何使用下的第三條給腳本命名
2.在數據庫中執行以下腳本創建flyway記錄表(這裏用的數據庫是mysql 8.0)
屏幕快照 2020-03-03 上午11.31.07.png

3.向flyway記錄表插入手動插入已執行過sql腳本的記錄
屏幕快照 2020-03-03 上午11.31.17.png

4.處理flyway的校驗和

如下兩種方法選擇一種便可

手動關閉flyway的checksum校驗,只須要在配置中添加這麼一條便可:

spring.flyway.validate-on-migrate=false

使用flyway提供的cli工具,執行repair命令

詳細下載和使用請參考下載和使用Command-line tool

在當前一週alpha,下一週上線的開發模式下如何正確使用flyway

問題描述

考慮如下流程:

1.咱們這周新切出的alpha分支即fat環境 flyway的版本爲V10,master分支(dev環境)也是V10
2.以後master分支開發了新功能涉及到修改數據庫,版本號變爲了V11
3.fat環境出現了bug,須要修改數據庫,建立了一個版本號爲V12的腳本,修改也整合到了master上

因而如今dev環境的腳本記錄是V10, V11, V12; fat環境的腳本記錄是V10,V12

等下週master又切出新的alpha分支,雖然這個分支的代碼攜帶了V10, V11, V12,三個腳本,可是因爲fat數據庫的最新腳本記錄是V12,因此V11這個腳本將永遠不會被執行

解決方案

我想到的方法有三種:

1.防範於未然,通常狀況下,fat出現須要修改數據庫的bug在dev環境下本身單元測試的時候就應該能發現。不該該在fat環境被測試測出來了才發現這個問題。
2.新建fat環境的sql執行腳本時,把master分支中新腳本版本號以前可是不在alpha版本的腳本所有copy過來執行。

這種方法適用於肯定copy過來的其餘腳本不會影響到fat正常運行的狀況

3.將新腳本版本號提早,提早到切出當前alpha分支時的腳本版本號以後。

WARNING: 使用這個方法時要注意,dev環境須要手動跑這條新腳本,並在flyway執行記錄數據庫中手動插入這條執行記錄

Reference

flyway官方網站

加入咱們

點擊應聘Java開發工程師
點擊應聘後端開發工程師
點擊應聘前端開發工程師

網頁引流3.png

相關文章
相關標籤/搜索