數據庫表結構怎么進(jìn)行版本管理?數據(這個(gè)工具你值得擁有(you)?。?/p>
新功能開(kāi)發(fā)了好久終于通過(guò)測試準備上線(xiàn)了,庫表沒(méi)想到在生產(chǎn)環(huán)境一運行直接??報錯了,結構進(jìn)行具值一查(′?ω?`)是版本這次新功能開(kāi)發(fā)增加了好幾張表,然而卻沒(méi)有同步到線(xiàn)上數據庫,管理個(gè)工不得不說(shuō)這失誤也太??低級了吧!得擁
為了防止再次發(fā)生類(lèi)似問(wèn)題,數據??能ヽ(′ー`)ノ否通過(guò)??程序自動(dòng)幫助我們完成數據庫表結構的庫表版本管理呢?
目錄
為什么需要對數據庫遷移進(jìn)行版本管理?Flyway原理淺析SpringBoot項目集成Flヽ(′▽?zhuān)?ノyway總結為什么(me)需要對數據庫遷移進(jìn)行版本管理?
一個(gè)項目在通常情況下都是多人協(xié)作開(kāi)發(fā),我做這(′;ω;`)個(gè)功能、結構進(jìn)行具值你做那個(gè)功能,版本因為有非常成熟的管理個(gè)工版本管理工具如Git和SVN來(lái)對代碼??進(jìn)行版本管理(?Д?),所以一般在代碼同步上不會(huì )出什么問(wèn)題。得擁
但是數據我回想了一下,在數據庫同步層面經(jīng)常會(huì )發(fā)生一些小問(wèn)題:
比如我在做新功能時(shí)在本地數據庫新建了一張表,庫表功能做完之后我將代碼提交到主干分支;另外一個(gè)程序員小伙伴同步最新代碼之后在本地就會(huì )跑不起來(lái)??,結構進(jìn)行具值因為他( ???)電腦的本地數據庫并沒(méi)有我新建的這張表。怎么ヾ(′▽?zhuān)??辦?我手動(dòng)將建表語(yǔ)句發(fā)給他,他再手動(dòng)執行一遍,這是人少的情況,人多的情況下都不知道該找誰(shuí)要表結構?
再比如一般我們開(kāi)發(fā)項目會(huì )有集成開(kāi)發(fā)、測試和生產(chǎn)3套運行環(huán)境,每次發(fā)版我們先要把數據庫表(′?`*)結構的變動(dòng)在集成開(kāi)??(??ヮ?)?*:???發(fā)環(huán)境執行一遍,沒(méi)問(wèn)??題再(′ω`*)轉到測試環(huán)境,最后上線(xiàn)時(shí)再到生產(chǎn)環(huán)境。
先不說(shuō)這種同??步數據庫的方式累不累人,在開(kāi)發(fā)環(huán)境還??每個(gè)開(kāi)發(fā)可以自己去同步自己改動(dòng)的部分,可是到了生產(chǎn)環(huán)境所有的數??據庫結構變動(dòng)都被混合到了一起,那么我們該怎么確定每個(gè)變動(dòng)的先后順序呢?
通過(guò)以上兩個(gè)場(chǎng)景可以看到要在多人和多環(huán)境之間進(jìn)行數據庫表結構的同步是非常麻煩且容易出錯的。
Flyway原理淺析
其實(shí)市面(mian)上支(zhi)持對數據(ju)庫遷移進(jìn)行版本管理的工具還挺多,就Java方面來(lái)說(shuō)有Flyway、Liquibase等開(kāi)源工(gong)具。對比了一下兩者的情況,Liquibase功能強大,支持X??Mヾ(′▽?zhuān)??L、JSON、YAML、SQL4種配置方式,但需要一定的學(xué)習成本;Flyway相對則更加小巧簡(jiǎn)單,基本上可以做到開(kāi)箱即用(yong)。
我認為一般中小型項目使用Flyway完??全可以滿(mǎn)足需求,大型項目或是企業(yè)級的項目使用Liquiba( ?ヮ?)se更合適。
Flyway使用一張元數據表flyway_schema_history來(lái)記錄每次數據庫遷移的歷史記錄。
Flyway會(huì )隨著(zhù)程序啟動(dòng),從而開(kāi)(kai)始進(jìn)行數據庫的遷移工作:
如果是首(?????)次執行,Flyway會(huì )先去掃描指定的文件(jian)路徑或者是在c(′_ゝ`)lasspath下尋找遷移文件,遷移文件可以是SQL文件也可以是ヾ(^-^)ノJava類(lèi),這些遷移文件將按照特定的遷移版本號進(jìn)行排序,然后將依次被執行。
如(′?`)果是非首次執行,程ヽ(′ー`)ノ序會(huì )首先檢查遷移的歷史記錄,如果遷移文件的版本號小于當前數據庫的版本號,那么這些遷移文件將不會(huì )被執行,所以每次我們新建遷移文件時(shí)版本號都必(bi)須大于數據庫當前版本號。
在Flyway中,遷移文件會(huì )被分成3種類(lèi)型:版本遷移、撤銷(xiāo)遷移和可重復遷移。
1、版本遷移
2、撤銷(xiāo)遷移
撤銷(xiāo)遷移的作用與版本遷移正好相反,主要作用是將與之前相同版本的版(??-)?本遷移所產(chǎn)生的遷移效果撤銷(xiāo)。
特別注意的是:對于撤銷(xiāo)遷移一(╯°□°)╯定要慎重,因為通常撤銷(xiāo)遷移包含drop、delete、truncate等具有破壞性的操作,所以做撤銷(xiāo)遷移之前最好能夠備份一下數(shu)據。
3、可重復遷移
從名字就可以看出可重復遷移可以被多次執行,事實(shí)上它沒(méi)有版本號的概念,只要遷移文件發(fā)生變化,遷移就會(huì )被重新執行??芍貜瓦w移通常在版本遷移和撤銷(xiāo)遷移執行之后才會(huì )被執行。
確??芍貜瓦w移里(li)的所有操作重復執行不會(huì )出現意外情況。
說(shuō)完了類(lèi)型,再來(lái)(????)聊聊版本號,遷移文件的版本號怎么定義的呢?答案是(╯°□°)╯︵ ┻━┻通過(guò)文件名。
SpringBoot項目集成Flyway
Flyway和Spring Boot一樣推崇約定大于配置,所以只需要簡(jiǎn)單幾步就可以使用上Flyway了。
以基于SQL文件的方式遷移為例:
1、在pom.xml文件ヽ(′ー`)ノ中引入依賴(lài):
2、在項目resources目錄下新建db/migration目錄,用來(lái)存放SQL文件,如果想存放到其他目錄,可以進(jìn)行自定義配置,后??面會(huì )講到。
3、在配置文件application.properties中配置Flyway??元素數據表所在的數據庫信息。
當然了,其實(shí)Flyway還提供了其他非常多的配置項,我們可以按需進(jìn)行配置。
總結
在多人開(kāi)發(fā)以及多環(huán)境(′?`*)下遷移數據庫是一件非常麻煩且容易出錯的事情,所以我們應該通過(guò)程序來(lái)自動(dòng)完成數據庫的遷移工作。
Flyway是一款Java開(kāi)源的數據庫遷移管理工具,具備輕便小巧的特點(diǎn),我們可以無(wú)門(mén)檻快速ヾ(^-^)ノ集成到項目中。