一種基於Oracle資料庫的在線數據遷移方法
2023-09-17 22:43:45 3
專利名稱::一種基於Oracle資料庫的在線數據遷移方法
技術領域:
:本發明涉及資料庫應用技術,尤其涉及Oracle資料庫的應用技術。技術背景隨著資料庫管理系統和作業系統平臺更新換代的速度不斷加快,資料庫工程師經常需要在兩個不同的資料庫之間或在兩種不同的作業系統平臺之間進行數據遷移。數據遷移是指將數據從一臺機器遷移到另一臺機器,或者將數據從一個資料庫遷移到另一個資料庫,並且這些數據(包括結構定義)在轉移後能正常運行。在現有技術中,常用的數據遷移方法主要包括採用導出/導入(export/import)或者Oracle10g版本提供的導出/導入(expdp/impdp)方式、insert/*+append*/into...什omdbjink+nologging、standby遷移方式、利用stream與相關工具進行的數據遷移和基於表空間傳輸以及Oracle10g的跨平臺數據文件轉換結合的方式。但是,上述的這些遷移方式有的停機時間過長,有的難以確定完全同步開始時的SCN點,有的則不能跨平臺、跨版本和跨字符集進行數據遷移。
發明內容針對基於Oracle資料庫而進行數據遷移時所存在的上述技術缺陷,本發明提供了可實現跨平臺、跨版本且高效快速的在線數據遷移方法。按照本發明的一個方面,才是供了一種採用prebuiltmv(materializedview:物化視圖)方式進行數據遷移的方法。該方法是指在預先創建好的表上面建立物化視圖,當該物化視圖被刪除的時候,原來已創建好的表仍予以保留,同時同步過來的數據也被保留。該方法採用表對象作為數據遷移的單個對象,並針對該表對象用一個主鍵刷新mv。首先在源表上創建mv日誌,並在目標資料庫上創建結構一樣的目標表;然後在目標表上採用prebuilt方式創建mv,並進行完全刷新;在以後的創建過程中採用增量刷新方式,當需要進行資料庫切換時只需刷新增量的日誌,刪除mv和保留目標表。該方法所實現的數據遷移可採用下列步驟(1)依照預定的容量大小對表對象進行分級,將超過所述預定容量的表對象作為大表,將低於所述預定容量的表對象作為小表;(2)將所述大表作為源表,在源資料庫上創建物化視圖日誌;(3)在目標資料庫上創建與所述源表的結構相同的目標表,並在所述目標表上釆用prebuilt方式創建物化視圖;(4)對同步日誌進行完全刷新;(5)對所述同步日誌進行增量刷新;(6)創建可實現自動增量刷新的程序代碼;(7)按上述步驟(2)-(6)依次處理所有的大表;(8)對採用insert/*+append*/into...什omdb一link處理的小表,整理好insertinto的腳本;(9)運行所述的insertinto腳本,對所述小表進行數據遷移;以及(10)遷移切換。更具體地,在進行遷移切換時,包括如下的一系列#:作停止源資料庫的一切活動、等待最後一批日誌完成增量刷新、運行小表腳本並insertinto小表數據、等待所有的大表完成刷新、刪除源表中的mvlog和目標表中的mv並保留目標表和數據、創建與目標表有依賴關係的對象(如自增長的序列)。按照本發明的又一個方面,提供了一種使用創建觸發器和創建過程相結合的方式(trigger+procedure)進行數據遷移的方法。該方法釆用表對象作為數據遷移的單個對象,並要求該表對象有一個主鍵。首先利用觸發器記錄該表的DML(DataManipulationLanguage:數據才喿縱語言)日誌,然後通過用戶自定義的過程與該DML日誌同步。鑑於該方法主要彌補了採用prebuiltmv方式進行數據遷移時難以刷新大表的缺點,下列步驟主要用來完全刷新大表(1)依照預定的容量大小對表對象進行分級,將超過所述預定容量的表對象作為大表,將低於所述預定容量的表對象作為小表;(2)將所述大表作為源表,在所述源表上創建數據操縱語言的觸發器;(3)在目標資料庫上創建與所述源表結構相同的目標表;(4)所述觸發器開始工作後,分批載入所述源表中的數據至所述目標資料庫的所述目標表中;(5)在所述目標資料庫上創建用戶自定義的過程;(6)完全刷新由所述觸發器產生的同步日誌;(7)對所述同步日誌進行增量刷新;以及(8)遷移切換。更具體地,在進行遷移切換時,包括如下的一系列操作通過用戶自定義的過程完成日誌的刷新、刪除觸發器與該過程以及調度的作業、完成目標表的同步刷新。按照本發明的又一個方面,提供了一種創建觸發器和自定義程序與使用sqHoader工具相結合(trigger+sqnoader+程序)進行數據遷移的方法。該方法主要利用文本文件或者進程通信進行中間轉換,通過sq^loader載入數據,並依據資料庫工程師自定義的程序分析同步日誌。需要指出的是,利用sq鬥oader工具可以將一些以文本文件格式存放的數據順利地導入到Oracle資料庫中,是一種在不同資料庫之間進行數據遷移非常便捷和常用的手段。該方法可通過下列的步驟進行數據遷移(1)依照預定的容量大小對表對象進行分級,將超過所述預定容量的表對象作為大表,將低於所述預定容量的表對象作為小表;(2)將所述大表作為源表,在所述源表上創建數據操縱語言的觸發器;(3)在目標資料庫上創建與所述源表結構相同的目標表;(4)所述觸發器開始工作後,分批載入所述源表中的數據至所述目標資料庫的所述目標表中;(5)在中間層利用兩個進程分別連接不同字符集的資料庫;(6)完全刷新由所述觸發器產生的同步曰志;(7)對所述同步日誌進行增量刷新;以及(8)遷移切換。更具體地,步驟(1)中的小表載入包括兩種方式利用select或者程序生成文本文件,通過Sql*loader載入;直接生成insertinto的腳本到文本文件,然後執行。更具體地,步驟(6)中同步日誌可採用兩種方案,一是在源上根據日誌直接生成DML語句,採用文本方式發送到目標執行;一是在中間層利用兩個進程,分別連接不同字符集的資料庫,其中的一個進程用於分析日誌,另一個進程用於同步曰志。更具體地,步驟(8)中的遷移切換包括同步完最後的日誌、停止同步程序。採用本發明中基於Oracle資料庫的prebuiltmv方式、trigger+Procedure方式和trigger+sqnoader+程序方式進行的遷移方法,均能實現跨平臺和跨資料庫版本的數據遷移,並可完成數據的重組優化,其中trigger+Sq廣loader+程序方式還能實現跨字符集的數據遷移,極大了提高了數據遷移的效率,減少了停機切換時間。讀者在參照附圖閱讀了本發明的具體實施方式以後,將會更清楚地了解本發明的各個方面。其中,圖1示出了現有技術中常用的幾種數據遷移的方法;圖2示出了本發明中實現在線數據遷移的三種方式;圖3示出了本發明中基於prebuiltmv方式的在線數據遷移方法;圖4示出了本發明中基於trigger+procedure方式的在線數據遷移方法;而圖5示出了本發明中基於trigger+sqrioader+程序方式的在線數據遷移方法。具體實施方式下面參照附圖,對本發明的具體實施方式作進一步的詳細描述。圖1示出了現有技術中常用的幾種數據遷移的方法,其中,可進行在線數據遷移的方式包括standby、stream和相關工具;需要較長的停機時間方可完成數據遷移的方式包括exp/imp或Oracle10g版本下的expdp/impdp、採用指令insert/*+append*/into...fromdb—link+nologging的dblink方式和表空間傳l命。參照圖1,上述幾種常用的數據遷移方法按照是否支持在線遷移,可分為如下的流程進行(1)數據遷移準備100;(2)是否在線遷移的判斷102;(3)若不進行在線遷移,則執行停機維護104;(4)常用的遷移方式,如導出/導入,dblink,表空間傳輸等106;(5)若進行在線遷移,則採用standby,stream與相關工具等108;(6)遷移切換110;以及(7)在執行完106或者110後,完成數據遷移112。圖2示出了本發明中實現在線數據遷移的三種方式,即,prebuiltmv方式、trigger+procedure方式、trigger+sqHoader+牙呈序方式。上述三種方式老卩i己錄源表的DML操作日誌,並通過完全刷新同步日誌和增量刷新同步日誌,以實現源資料庫中不同容量的表對象的數據遷移。更具體地,prebuiltmv方式和trigger+procedure方式能夠實現跨平臺和跨版本的數據遷移,而trigger+sq廣loader+程序方式不僅能實現跨平臺和跨版本的數據遷移,而且還可利用文本文件或者進程間的通信來實現跨字符集的數據遷移。參考圖2,本發明實現在線數據遷移的幾種方法可有如下的流程來共同表示(1)數據遷移準備200;(2)在線數據遷移202;(3)基於Oracle資料庫的跨平臺、跨版本的數據遷移204;(4)基於Oracle資料庫的跨平臺、跨版本、跨字符集的數據遷移206;(5)若執行204的數據遷移,可採用prebuiltmv方式208或者採用trigger+procedure方式210;(6)若執行206的數據遷移,可採用trigger+sqHoader+程序方式212;(7)當執行208、210或者212的方法實現數據遷移時,記錄日誌214;(8)完全刷新同步日誌216;(9)增量刷新同步日誌218;(10)遷移切換220;以及(11)完成數據遷移222。圖3、圖4和圖5分別是上述三種數據遷移方式的具體實現流程,以下對其依次作以闡述。圖3示出了本發明中基於prebuiltmv方式的在線數據遷移方法。該方法將表對象作為數據遷移的單個對象,並通過下述的具體步驟來完成數據遷移(1)數據遷移準備300;(2)將表對象作為遷移的單個對象302;(3)表容量是否大於100M的判斷304,按照容量大小對表對象進行分級,將100M以上容量的表對象稱為大表,將100M以下容量的表對象稱為小表;(4沐用insertinto方式遷移數據306;(5)整理insertinto的腳本308;(6)運行insertinto腳本,遷移小表中的數據310;(7)在源資料庫上創建mv日誌,以記錄源表的DML操作312,創建mv日誌的指令為creatematerializedviewlogontable—name;(8)完全刷新同步日誌314,其具體執行指令為execdbms_mview.re&esh('table_name',method=>'Complete,);(9)增量刷新同步日誌316,其具體執行指令為execdbms—mview.re什esh('table—name')declarejobidnumber;beginsys.dbms」ob.submit(job=>jobid,what=>'dbms—mview.refresh("table—name");',next—date=>sysdate,interval=>'sysdate+1/1440,);commit;end;以及(10)遷移切換318和完成數據遷移320。其中步驟遷移切換318,它包括停止源資料庫的一切活動、等待最後一批曰志完成增量刷新、運行小表腳本並insertinto小表數據、等待所有的大表完成刷新、刪除源表中的mvlog和目標表中的mv並保留目標表和數據、創建與目標表有依賴關係的對象(如自增長的序列)。圖4示出了本發明中基於trigger+procedure方式的在線數據遷移方法。該方法採用觸發器記錄源表的DML日誌,採用用戶自定義的過程同步日誌以完成數據遷移,當觸發器與該自定義的過程結合使用時,用戶可根據自己的需要在過程中寫入自己的業務需求,也可將多個資料庫中的表刷新到一個目標表中,數據遷移因而變得更為靈活。該方法可通過如下的具體步驟進行實現(1)數據遷移準備400;(2)將表對象作為遷移的單個對象402;(3)對表容量是否大於100M的判斷404,按照容量大小對表對象進行分級,將100M以上容量的表對象稱為大表,將100M以下容量的表對象稱為小表;(4)採用insertinto方式遷移數據406;(5)整理insertinto的腳本408;(6)運行insertinto腳本,遷移小表中的數據410;(7)在源資料庫上創建日誌表412,更具體地,日誌表的創建可表示為createtableREP—TABLE—LOGS(REP—KEYNUMBERnotnull,DML—TYPEVARCHAR2("notnull,DML_TIMEDATEdefaultsysdatenotnull,REP_FLAGNUMBERdefault0notnull);(8)在源表上創建DML的觸發器414;(9)判斷觸發器是否開始工作416;(10)批量載入源表的數據至目標資料庫中418;(11)在目標資料庫上創建procedure,完全刷新觸發器產生的同步日誌420;(12)增量刷新同步日誌422;以及(13)遷移切換424和完成數據遷移426。圖5示出了本發明中基於trigger+sq廣loader+程序方式的在線數據遷移方法。該方法利用文本文件或者進程間的通信進行中間轉換,以實現不同字符集的數據完成遷移。該遷移方法也可採用如下的步驟進行實施(1)數據遷移準備500;(2)將表對象作為遷移的單個對象502;(3)對表容量是否大於100M進行判斷504,依照預定的容量大小對表對象進行分級,將超過所述預定容量的表對象作為大表,將低於所述預定容量的表對象作為小表;(4)利用select或者是程序生成文本文件506;(5)通過sql*loader載入數據508;(6)創建自定義程序,起兩個進程分別連接不同字符集的資料庫510;(7)在源資料庫上創建曰志表512;(8)在源表上創建DML的觸發器514;(9)判斷觸發器是否開始工作516;(10)批量載入源表的數據至目標資料庫中518;(11)在中間層利用兩個進程,分別連接不同字符集的資料庫,分析和同步日誌520;(12)增量刷新同步日誌522;以及(13)遷移切換524和完成數據遷移526。更具體地,在步驟(3)中遷移小表中的數據採用兩種方案,一是利用select或者是程序生成文本文件,並通過sqnoader工具載入數據;一是直接生成insertinto的腳本到文本文件並執行。更具體地,在步驟(11)中同步日誌還可利用另一種方案實現,即,在源資料庫上根據日誌,直接生成DML語句,並採用文本文件的方式發送到目標資料庫執行。上文中,參照附圖描述了本發明的具體實施方式。但是,本領域中的普通技術人員能夠理解,在不偏離本發明的精神和範圍的情況下,還可以對本發明的具體實施方式作各種變更和替換。這些變更和替換都落在本發明權利要求書所限定的範圍內。權利要求1.一種基於Oracle資料庫的在線數據遷移方法,其特徵在於,該方法採用下列步驟實現(1)依照預定的容量大小對表對象進行分級,將超過所述預定容量的表對象作為大表,將低於所述預定容量的表對象作為小表;(2)將所述大表作為源表,在源資料庫上創建物化視圖日誌;(3)在目標資料庫上創建與所述源表的結構相同的目標表,並在所述目標表上採用prebuilt方式創建物化視圖;(4)對同步日誌進行完全刷新;(5)對所述同步日誌進行增量刷新;(6)創建可實現自動增量刷新的程序代碼;(7)按上述步驟(2)-(6)依次處理所有的大表;(8)對採用insert/*+append*/into...fromdb_link處理的小表,整理好insertinto的腳本;(9)運行所述的insertinto腳本,對所述小表進行數據遷移;以及(10)遷移切換。2.如權利要求1所述的方法,其特徵在於,在執行步驟(3)時,所述源表的結構在所述日誌創建完成之後且在遷移數據的複製完成之前保持不變。3.如權利要求1所述的方法,其特徵在於,所述完全刷新僅在第一次同步所述曰志時#<行。4.一種基於Oracle資料庫的在線數據遷移方法,其特徵在於,該方法採用下列步驟實現(1)依照預定的容量大小對表對象進行分級,將超過所述預定容量的表對象作為大表,將低於所述預定容量的表對象作為小表;(2)將所述大表作為源表,在所述源表上創建數據操縱語言的觸發器;(3)在目標資料庫上創建與所述源表結構相同的目標表;(4)所述觸發器開始工作後,分批載入所述源表中的數據至所述目標資料庫的所述目標表中;(5)在所述目標資料庫上創建用戶自定義的過程;(6)完全刷新由所述觸發器產生的同步日誌;(7)對所述同步日誌進行增量刷新;以及(8)遷移切換。5.如權利要求4所述的方法,其特徵在於,在執行步驟(1)時,對低於所述預定容量的表對象,採用insert/*+appendVinto...fromdb—link進行數據遷移。6.如權利要求4所述的方法,其特徵在於,所述日誌的REP—KEY用於存放所述源表的主鍵,欄位類型取決於所述源表的欄位類型。7.如權利要求4所述的方法,其特徵在於,在執行步驟(3)時,所述源表的結構在所述觸發器創建完成之後且在遷移數據的複製完成之前保持不變。8.如權利要求4所述的方法,其特徵在於,所述觸發器可以記錄所述源表的數據操縱語言的操作日誌。9.如權利要求4所述的方法,其特徵在於,創建所述用戶自定義的過程可以同步由所述觸發器產生的所述數據操縱語言的操作日誌。10.—種基於Oracle資料庫的在線數據遷移方法,其特徵在於,該方法採用下列步驟實現(1)依照預定的容量大小對表對象進行分級,將超過所述預定容量的表對象作為大表,將低於所述預定容量的表對象作為小表;(2)將所述大表作為源表,在所述源表上創建數據操縱語言的觸發器;(3)在目標資料庫上創建與所述源表結構相同的目標表;(4)所述觸發器開始工作後,分批載入所述源表中的數據至所述目標資料庫的所述目標表中;(5)在中間層利用兩個進程分別連接不同字符集的資料庫;(6)完全刷新由所述觸發器產生的同步日誌;(7)對所述同步日誌進行增量刷新;以及(8)遷移切換。11.如權利要求10所述的方法,其特徵在於,在執行步驟(1)時,對小於所述預定容量的表對象,利用select指令或者程序代碼生成文本文件,通過Sqnoader載入。12.如權利要求10所述的方法,其特徵在於,在執行步驟(1)時,對小於所述預定容量的表對象,直接生成insertinto的腳本到文本文件並予以執行。13.如權利要求11或12所述的方法,其特徵在於,利用用戶自定義的程序,創建兩個進程,並將所述兩個進程分別連接至不同字符集的資料庫,以進行跨字符集的數據遷移。14.如權利要求10所述的方法,其特徵在於,所述觸發器可以記錄所述源表的數據操縱語言操作日誌。15.如權利要求10所述的方法,其特徵在於,步驟(5)中所述兩個進程包括第一進程和第二進程,所述第一進程用於分析日誌,所述第二進程用於同步日誌。16.—種採用如權利要求1、4、10中的任一權利要求所述遷移方法的在線數據遷移系統。17.—種採用如權利要求1、4和10中的任一權利要求所述方法在資料庫之間進行數據同步複製的方法。全文摘要本發明揭示了基於Oracle資料庫實現在線數據遷移的方法,主要包括prebuiltmv、trigger+procedure和trigger+sql*loader+程序。上述三種方式均採用記錄源表的操作日誌、完全刷新和增量刷新同步日誌和遷移切換以完成數據遷移。採用本發明的prebuiltmv和trigger+procedure可以實現跨平臺、跨版本的數據遷移,而採用trigger+sql*loader+程序可以利用文本文件或者進程間的通信實現不同字符集的資料庫之間的轉換,因而可實現跨字符集的數據遷移。文檔編號G06F17/30GK101266606SQ20071008868公開日2008年9月17日申請日期2007年3月15日優先權日2007年3月15日發明者陳吉平申請人:阿里巴巴公司