通過RMAN的Transportable平臺間轉移資料

qqmengxue發表於2010-11-01

首先檢視可以使用RMAN的transportable功能的平臺:

SQL> COLUMN PLATFORM_NAME FORMAT A32
SQL> SELECT * FROM V$TRANSPORTABLE_PLATFORM;

PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
----------- -------------------------------- --------------
1 Solaris[tm] OE (32-bit) Big
2 Solaris[tm] OE (64-bit) Big
7 Microsoft Windows IA (32-bit) Little
10 Linux IA (32-bit) Little
6 AIX-Based Systems (64-bit) Big
3 HP-UX (64-bit) Big
5 HP Tru64 UNIX Little
4 HP-UX IA (64-bit) Big
11 Linux IA (64-bit) Little
15 HP Open VMS Little
8 Microsoft Windows IA (64-bit) Little
9 IBM zSeries Based Linux Big
13 Linux 64-bit for AMD Little
16 Apple Mac OS Big
12 Microsoft Windows 64-bit for AMD Little
17 Solaris Operating System (x86) Little

在以上的支援的平臺列表中,如果source platform和target platform平臺版本不一致的話就還需要額外的步驟就是在source platform和target platfrom平臺上執行convert,在開始轉儲之前。

當然如果你的目標平臺和源平臺都一樣的話以上步驟就可以免去了。

[@more@]

此功能的限制

1、兩個平臺的字符集應該一致

2、如果目標平臺和源平臺的表空間將要轉儲的表空間名稱有一致的那麼也不行,但是你可以通過修改兩邊平臺的任意一個的表空間名來避免這種問題的存在。

3、所有的物件應該都在將要轉儲的表空間內

4、將要轉儲的表空間所屬局schema必須也在目標平臺上存在

5、如果所要轉儲的表空間內包含XMLType型別的資料,那麼在轉儲的工具的選擇上你只能使用EXP和IMP不能使用10g提供的資料泵工具,如果你使用的EXP和IMP那麼在轉儲的時候不要忘了將CONSTRAINTS 和TRIGGERS 兩個引數設定為Y。

可以通過以下的查詢,找出是否包含XMLType:

select distinct p.tablespace_name
from dba_tablespaces p, dba_xml_tables x, dba_users u, all_all_tables t
where t.table_name=x.table_name and
t.tablespace_name=p.tablespace_name and
x.owner=u.username

轉儲包含XMLType型別的表空間時,包含了以下的一些限制:

a、目標庫內也要安裝了XML DB

B、schema所引用的XMLType表不能是XML DB的標準schema

c、schema所引用的XMLType表,不能包含cyclic dependencies.
d、一些行級的加密資料可能在imp的時候丟失

e、如果所要傳輸的XMLType型別的表所引用的schema沒有宣告,那麼在匯入的時候就會自動建立並註冊,但是如果要傳入的庫內已經存在了對應的schema那麼如果你沒有指定ignore=y的情況下就會報錯

5、含有高階佇列的表空間不能相容8.0-compatible

6、你不能傳輸SYSTEM表空間以及屬於SYS使用者的物件。

7、那些不透明的物件例如:such as RAW, BFILE, and the AnyTypes也可以被傳輸,但是傳輸的時候將不會有平臺之間的convert,

8、浮點數也可以被傳輸,但是要使用10g提供的資料泵工具而不是原始的EXP工具。

=======================================

傳輸EXP/IMP ASM表空間:

*使用RMAN進行CONVER

對於傳輸ASM檔案來說 沒有直接的辦法,可以通過RMAN來完成:

執行以下步驟:

1、預處理將要匯出的表空間:

*檢查表空間內的物件是否都屬於要傳輸的物件

SQL>execute sys.dbms_tts.transport_set_check('TBS1,TBS2', true);
SQL> select * from sys.transport_set_violations;

如果有輸出,則在傳輸之前必須將這些問題解決掉。

* 將要傳輸的表空間置為只讀模式

SQL> ALTER TABLESPACE TBS1 READ ONLY;
SQL> ALTER TABLESPACE TBS2 READ ONLY;

2、匯出基礎資料


*使用原始的工具匯出

exp userid='sys/sys as sysdba' file=tbs_exp.dmp log=tba_exp.log
transport_tablespace=y tablespaces=TBS1,TBS2
*使用資料泵工具匯出

CREATE OR REPLACE DIRECTORY dpump_dir AS '/tmp/subdir' ;
GRANT READ,WRITE ON DIRECTORY dpump_dir TO system;

expdp system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir
TRANSPORT_TABLESPACES = TBS1,TBS2
如果你想同時對要轉出的表空間進行一次嚴格的檢查可以加入如下引數:TRANSPORT_FULL_CHECK parameter:

expdp system/password DUMPFILE=expdat.dmp DIRECTORY = dpump_dir
TRANSPORT_TABLESPACES= TBS1,TBS2 TRANSPORT_FULL_CHECK=Y

如果要轉出的表空間裡面包含的並非完全是當前要轉出的schema的資料,那麼就會有錯誤報出。

3、查詢目標平臺的平臺名

可以通過查詢V$TRANSPORTABLE_PLATFORM 來得到目標資料庫平臺的平臺名:

SELECT tp.platform_id,substr(d.PLATFORM_NAME,2,30), ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

4、生成系統級的檔案以便進行轉儲

RMAN> CONVERT TABLESPACE TBS1
TO PLATFORM 'HP-UX (64-bit)' FORMAT '/tmp/%U';
RMAN> CONVERT TABLESPACE TBS2
TO PLATFORM 'HP-UX (64-bit)' FORMAT '/tmp/%U';

5、將上面生成的檔案拷貝到目標平臺

6、匯入以上匯出的檔案到目標平臺

*使用原始的工具:

imp userid='sys/sys as sysdba' file=tbs_exp.dmp log=tba_imp.log
transport_tablespace=y datafiles='/tmp/....','/tmp/...'
*使用資料泵工具:

CREATE OR REPLACE DIRECTORY dpump_dir AS '/tmp/subdir' ;
GRANT READ,WRITE ON DIRECTORY dpump_dir TO system;

impdp system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir
TRANSPORT_DATAFILES='/tmp/....','/tmp/...'
REMAP_SCHEMA=(source:target) REMAP_SCHEMA=(source_sch2:target_schema_sch2)

如果你要匯入的schema不是你當初匯出的schema那麼你可以通過REMAP_SCHEMA來進行轉換。

7、設定表空間為讀寫模式

SQL> ALTER TABLESPACE TBS1 READ WRITE;
SQL> ALTER TABLESPACE TBS2 READ WRITE;

如果你僅僅是將ASM的表空間轉儲到普通的檔案系統,那麼執行完以上的步驟後工作就算完成,但是如果你是將ASM的表空間轉儲到其他ASM上那麼還要繼續一下的工作。

8、通過RMAN拷貝以上的資料檔案到ASM內:

rman nocatalog target /
RMAN> backup as copy datafile '/tmp/....dbf' format '+DGROUPA';

+DGGROUPA是ASM的名字

9、切換到新拷貝的資料檔案

如果10g的資料庫是open狀態的,那麼你首先要將資料檔案offline:

SQL> alter database datafile '/tmp/....dbf' offline;

進行切換:

rman nocatalog target /
RMAN> switch datafile '/tmp/....dbf' to copy;
以下的是列出了拷貝後生成的新的檔案:

# ex. '+DGROUPA/s101/datafile/tts.270.5'

10、設定資料檔案為online模式,但是首先需要對其進行恢復:

SQL> recover datafile '+DGROUPA/s101/datafile/tts.270.5';
SQL> alter database datafile '+DGROUPA/s101/datafile/tts.270.5' online;
11、檢視是否新拷貝的資料檔案已經在資料檔案列表:

SQL> select name, status from v$datafile;
+DGROUPA/s101/datafile/tts.270.5 ONLINE






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

相關文章