摘要:在商業(yè)網站運行中,數據庫移植的根本目的在于系統(tǒng)升級,解決當前系統(tǒng)功能上和性能上存在的問題。所以,在我們的移植工程中首先要保證邏輯的正確,做到移植前后的等價性,然后要對移植后的系統(tǒng)進行性能調優(yōu)。該文為此具體探討了商業(yè)網站的Oracle數據庫移植為SQL Server數據庫的理論與應用分析。
關鍵詞:數據庫移植;SQL Server;Oracle
中圖分類號:TP311文獻標識碼:A 文章編號:1009-3044(2009)33-9126-01
數據庫移植就是不改變原有系統(tǒng)的后臺數據庫管理系統(tǒng),并仍然保持原有系統(tǒng)架構、系統(tǒng)數據,前后端應用程序不變的一種系統(tǒng)升級方法。這種系統(tǒng)的變更通常是出去商業(yè)或者系統(tǒng)整體性能的考慮。整個移植過程一般非常龐大,其中主要包括存儲空間的移植、數據庫對象的移植、數據庫數據的移植、代碼的移植、系統(tǒng)測試等很多方面的技術問題。本論文討論的重點是以圍繞網站數據庫中數字類型數據移植而進行的。
1 數據庫移植的理論分析
數據庫移植工程在全球已經有很廣泛的應用,同時也出現了不少現成的不同產品間的數據庫產品移植工具。然而,由于各種數據庫產品之間的實現還是有很多根本架構上的不同,采用的SQL標準也不盡相同,這個導致了在很多問題上,并不是簡單的語法變化就可以實現保證正確性的數據庫轉換。完全依賴數據庫產品可能存在一些正確性的隱患,因此,很多地方還似乎要根據具體分析來進行人工參與的。這樣的話,我們決定在數據庫移植開發(fā)的前期借助數據庫產品中的自動移植工具省去我們很多的重復工作,但在某些關鍵性問題上仍然需要我們人為的工作,或者對工具進行相應具體的配置。Oracle是以高級結構化查詢語言(SQL)為基礎的企業(yè)級大型關系數據庫,通俗地講它是用方便邏輯管理的語言操縱大量有規(guī)律數據的集合,也是目前最流行的客戶/服務器(CLIENT/Server)體系結構的數據庫之一。而SQL Server 2005也同樣是擁有很多優(yōu)越特性的基于客戶/服務器體系結構的數據庫。相較而言,進行Oracle移植工作有公司項目的商業(yè)目的。一般來說,我們把數據庫中用來儲存和表示數據的實體成為對象(Object),它通常包括數據的邏輯存儲空間,表(Table),索引(Index),視圖(View),約束(Constraint),觸發(fā)器(Trigger)和存儲過程(Store Procedure)等等相關組成部分。在本次移植工作中,我們要做的工作是把原先在Oracle上的所有相關數據、程序、服務等等全部移植到全新的SQL Server環(huán)境,因此基于兩者數據庫架構和原理的一些不同,這些數據庫對象也有很大的不同。而一個完整的數據庫系統(tǒng)一般分成數據庫服務器端部分和應用程序部分,兩者互相結合。而數據庫又包括數據庫對象和數據庫數據。所以我們進行數據庫移植的工作就大致大致可以分成一下幾個部分:存儲空間的移植、具體對象得數據庫移植與數據移植。
2 存儲空間的移植
進行數據庫的移植先要進行數據庫后臺級別的移植,再進行Code級別的移植。我們商業(yè)網站的數據庫建立在Oracle上的,一共有18個數據庫分散在大小不等的100多個邏輯設備。為此我們就在新的SQL Server數據庫中,創(chuàng)建相對應的18個方案,來完成存儲空間移植的工作。特別是對于表的分區(qū),一般情況下我們應該能夠將數據大致平均地分部在各個分區(qū)上。由于網站系統(tǒng)中數據是以時間為單位分部的,因此將主要數據按月份分為12個區(qū)是順理成章的。不過另一方面,網站的計算是每天晚上啟動的,啟動以后會計算當月或者前一個月的數據,因此,在某一個時間單元里面,數據庫對數據的訪問也是集中在某個月份的。也就是說這樣的分區(qū)方法并沒有達到我們提高數據表訪問并行度從而提高性能的目的,也無法很好得解決磁盤競爭沖突等問題。由此我們引入了新的分區(qū)方法-Hash分區(qū)。對數據表的Hash分區(qū)可以很好的解決以上所說的并發(fā)度和競爭沖突的問題,不過也存在它的缺陷。所以,經過針對PnA系統(tǒng)的分析和討論,我們決定選擇區(qū)間和Hash組合的分區(qū)方式,這樣既做到了各個分區(qū)數據量的大致均等,又使不同的fund分區(qū)存放,提高了系統(tǒng)訪問的并發(fā)度。
3 具體對象的數據庫移植
在商業(yè)網站具體對象的數據庫移植,這些具體對象包括:表、索引、視圖以及數據類型。面來具體介紹了數字類型數據庫如何實現它在新SQL Server環(huán)境中的移植工作。數字類型數據庫中是最常見的一種對象類型,它本身并不復雜,轉換起來也比較方便??墒峭袝r由于具體的要求,表中存放數據對精度的要求比普通數據高很多,這樣就出現一定問題了。特別是商業(yè)網站系統(tǒng),平時每天都涉及大量的網絡數據I/O和相關的計算,需要最大程度地保證數據精度,減少計算誤差,保障客戶利益。在網站系統(tǒng)中,原來的數據庫上用Oracle中的float類型來表示浮點數,為了提升精度,在新的SQL Server系統(tǒng)中我們用NUMBER來表示各種數字,進行各種計算。Number類型的數字根據其參數的不同,可以表示成各種精度的整數或者小數,比如Number(1,2),等等。然而有一個問題需要注意,我們發(fā)現,簡單地將Oracle中的float替換成SQL Server中的Number會產生一個問題。讓我們看一個例子。在我們處理的計算中間過程中,需要從數庫里取出一個浮點數并在之后的應用中和其他計算結果相比較,要求誤差在于分之一以內。假設我們讀取的是14.9875,那么我們在Oracle系統(tǒng)中,用這樣的語句來讀取并為以后的比較作準備:Select round (value, 3)from table1。相同的,Oracle中我們也用同樣的語句來讀取。可是我們卻發(fā)現,在Oracle中select的結果是14.987,而在SQL Server中,這個結果變成了14.988。為了作測試,我們分別在我們的兩個Server上運行如下的語句,來定位問題的所在。Oracle: Select round (14.9875, 3);SQL Server: Select round (14.9875, 3) from dual。
4 數據移植
當存儲空間移植完成以后,我們就可以進行數據的移植。數據的移植在整個移植過程中顯得非常重要,因為它是后面移植工作的基礎,也是保證移植正確性的關鍵所在。選擇一種高效的方式來實現數據移植是十分恰當而有必要的。首先在從Oracle到SQL Server的數據庫移植過程中,SQL Server提供的數據庫工具OMWB具備了數據移植的功能。不過為了將Oracle中不同的數據庫和SQL Server中不同的Schema對應起來,我們只能選擇一種合適的手工參與結合數據庫工具的方法,來實施數據移植的工作。開發(fā)人員手工參與的方法有很多,當然,最簡單直接的就是通過ODBC/JDBC來實現,然而這是一種比較低效的方法,在數據量小的時候還可以適用,在數據量暴增成千上萬倍的今天,這樣做帶來的只能是速度上的極其低下。我們嘗試過對一張千萬行級別的表進行了移植,整個工作要花幾天的時間,并且中間不能間斷,萬一有什么意外發(fā)生,前面的工作都將前功盡棄。因此,這并不是一個好方法。事實上,網站大部分數據其實都集中在某一部分大表中,在最終用戶環(huán)境中,我們運用基于Oracle的相關腳本來配合我們實現數據庫中的數據移植。因為腳本工具相對于ODBC等方法來說,對數據的操作更加直接,不需要繁瑣的額外過程,效率特別高。對于我們的兩個數據庫系統(tǒng)來說,有很多腳本工具可以選擇,我們只需選擇各個數據庫產品中相對高效、易于控制的腳本來幫助我們實現就可以了。最后,由于網絡數據庫系統(tǒng)的數據敏感性,我們最后要對移植的結果作出詳細嚴格的測試,以有效的手段證明數據移植的準確性。我們的目標是移植前后數據相同或在一個很小的可以容忍的誤差范圍內。前文涉及到這類問題的有空串的移植、浮點精度等問題,這些都需要我們以適當質量保證手段來確保一致性。
總之,我們簡單總結和介紹了在我們商業(yè)網站系統(tǒng)的數據庫移植過程中所碰到的和可能碰到的各種問題,并提出了相應的解決方法。不過我們在數據庫移植過程中需要根據具體情況對各個方面作出出合適的轉換。在實際轉換過程中,我們就根據不同的特點,提出了不同的數據策略。
參考文獻:
[1] 張曉,張羽.遠程數據庫遷移技術研究[J].計算機應用研究,2005(4).
[2] 蓋國強.循序漸進Oracle數據庫管理、優(yōu)化與備份恢復[M].北京:人民郵電出版社,2007.