最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

數(shù)據(jù)庫(kù)的持續(xù)集成和版本控制_MySQL

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 17:31:30
文檔

數(shù)據(jù)庫(kù)的持續(xù)集成和版本控制_MySQL

數(shù)據(jù)庫(kù)的持續(xù)集成和版本控制_MySQL:在提出版本化數(shù)據(jù)庫(kù)工作是一個(gè)必要規(guī)則這一觀點(diǎn)之后,Scott Allen又詳述了一個(gè)做好版本化數(shù)據(jù)庫(kù)的方法,他給出了一個(gè)易于理解、實(shí)踐性很強(qiáng)的方法,通過(guò)創(chuàng)建基線、使用變更腳本的方法來(lái)管理數(shù)據(jù)庫(kù)的修訂、控制程序化數(shù)據(jù)庫(kù)對(duì)象(如視圖、存儲(chǔ)過(guò)程、函數(shù)和觸發(fā)
推薦度:
導(dǎo)讀數(shù)據(jù)庫(kù)的持續(xù)集成和版本控制_MySQL:在提出版本化數(shù)據(jù)庫(kù)工作是一個(gè)必要規(guī)則這一觀點(diǎn)之后,Scott Allen又詳述了一個(gè)做好版本化數(shù)據(jù)庫(kù)的方法,他給出了一個(gè)易于理解、實(shí)踐性很強(qiáng)的方法,通過(guò)創(chuàng)建基線、使用變更腳本的方法來(lái)管理數(shù)據(jù)庫(kù)的修訂、控制程序化數(shù)據(jù)庫(kù)對(duì)象(如視圖、存儲(chǔ)過(guò)程、函數(shù)和觸發(fā)

在提出版本化數(shù)據(jù)庫(kù)工作是一個(gè)必要規(guī)則這一觀點(diǎn)之后,Scott Allen又詳述了一個(gè)做好版本化數(shù)據(jù)庫(kù)的方法,他給出了一個(gè)易于理解、實(shí)踐性很強(qiáng)的方法,通過(guò)創(chuàng)建基線、使用變更腳本的方法來(lái)管理數(shù)據(jù)庫(kù)的修訂、控制程序化數(shù)據(jù)庫(kù)對(duì)象(如視圖、存儲(chǔ)過(guò)程、函數(shù)和觸發(fā)器),并充分利用分支和合并。

Allen在發(fā)布了關(guān)系型數(shù)據(jù)庫(kù)開(kāi)發(fā)的三個(gè)原則的經(jīng)驗(yàn)總結(jié)文章之后,就開(kāi)始寫后續(xù)的系列文章了。這三個(gè)原則如下:

一、不要在共享數(shù)據(jù)庫(kù)服務(wù)器上進(jìn)行開(kāi)發(fā)工作

就像軟件開(kāi)發(fā)中其它所謂便捷的方法一樣,共享數(shù)據(jù)庫(kù)的使用也是一個(gè)泥潭,它正等著凍結(jié)一個(gè)項(xiàng)目呢。開(kāi)發(fā)人員相互覆蓋彼此所做的修改,我在服務(wù)器上所做的改變讓你的開(kāi)發(fā)機(jī)器上的代碼中斷運(yùn)行,這些都讓遠(yuǎn)程開(kāi)發(fā)速度很慢而且非常困難。避免使用共享數(shù)據(jù)庫(kù),也就免避了因使用它造成的極度時(shí)間浪費(fèi)和因之而生的Bug。

二、僅保留一份權(quán)威的Schema生成源

每一個(gè)人都必須知道該從哪里獲得正式的Schema,并且可以用它輕松地重新創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。當(dāng)我走到電腦前,可以從源碼庫(kù)中獲得最新的版本,構(gòu)建后就可以通過(guò)最簡(jiǎn)單的工具創(chuàng)建數(shù)據(jù)庫(kù)(在更多的場(chǎng)景中,構(gòu)建的過(guò)程甚至可以在數(shù)據(jù)庫(kù)不存在時(shí)自己創(chuàng)建一個(gè),所以這個(gè)構(gòu)建過(guò)程應(yīng)該是一步到位方式的)。

三、對(duì)你的數(shù)據(jù)庫(kù)進(jìn)行版本管理

這樣做的原因之一就是要將變化由開(kāi)發(fā)傳遞到測(cè)試,最終在一種可控制的、一致的環(huán)境下生產(chǎn)。其二就是可以重建任何時(shí)間點(diǎn)上的數(shù)據(jù)庫(kù),如果你正在將軟件交付給客戶的話,這一點(diǎn)就尤為重要。如果有人在你提交的應(yīng)用版本build 20070612中發(fā)現(xiàn)了bug,你就必須能重建當(dāng)時(shí)那個(gè)版本的狀況——包括數(shù)據(jù)和其它所需。

Allen說(shuō)明了版本化數(shù)據(jù)庫(kù)的目的就是為了能保證所做的改變能保持一致性、可控性、可測(cè)試性和可重現(xiàn)性。許多推廣者都同意這一點(diǎn),并認(rèn)為實(shí)現(xiàn)這個(gè)目標(biāo)對(duì)任何一個(gè)敏捷團(tuán)隊(duì)的效率都很重要。

在列出了版本化數(shù)據(jù)庫(kù)的重要性后,Allen又相繼發(fā)布了4個(gè)貼子來(lái)描述他推薦的實(shí)現(xiàn)方法。

其中,第一篇貼子描述了Allen宣稱的版本化數(shù)據(jù)庫(kù)的起點(diǎn)——?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)Schema基線。從本質(zhì)上來(lái)講,這個(gè)基線是一個(gè)腳本,或者是一連串腳本,它包含所有可以從零開(kāi)始生成應(yīng)用數(shù)據(jù)庫(kù)的SQL命令。它包括創(chuàng)建所有數(shù)據(jù)庫(kù)所有對(duì)象(表、約束、函數(shù)、視圖、索引等)的SQL命令、表查詢及操作命令和插入應(yīng)用所需初始數(shù)據(jù)的命令。Allen建議,一旦它完成創(chuàng)建并且驗(yàn)證無(wú)誤,應(yīng)立刻“將它提交到源碼控制庫(kù)”,此時(shí)“你可以認(rèn)為已將數(shù)據(jù)庫(kù)基線化了 ”。

對(duì)于如何創(chuàng)建這個(gè)基線,Allen建議使用那些能從現(xiàn)有數(shù)據(jù)庫(kù)中導(dǎo)出腳本的工具(與手工編寫他們的過(guò)程相反)。作為參考,他還描述了他是如何結(jié)構(gòu)化那些生成的腳本文件的:

我喜歡將所有生成表、約束、缺省值和主鍵的SQL語(yǔ)句保存到同一個(gè)文件中,而那些創(chuàng)建視圖、存儲(chǔ)過(guò)程、函數(shù)的腳本則分開(kāi)來(lái)單獨(dú)存儲(chǔ)。

如果你喜歡多文件保存的方式,那就需要一個(gè)批處理文件,shell腳本,應(yīng)用程序,或其它自動(dòng)化工具來(lái)自動(dòng)定位并運(yùn)行安裝數(shù)據(jù)庫(kù)需要的所有腳本文件。人工干涉這個(gè)過(guò)程是一種倒退。

Allen建議并強(qiáng)調(diào),基線中需要一個(gè)表用來(lái)記錄任何有關(guān)數(shù)據(jù)庫(kù)結(jié)構(gòu)的改變,在他后面的三個(gè)貼子中,他詳細(xì)描述了該如何處理這些變化。

首先,Allen討論了變更腳本——一種管理除視圖、存儲(chǔ)過(guò)程、函數(shù)以外的數(shù)據(jù)庫(kù)對(duì)象的機(jī)制。這種方法要求任何一個(gè)改變(或一組相關(guān)的改變)必須有一個(gè)新生成的腳本文件可通過(guò)“增量”更新的方式來(lái)代表,這與Ruby Migration很相似。換句話說(shuō),當(dāng)團(tuán)隊(duì)發(fā)現(xiàn)數(shù)據(jù)庫(kù)需要做改變時(shí),他們創(chuàng)建一個(gè)新的腳本來(lái)將數(shù)據(jù)庫(kù)修改到想要的樣子,通過(guò)測(cè)試后提交到源碼控制庫(kù)中。一旦發(fā)布后,這個(gè)腳本就永遠(yuǎn)不要再修改。

Allen這么做使視圖、存儲(chǔ)過(guò)程和函數(shù)的更新方式與其它數(shù)據(jù)庫(kù)對(duì)象完全相反,每個(gè)對(duì)象都有一個(gè)“創(chuàng)建命令”文件,然后通過(guò)更新這一個(gè)文件來(lái)更新這些對(duì)象,對(duì)于為什么他喜歡這樣做,他解釋到:

原因很簡(jiǎn)單,就是為了更快速地確定問(wèn)題所在。如果有人提交了一個(gè)數(shù)據(jù)庫(kù)結(jié)構(gòu)變化,它移除了視圖所引用的一個(gè)列,那么你可以盡早地發(fā)現(xiàn)有錯(cuò)誤,因?yàn)樵跇?gòu)建版本提交到測(cè)試以前,這個(gè)問(wèn)題就會(huì)被發(fā)現(xiàn);同樣,如果有人提交了一個(gè)視圖,但卻忘了發(fā)布它所需要的結(jié)構(gòu)改變,幾分鐘后就會(huì)有人跑到他們的桌子前問(wèn)他們?yōu)槭裁匆茐能浖倪\(yùn)行。

另一個(gè)原因就是為了避免我遇到過(guò)的某些不太常見(jiàn)的錯(cuò)誤。對(duì)于那些隱匿在視圖背后的Schema的變化,某些數(shù)據(jù)庫(kù)產(chǎn)品仍會(huì)強(qiáng)迫完成執(zhí)行計(jì)劃,而由此引發(fā)的問(wèn)題很難跟蹤?!叭拥羲械臇|西,重新開(kāi)始”會(huì)避免發(fā)生這類事情。

Allen著重強(qiáng)調(diào)了利用自動(dòng)化工具更好地實(shí)施上述策略的重要性:

當(dāng)開(kāi)發(fā)人員、測(cè)試人員或者安裝人員從源碼控制庫(kù)中更新并運(yùn)行本地?cái)?shù)據(jù)升級(jí)工具時(shí),它就像會(huì)魔術(shù)般地完成工作。它有三個(gè)步驟:

1、通過(guò)對(duì)比現(xiàn)有數(shù)據(jù)庫(kù)結(jié)構(gòu)變更腳本文件和SchemaChangeLog表中的記錄,來(lái)應(yīng)用最新的數(shù)據(jù)庫(kù)結(jié)構(gòu);
2、刪掉數(shù)據(jù)庫(kù)中所有的存儲(chǔ)過(guò)程、視圖和函數(shù);
3、運(yùn)行所有的變更腳本將視圖、存儲(chǔ)過(guò)程和函數(shù)添回到數(shù)據(jù)庫(kù)中去。

對(duì)于遵循這些策略的好處,尤其是使用自動(dòng)化工具,Allen給出了一些示例:

由于數(shù)據(jù)結(jié)構(gòu)變更腳本保存在源碼控制庫(kù)中,你可以在任何時(shí)候重新創(chuàng)建任意時(shí)間點(diǎn)上的數(shù)據(jù)庫(kù)。如果客戶報(bào)告了一個(gè)關(guān)于build 3.1.5.6723的bug,那么,你所需要做的就是獲取相應(yīng)版本標(biāo)號(hào)或標(biāo)記過(guò)的源碼,然后運(yùn)行這一基線和這一標(biāo)記下所有的數(shù)據(jù)庫(kù)變更腳本。當(dāng)其運(yùn)行結(jié)束后,你就已經(jīng)有了一份與客戶發(fā)現(xiàn)bug時(shí)一模一樣的數(shù)據(jù)庫(kù),也就獲得了一個(gè)重現(xiàn)這個(gè)bug的好機(jī)會(huì)。而且,當(dāng)改變由開(kāi)發(fā)階段進(jìn)入測(cè)試階段時(shí),就從根本上提供了一個(gè)一致的、有序的、可重現(xiàn)的產(chǎn)品。

Allen在這一系列文章的最后,還提及他是如何處理分支與合并的,而這是所有應(yīng)用在版本服務(wù)器上建立它的第一個(gè)版本后都要面對(duì)的現(xiàn)實(shí)問(wèn)題。 Allen建議為發(fā)布而分支,這也是他偏好的分支策略,同時(shí)解釋了他為什么會(huì)為每個(gè)新的發(fā)布版本重創(chuàng)數(shù)據(jù)庫(kù)基線。他通過(guò)一個(gè)示例來(lái)描述了這個(gè)問(wèn)題,并添加了這樣一個(gè)場(chǎng)景:在較早版本中發(fā)現(xiàn)了缺陷,就必須對(duì)已分支的版本進(jìn)行相應(yīng)的數(shù)據(jù)構(gòu)結(jié)構(gòu)變更。在這個(gè)分支版本中,創(chuàng)建新的腳本來(lái)處理變更是沒(méi)有問(wèn)題的,問(wèn)題是,如何將這個(gè)變更也應(yīng)用到當(dāng)前的主線版本中:

想要在主線中修復(fù)它,有兩種選擇。實(shí)際上可能會(huì)有無(wú)數(shù)種可能性,這取決于你想如何應(yīng)用你的更新。但這里只提供兩種選擇:

1、將數(shù)據(jù)庫(kù)變更腳本合并到當(dāng)前主線版本01.00.0046的腳本中,并在基線版本2.0中進(jìn)行相應(yīng)的修復(fù)來(lái)處理這一變更;
2、寫一個(gè)新的數(shù)據(jù)庫(kù)結(jié)構(gòu)變更腳本02.00.0003,其與分支版本46中的變更保持一致。

對(duì)于選項(xiàng)一,你必須小心處理,因?yàn)槿魏我呀?jīng)更新到v2.0版的數(shù)據(jù)庫(kù)都并不會(huì)從分支上獲得46號(hào)變更腳本(除非你編寫的工具與我的不一樣)。你只能讓別人手工運(yùn)行這一腳本,或者你自己查看對(duì)與現(xiàn)存的2.0版本數(shù)據(jù)庫(kù)沖突(對(duì)于這種結(jié)果,無(wú)論如何僅限于在開(kāi)發(fā)和測(cè)試機(jī)器上)。所以,除非你剛開(kāi)始著手 2.0的開(kāi)發(fā)不久,否則這個(gè)選擇并不算太好。

相比之下,選項(xiàng)二則要友好多了。1.0版本的數(shù)據(jù)庫(kù)將會(huì)從01.00.0046中獲得修復(fù)。2.0版本的數(shù)據(jù)庫(kù)則在02.00.0003中得到修復(fù)。但你也要很小心地去編寫02.00.0003的修改腳本,以免它履蓋運(yùn)行01.00.0046腳本后所做的修改。

換句話說(shuō),數(shù)據(jù)庫(kù)是按照2.0版的基線腳本安裝的,必須要應(yīng)用02.00.0003腳本,但實(shí)際的產(chǎn)品數(shù)據(jù)庫(kù)可能是從1.0版開(kāi)始的,它將應(yīng)用 01.00.0046腳本來(lái)修復(fù),所以你不能讓02.00.0003去再次修改這個(gè)實(shí)際已經(jīng)升級(jí)到2.0版的數(shù)據(jù)庫(kù)否則,會(huì)造成錯(cuò)誤

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

數(shù)據(jù)庫(kù)的持續(xù)集成和版本控制_MySQL

數(shù)據(jù)庫(kù)的持續(xù)集成和版本控制_MySQL:在提出版本化數(shù)據(jù)庫(kù)工作是一個(gè)必要規(guī)則這一觀點(diǎn)之后,Scott Allen又詳述了一個(gè)做好版本化數(shù)據(jù)庫(kù)的方法,他給出了一個(gè)易于理解、實(shí)踐性很強(qiáng)的方法,通過(guò)創(chuàng)建基線、使用變更腳本的方法來(lái)管理數(shù)據(jù)庫(kù)的修訂、控制程序化數(shù)據(jù)庫(kù)對(duì)象(如視圖、存儲(chǔ)過(guò)程、函數(shù)和觸發(fā)
推薦度:
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top