Oracle10g的數據遷移方案

網上看到一個不錯的文章,轉帖給大家,包括傳輸表空間解決跨平臺及endian-ness問題的處理方法

找到將數據從倉庫遷移到集市的最快方法。


Lora是Acme銀行的數據庫管理員,她現在在該銀行高層管理團隊高級會議上成了大家最關注的核心人物。這次會議的目的是確定一些方法,來使最終用戶能夠詳細分析公司主數據倉庫中的數據。會上提出的一種想法是創建幾個小型數據集市--每個集市根據一個特定的職能範圍存儲數據--這樣每個數據集市就可以由專門的團隊來使用。

爲了有效地實現數據集市的方法,數據專家必須能將數據快速、有效地放入數據集市中。該團隊面臨的挑戰就是解決如何用數據倉庫中的數據快速刷新數據集市中的數據,而這些數據集市又運行在各個結構不同的平臺上。這就是Lora爲什麼出席會議的原因。她會爲移動數據提出哪些可供選擇的方法呢?

作爲一名經驗豐富、知識淵博的數據庫管理員,Lora向與會者提供了三種可能的方法,分別是:



使用可移動表空間
使用數據泵(導入和導出)
拖出表空間

本文介紹Lora對這三種可選方法的解釋,包括它們的實施細節和優缺點。

可移動表空間

Lora從可移動表空方法開始介紹。把整個表空間移動到目標系統的最快速方法是用FTP(文件傳輸協議)或rcp(遠程複製)來簡單地轉移表空間的基本文件。但是,僅僅複製Oracle數據文件還不夠,目標數據庫必須識別出並導入文件以及相應的表空間,最終用戶才能使用表空間數據。使用可移動表空間包括複製表空間文件和使它們中的數據在目標數據庫中可用。

在考慮該方法之前必須進行一些審查。首先,對於要轉移到目標系統的表空間TS1,它必須是自含式的(self-contained)。也就是說,在該表空間中表的所有索引、分區及其他從屬於該表的各數據段都必須在該表空間內部。Lora解釋說,如果一個表空間集合包含所有從屬的數據段,那麼就認爲這個集合是自含式的。例如,如果表空間TS1和TS2要作爲一個集合進行轉移,TS1中的一個表在TS2中有一個索引,則這個表空間集合就是自含式的。但是,如果TS1中的一個表另一個索引在表空間TS3中,則該表空間集合 (TS1, TS2)就不是自含式的。

要移動表空間,Lora提議使用Oracle數據庫10g中的數據泵導出(Data Pump Export)工具。數據泵是Oracle的新一代數據轉移工具,它替換了早期的Oracle Export (EXP)和Import (IMP)工具。這些老的工具使用正則SQL來提取和插入數據,而數據泵則與它們不同,它使用能繞過SQL緩衝區的專用API,從而使操作過程速度變得極快。此外,數據泵可以提取特定的對象,如特定的存儲過程或特定表空間的表集合。 數據泵的導出和導入可以由作業控制,數據庫管理員可以隨時暫停、重啓或終止這些作業。

開會前Lora運行了一項測試,看看數據泵能否解決Acme的要求。Lora進行的測試是轉移TS1和TS2表空間,步驟如下:

1.檢查TS1和TS2這個表空間集合是否是自含式的。執行下面的命令:



BEGIN
SYS.DBMS_TTS.TRANSPORT_SET_CHECK ('TS1','TS2');
END;

2.確定所有不可移動的集合。如果沒有選擇任何行,則該表空間是自含式的:


SELECT * FROM TRANSPORT_SET_VIOLATIONS;

no rows selected

3.確保該表空間是隻讀的:


SELECT STATUS
FROM DBA_TABLESPACES
WHERE TABLESPACE_NAME IN ('TS1','TS2');

STATUS
---------
READ ONLY
READ ONLY

4.使用傳輸機制,如FTP或rcp,將每個表空間中的數據文件移到遠程系統,放到/u01/oradata目錄下。

5.在目標數據庫中,創建一個到源數據庫的數據庫鏈接(在下面的命令行中命名爲srcdb)。



CREATE DATABASE LINK srcdb
USING 'srcdb';

6.在目標數據庫中,使用數據泵導入工具將該表空間導入到該數據庫中。


impdp lora/lora123
TRANSPORT_DATAFILES=
"'/u01/oradata/ts1_1.dbf',
'/u01/oradata/ts2_1.dbf'"
NETWORK_LINK='srcdb'
TRANSPORT_TABLESPACES=\(TS1,TS2\)
NOLOGFILE=Y

這一步就使TS1和TS2表空間以及它們的數據可以在目標數據庫中可用。

請注意,Lora並沒有從源數據庫導出元數據。她只是在上面的impdp命令中指定參數NETWORK_LINK的值爲srcdb,即到源數據庫的數據庫鏈接。數據泵導入工具通過數據庫鏈接從源數據庫中獲得所需的元數據,並在目標數據庫中重新創建它們。

7. 最後,使源數據庫中的TS1和TS2表空間成爲可讀寫。



ALTER TABLESPACE TS1 READ WRITE;
ALTER TABLESPACE TS2 READ WRITE;

這一步使TS1和TS2表空間在源數據庫中對用戶立即可用。

請注意,在前面講的所有步驟中,最費時的是第4步,在這一步中要跨各系統移動數據文件。

跨不同平臺的挑戰

Lora知道,數據複製過程中的複雜因素之一就是源平臺和目標平臺經常不一致。例如,在Acme的環境中,當前數據倉庫位於運行Tru64 UNIX的HP服務器上,而建議的數據集市將部署在運行Linux和Windows的Intel硬件上。

在Oracle數據庫10g出現之前,在Acme使用可移動表空間不是一個切實可行的方法。你不能移動表空間,除非源數據庫和目標數據庫運行在同一個平臺上。

有了Oracle數據庫10g,這一限制得到了極大的緩解。在移動表空間時,數據文件可以跨各操作系統任意複製。在前面的例子中,數據文件可以從Tru64 UNIX複製到Linux或Windows,而目標數據庫仍能識別它們。

但是,管理團隊必須考慮另一種限制。默認情況下,只有兩個操作系統具有相同的字節順序(也被稱爲"endian-ness")時纔可能進行跨操作系統複製。在Acme的情況下,Tru64 UNIX、基於Intel的Linux和Windows都使用little-endian字節順序(低位在前),因此在它們之間進行文件複製是可能的。但是,有的團隊成員提出了在有關數據倉庫/數據集市的提案中使用Solaris操作系統的想法。Solaris使用big-endian字節順序(高位在前),這使得在數據庫之間進行簡單的文件複製成爲不可能。


Lora解釋說,Oracle提供了使用Oracle Recovery Manager (RMAN)進行字節順序轉換的解決方案。她描述了針對RMAN解決方案的一個測試,該測試根據前面講到的移動表空間解決方案的7個步驟,並稍作修改來適應Solaris到Intel/Linux的環境。除了在第5步之前或之後額外增加一步以外,所有操作步驟都一樣。在源(Solaris)數據庫服務器上執行的額外這一步如代碼清單1中所示。

用這些代碼,可以從Solaris格式的/u01/oradata/ts1_01.dbf文件創建Intel Linux格式的文件/u01/tts/ TS1_34。注意最初的文件並沒有被破壞;只是創建了一個可以被導入和傳輸到Linux上的目標數據庫中的新文件。

然後Lora討論了對RMAN解決方案的一些修改。第一,爲了提高性能,她可以指定PARALLELISM=子句來提高執行線程的數目。第二,她可以指定在不同的目錄下以相同的文件名創建數據文件。這些修改如下:



RMAN> CONVERT TABLESPACE TS1
2> TO PLATFORM 'Linux IA (32-bit)'
3> DB_FILE_NAME_CONVERT
4> '/u01/oradata','/u01/tts'
5> PARALLELISM=4
6> ;

這條命令用相同的文件名ts1_01.dbf但在/u01/tts目錄下根據原始文件/u01/oradata/ts1_01.dbf創建一個轉換後的數據文件。這種方法將所有轉換後的文件放到一個位置,這樣確定轉移哪個文件就更簡單了。

Lora還可以在目標(Linux)數據庫服務器而不是在源服務器上執行變換。在這種情況下,將在Linux服務器上執行轉換,如下所示:



RMAN> CONVERT DATAFILE
2> '/u01/oradata/ts1_1.dbf',
'/u01/oradata/ts2_1.dbf'
3> TO PLATFORM='Linux IA (32-bit)'
4> FROM PLATFORM='Solaris[tm] OE
(64-bit)'
5> DB_FILE_NAME_CONVERT="ts","tslinux"
6> ;

這條命令通過用tslinux代替ts(換句話說,將ts1_1.dbf轉換到Linux上的文件格式,新文件名爲tslinux1_1.dbf)來創建文件。在數據庫內,文件將用這個文件名。

Lora怎麼知道哪個平臺用哪種字節順序呢?在數據字典視圖上執行以下查詢就會給出答案:



SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_ID;

數據泵導出與導入工具

選擇可移動表空間的限制之一是在轉移文件時源表空間必須是隻讀模式。在現實世界中,並不總是能滿足這一要求。例如,在OLTP數據庫中,可能對錶要經常進行讀寫操作。

Lora提出的另一種方法是使用Oracle數據庫10g中的數據泵實用工具來轉移表空間。她對這種方法進行的測試包括移動TS1和TS2表空間內容的以下步驟:

1.創建一個目錄對象來存放轉儲的文件。



CREATE DIRECTORY dump_dir AS '/u01/dumps';

2.用數據泵導出工具導出數據。


expdp lora/lora123 TABLESPACES=\(ts1,ts2\) DUMPFILE=ts1_ts2.dmp DIRECTORY=dump_dir

這一步創建一個包含TS1和TS2表空間內容的文件/u01/dumps/ ts1_ts2.dmp。

3.將文件ts1_ts2.dmp轉移到遠程系統中,放在目錄/u01/dumps下(用文件傳輸的方法如FTP或rcp)。

4.在目標數據庫中創建一個目錄對象。



CREATE DIRECTORY dump_dir
AS '/u01/dumps';

5.使用數據泵導入工具將該文件導入到該數據庫中。


impdp lora/lora123 DIRECTORY=dump_dir DUMPFILE=ts1_ts2.dmp

如果表空間內的數據量相對較小,則Lora可以只用一條命令執行上面的所有步驟:


impdp lora/lora123 DIRECTORY=dump_dir NETWORK_LINK='srcdb' TABLESPACES=\(ts1,ts2\)

這條命令使用數據泵導入工具將通過數據庫鏈接srcdb(在以前的章節中已討論過)檢索到的數據加載到表中。但是,由於網絡帶寬通常是受到限制的,因此這種方法可能比使用導出/傳輸/導入週期方法要慢一些。

如果只需將特定的表或表集合進行轉移,那麼Lora可以在expdp命令中使用TABLES=子句來只下載特定的表或表集合。

拖出表空間

作爲第三種選擇,Lora建議使用Oracle數據庫10g中的新工具,它簡化了可移動表空間的移動方法,因此只涉及執行一個打包過程。在這種方法中,用戶利用所提供的DBMS_STREAMS_TABLESPACE_ADM包從源系統中"拖?quot;表空間。這個包使用數據泵轉移表空間並將數據文件轉換成目標系統的格式。 它還自動執行任何所需的字節順序變換。

下面給出在最簡單的情況下使用這種方法的過程--涉及單個簡單表空間(更復雜的情況在下一節介紹)。 如果一個表空間只有一個數據文件,則這個表空間稱爲簡單表空間。Lora演示了DBMS_STREAMS_TABLESPACE_ADM包中PULL_SIMPLE_TABLESPACE過程的使用方法:

1.在存放數據文件的目錄所在的(遠程)數據倉庫數據庫中創建一個目錄對象。



CREATE DIRECTORY dbf_dir AS '/u01/oradata/dw';

2.設置遠程數據庫中的表空間TS1爲只讀。


ALTER TABLESPACE TS1 READ ONLY;

剩下的一些步驟在本地(數據集市)數據庫中完成。

3.創建一個連接到遠程(數據倉庫)數據庫(在Lora的例子中是dwdb)的數據庫鏈接。



CREATE DATABASE LINK dwdb USING 'dwdb';

4.創建一個數據文件將被轉移到其中的目錄對象。


CREATE DIRECTORY dbf_dir AS '/u01/oradata/mart';

5.從遠程數據庫中拖出表空間。


BEGIN
DBMS_STREAMS_TABLESPACE_ADM
.PULL_SIMPLE_TABLESPACE (
tablespace_name => 'TS1',
database_link => 'dwdb',
directory_object => 'DBF_DIR',
conversion_extension => 'linux'
);
END;

該操作在後臺完成了許多步驟:設置源表空間爲只讀;用數據泵導出工具進行一次表空間的元數據轉儲;用DBMS_FILE_TRANSFER包移動數據文件和轉儲的文件;把源表空間恢復到其最初的讀寫狀態;使用數據泵導入工具將表空間插入到本地數據庫中。由於源數據庫運行在Linux上,而目標數據庫運行在Solaris上,因此這一操作首先複製原始數據文件(Linux的文件格式),然後將它轉換到目標平臺上(Solaris)的文件格式。複製過程保持最初被轉移的文件,而創建一個新文件用於轉換。新文件與最初的文件同名,但具有CONVERSION_EXTENSION參數指定的linux擴展名。在目標數據庫中創建的表空間爲只讀表空間。

該操作還在與數據文件相同的目錄下創建一個名爲ts1_01.plg的日誌文件。如果執行該過程返回錯誤信息,則檢查該文件的內容可能有助於找到錯誤的原因。

拖出多個表空間


上面的例子針對的是單個簡單表空間的情況。但如果Lora想移動一組表空間,或者一些表空間的數據文件多於一個,該怎麼辦呢?在這種情況下,她可以使用同一個包中的另一個過程PULL_TABLESPACES。代碼清單2給出的例子說明Lora如何轉移兩個表空間TS7和TS8,而不管它們有多少個數據文件。

該過程要求以VARCHAR2數據類型給出表空間名和目錄名。代碼清單2中第2行到第5行展示出了這些變量的聲明,第10行到第13行展示出這些變量被賦值給相應的表空間名和目錄名。 由於定義了兩個目錄,因此第一個文件在第一個目錄中創建,下一個文件在第二個目錄中創建,第三個文件再次在第一個目錄中創建,如此等等。這些操作通過數據泵作業來執行,作業名在第17行指定。如果需要的話,源系統字節順序的數據文件會自動轉換爲目標系統的字節順序。在目標數據庫中創建的新文件獲得linux擴展名,如第21行代碼所示。處理過程記錄在由目錄對象LOG_DIR指定的目錄中的ts7_ts8.log日誌文件中(第14行)。

這種方法的優點顯而易見。從一個系統把一個表空間轉移到另一個系統所需的所有操作任務都封裝在一個程序單元中,並且細節對用戶完全透明。甚至把文件從源系統轉移到目標系統的工作也在這個過程中通過所提供的DBMS_FILE_TRANSFER包來完成。用戶簡單地用表空間名調用該過程,表空間就會在本地數據庫中被刷新。他們不必操心底層的細節(如操作系統),因爲文件轉移過程自動轉換文件。這種方法有什麼不好的地方嗎?會上Lora講到,它的主要缺點就是將各個功能封裝在一個單一的過程內,這可能會掩蓋某一步產生的錯誤,使問題的診斷變得很複雜。手工轉移一個表空間的方法要求各條命令都是透明的,因而其好處是用戶能夠看到每一步操作的結果。

會議結束

針對Acme的數據倉庫/數據集市體系結構,Lora提出了幾種移動數據的可選方法。

第一種可選方法是使用可移動表空間,它能移動完整的表空間集合(不僅包括表,還包括索引、物化視圖和其他對象)。通常它還是這三種方法中最快的一種。但是,它的一個主要缺點是對指定的表空間必須在複製文件時設置爲只讀。

第二種方法是使用數據泵,它對錶空間是否爲只讀沒有要求。當只需要移動指定的表而不是整個表空間時,這種方法很有用。

最後一種方法是拖出表空間,該方法把可移動表空間方法的所有步驟組合成一步操作。用這種方法複製數據非常簡單,但要想調整每個具體步驟以便進行性能優化時,它爲數據庫管理員提供的靈活性太少。

在會議結束時,高級管理層對Lora表示感謝,而Lora也感謝高級管理層對Acme銀行遷移到Oracle數據庫10g的支持,因爲這使得不同的數據移動方法都成爲可行的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章