4.不同版本數(shù)據(jù)庫(kù)之間的數(shù)據(jù)遷移
一旦你把程序和數(shù)據(jù)庫(kù)提交給用戶(hù),那么只是重構(gòu)開(kāi)發(fā)數(shù)據(jù)庫(kù)結(jié)構(gòu)就不是重構(gòu)的全部了。比如,如果一列被從一個(gè)表移動(dòng)到另外一個(gè)表,這個(gè)操作也許通過(guò)一條Sql語(yǔ)句完成,首先把這一列從源表中刪除,然后添加到目的表中。一旦重構(gòu)好的系統(tǒng)處于穩(wěn)定狀態(tài)并將提交給用戶(hù)的時(shí)候,我們就不得不面對(duì)不同版本之間數(shù)據(jù)的遷移。在這里,我們將要看到不同的數(shù)據(jù)遷移策略之于數(shù)據(jù)庫(kù)重構(gòu)的不同影響。
4.1數(shù)據(jù)庫(kù)模式的版本化
我們需要把已有的數(shù)據(jù)庫(kù)數(shù)據(jù)遷移到新的數(shù)據(jù)庫(kù)中去。當(dāng)然,在遷移過(guò)程當(dāng)中,老的數(shù)據(jù)庫(kù)還將運(yùn)轉(zhuǎn)。只有當(dāng)數(shù)據(jù)的遷移完畢以后,老的數(shù)據(jù)庫(kù)模式才可以被摒棄。
新老數(shù)據(jù)庫(kù)模式的存在有幾種不同的方式。你首先可以以版本來(lái)區(qū)分它們。比如起名為schema V1,schema V2之類(lèi)。
當(dāng)然,數(shù)據(jù)庫(kù)中的表也同樣可以有版本號(hào)。比如Customer V1,Product V2,當(dāng)然,這多少會(huì)給重構(gòu)的結(jié)果帶來(lái)一些影響。畢竟,外健關(guān)系、約束、觸發(fā)器都是和表名有關(guān)系的。一旦新版本的模式被創(chuàng)建,諸如此類(lèi)與表名有關(guān)系的部分可能都需要進(jìn)行調(diào)整。
為了減少這種情況的發(fā)生,我們往往采取每一個(gè)模式對(duì)應(yīng)一個(gè)版本號(hào)的方式。
模式的名稱(chēng)讓程序能夠辨識(shí)現(xiàn)在正在使用的是那個(gè)版本。大量的經(jīng)驗(yàn)表明,這是數(shù)據(jù)遷移的一個(gè)先決條件。不要總以為大家都是使用的上一個(gè)版本的數(shù)據(jù)庫(kù),而造成把前一個(gè)數(shù)據(jù)庫(kù)版本的數(shù)據(jù)混同更早版本的數(shù)據(jù)庫(kù)一起進(jìn)行數(shù)據(jù)的遷移。因而每一個(gè)人都應(yīng)當(dāng)清楚他所使用的那個(gè)數(shù)據(jù)庫(kù)的版本是什么。
4.2遷移步驟
就像前面說(shuō)的那樣,當(dāng)開(kāi)發(fā)的產(chǎn)品的受眾更多的時(shí)候,不要期待你的所有用戶(hù)都使用的是你的上一個(gè)版本的軟件。用戶(hù)往往會(huì)忽略一些版本的更新。
每進(jìn)行一次數(shù)據(jù)遷移,新的數(shù)據(jù)庫(kù)版本就是下一次數(shù)據(jù)遷移的源端。
這樣,當(dāng)新系統(tǒng)被安裝的時(shí)候,系統(tǒng)的版本識(shí)別器需要首先判斷當(dāng)前的數(shù)據(jù)模式是什么版本,然后依版本逐次進(jìn)行遷移,進(jìn)而讓數(shù)據(jù)庫(kù)的版本達(dá)到最新的狀態(tài)。這就預(yù)示著每一個(gè)安裝包都要整合以前所有的數(shù)據(jù)遷移程序。對(duì)于那些跑了很長(zhǎng)時(shí)間的重要系統(tǒng),這就是個(gè)問(wèn)題了。因?yàn)橛行├系臄?shù)據(jù)遷移程序已經(jīng)不被新的操作系統(tǒng)所兼容了。在這種情況下,就需要做出一些判斷,挑選出那些真正適宜于當(dāng)前操作系統(tǒng)的數(shù)據(jù)遷移程序進(jìn)行打包發(fā)布。
不要讓客戶(hù)以為一步就能夠把老數(shù)據(jù)庫(kù)中的數(shù)據(jù)遷移到新的數(shù)據(jù)庫(kù)中來(lái)。甚至可能必須要進(jìn)行更多的步驟來(lái)進(jìn)行數(shù)據(jù)遷移。
4.3當(dāng)數(shù)據(jù)量很大時(shí)
當(dāng)數(shù)據(jù)量十分巨大時(shí),數(shù)據(jù)遷移的時(shí)間長(zhǎng)短就成為了問(wèn)題。不能指望十億條數(shù)據(jù)在很短的時(shí)間內(nèi)就完成轉(zhuǎn)移。而你總不能為了轉(zhuǎn)移數(shù)據(jù)讓銀行停止?fàn)I業(yè)吧。
當(dāng)然,從組織或技術(shù)視角看來(lái),這個(gè)問(wèn)題會(huì)有不同的解決辦法。從組織的角度,你就必須把握好什么時(shí)候去修改數(shù)據(jù)庫(kù)系統(tǒng),什么時(shí)候遷移數(shù)據(jù)在時(shí)間上才是充足的。并以此為依據(jù)制定你的時(shí)間表。對(duì)于數(shù)據(jù)庫(kù)的遷移來(lái)說(shuō),圣誕節(jié)或者東方的一些節(jié)日是些不錯(cuò)的選擇。
如果技術(shù)上允許的話(huà),你可以嘗試進(jìn)行增量遷移數(shù)據(jù)的方式。數(shù)據(jù)只會(huì)在系統(tǒng)要用到它們的時(shí)候才進(jìn)行遷移。這樣的話(huà),遷移的周期也會(huì)一定程度的延長(zhǎng),但是系統(tǒng)的活動(dòng)總是不會(huì)被打斷。對(duì)那些需要7乘24小時(shí)運(yùn)作的系統(tǒng)來(lái)說(shuō),這也是數(shù)據(jù)庫(kù)遷移的唯一途徑。
增量遷移的一個(gè)先決條件就是應(yīng)用系統(tǒng)能夠同時(shí)使用多個(gè)數(shù)據(jù)庫(kù)的版本。當(dāng)訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,系統(tǒng)必須知道從哪個(gè)數(shù)據(jù)庫(kù)能夠取得數(shù)據(jù)。所選擇的那些數(shù)據(jù)將總會(huì)被填充到新的數(shù)據(jù)庫(kù)中,然后舊數(shù)據(jù)庫(kù)中相對(duì)應(yīng)的數(shù)據(jù)被刪除。一旦舊數(shù)據(jù)庫(kù)不再包含任何數(shù)據(jù)的時(shí)候,它就可以下崗了。
如果增量的數(shù)據(jù)遷移比你發(fā)布一個(gè)新版本應(yīng)用程序的間歇期還要長(zhǎng),多于兩個(gè)的數(shù)據(jù)庫(kù)版本就會(huì)同時(shí)存在。
4.4數(shù)據(jù)遷移的技術(shù)
ETL工具可以大大簡(jiǎn)化數(shù)據(jù)遷移。ETL即是Extract(抽取),Transform(轉(zhuǎn)換),Load(載入)。ETL工具支持從一個(gè)數(shù)據(jù)源抽取數(shù)據(jù),把抽取出來(lái)的數(shù)據(jù)進(jìn)行轉(zhuǎn)換,然后把它們裝載到目標(biāo)數(shù)據(jù)庫(kù)中去。ETL工具通常被用來(lái)整合不同的應(yīng)用。這讓它們?cè)贓AI(Enterprise Application Integration)領(lǐng)域里面變得舉足輕重。
不同版本之間的數(shù)據(jù)庫(kù)的數(shù)據(jù)遷移對(duì)于ETL來(lái)說(shuō)只是一個(gè)附加用途。事實(shí)上,ETL被用來(lái)做比這重要的多的事情。這樣一個(gè)不幸的事實(shí)就產(chǎn)生了,作為附加用途來(lái)使用ETL,代價(jià)太昂貴了,畢竟ETL作為數(shù)據(jù)整合工具來(lái)發(fā)售,具有相當(dāng)高的售價(jià)。
幸運(yùn)的是,在各個(gè)數(shù)據(jù)庫(kù)之間提供了一個(gè)相對(duì)“便宜”的ETL工具,那就是--SQL。使用SQL語(yǔ)句,數(shù)據(jù)可以簡(jiǎn)單的抽取出來(lái)(使用Select),然后載入到另一個(gè)數(shù)據(jù)庫(kù)中(使用Insert,Update)。然而,SQL并沒(méi)有直接提供數(shù)據(jù)轉(zhuǎn)換的能力,但是記錄表或存儲(chǔ)過(guò)程是可以拿過(guò)來(lái)解決這些問(wèn)題的。在記錄表中,源和目標(biāo)值總是能夠和某個(gè)字段進(jìn)行對(duì)應(yīng)。這樣對(duì)于一個(gè)字段中數(shù)據(jù)的遷移總是可以通過(guò)Insert-Select命令來(lái)實(shí)現(xiàn)。對(duì)于那些打算修改枚舉類(lèi)型的顯示值的人來(lái)說(shuō),這是一種值得推薦的做法。比如如果一個(gè)字段以前用M來(lái)代表男性,用F來(lái)代表女性,而現(xiàn)在則分別要用0和1來(lái)取代它們,我們就可以做一個(gè)記錄表來(lái)指示這種對(duì)應(yīng)。
可能現(xiàn)實(shí)中的一些數(shù)據(jù)遷移要復(fù)雜得多,這就必須編寫(xiě)專(zhuān)門(mén)的數(shù)據(jù)遷移程序來(lái)做這些事情。今天,很多數(shù)據(jù)庫(kù)平臺(tái)允許直接在數(shù)據(jù)庫(kù)中運(yùn)行JAVA程序。這使得數(shù)據(jù)遷移受益匪淺,因?yàn)閿?shù)據(jù)不再需要從數(shù)據(jù)庫(kù)傳送到受理數(shù)據(jù)遷移的主機(jī)。因而數(shù)據(jù)遷移的效率將會(huì)大大提高。
posted on 2007-08-16 22:19
littlegai 閱讀(174)
評(píng)論(0) 編輯 收藏 引用