Oracle10g 資料遷移方案(zt)

tolywang發表於2008-08-20


網上看到一個不錯的文章,轉帖給大家,包括傳輸表空間解決跨平臺及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的支援,因為這使得不同的資料移動方法都成為可行的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-430056/,如需轉載,請註明出處,否則將追究法律責任。

相關文章