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