传输表空间简介
1.簡介
可以用oracle的傳輸表空間特點把數據庫的一個子集加入到另外一個數據庫中,實質上是在數據庫間移動表空間。被移動的表空間可以是字典管理的也可以是本地管理的。從
oracle9i開始,被傳輸的表空間不在要求和目標數據庫的數據塊大小一致。
移動相同的數據,傳輸表空間比expdb/impdb以及unload/load要快得多。這是因為傳輸表空間把包含數據的數據文件只是簡單的拷貝到目標位置,而導入工具把表空間對象的元數
據傳輸到新數據庫中。
傳輸表空間在一些
場景中適用,包括:
*在數據倉庫表中導出/導入分區表
*把結構化的數據發布到光盤(CDs)
*數據庫間拷貝多個只讀表空間
*歸檔歷史數據
*執行表空間基于時間點的恢復
2.跨平臺表空間傳輸
從oracle10g開始,可以跨平臺表空間傳輸,可以用于:
*把數據庫從一個平臺遷移到另一個平臺
*為內容提供上提供更簡易、更有效的方法來發布結構化數據,部署到在不同平臺上運行oracle數據庫的服務器上。
*簡單的從數據倉庫數據部署到運行于更小平臺的數據集市
*使安裝于不同操作系統或平臺上的ORACLE數據庫共享數據。如果所有的平臺可以訪問相同的存儲系統,并且有相同的endianness,那么他們之間是可以跨平臺傳輸表空間的。
可以查看V$TRANSAPORTABLE_FLATFORM視圖來查看支持跨平臺傳輸表空間,例如:
SQL> desc v$transportable_platform
?Name??????????????????????????????????????Null?????Type
?----------------------------------------- -------- ----------------------------
?PLATFORM_ID????????????????????????????????????????NUMBER
?PLATFORM_NAME??????????????????????????????????????VARCHAR2(101)
?ENDIAN_FORMAT??????????????????????????????????????VARCHAR2(14)
SQL> col PLATFORM_NAME for a40
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
PLATFORM_ID PLATFORM_NAME????????????????????????????ENDIAN_FORMAT
----------- ---------------------------------------- --------------
??????????9 IBM zSeries Based Linux??????????????????Big
?????????13 Linux x86 64-bit?????????????????????????Little
?????????16 Apple Mac OS?????????????????????????????Big
?????????12 Microsoft Windows x86 64-bit?????????????Little
?????????17 Solaris Operating System (x86)???????????Little
?????????18 IBM Power Based Linux????????????????????Big
?????????19 HP IA Open VMS???????????????????????????Little
?????????20 Solaris Operating System (x86-64)????????Little
?????????21 Apple Mac OS (x86-64)????????????????????Little
20 rows selected.
如果源平臺和目標平臺的endianness不同,需要一個補充的步驟來轉換源表空間或目標表空間到一個目標格式。如果他們有相同的endianness,不需要轉換,和相同的平臺一樣,
可以進行表空間傳輸。
一個表空間傳輸到不同的平臺之前,數據文件頭必須標示它所屬平臺。在10.0.0及以上版本的oracle數據庫中,你可以設置數據文件為讀寫模式來完成標示。
3.可傳輸表空間的限制
傳輸表空間受到如下限制:
*源數據庫和目標數據庫有相同的字符集和national字符集
*如果目標數據庫有相同名稱的表空間,你不能傳輸。你可以更改源數據庫的表空間名稱或者目標數據庫的表空間名稱
*有底層對象的對象(物化視圖)或者包含對象的對象(分區表)不能被傳輸,除非底層對象或被包含的對象也在傳輸的表空間集中
大多數實體在傳輸表空間后都是正常的,下面幾種情況例外:
*高級隊列
傳輸表空間不支持兼容8.0的高級隊列
*系統表空間對象
不能傳輸SYSTEM表空間或者SYS用戶擁有的對象。
*不透明的類型
*浮點數
INARY_FLOAT 和 BINARY_DOUBLE只能用數據泵傳輸
4.傳輸表空間的兼容性注意事項
當你創建傳輸表空間集的時候,oracle計算在目標數據庫運行的最低兼容性級別。從oracle10g開始,表空間可以傳輸給相同或更高兼容性級別的數據庫,無論目標數據庫在相同還
是不同的平臺上。如果傳輸表空間集的兼容性級別高于目標數據庫的兼容性級別,數據庫將報錯。
下表顯示在不同的場景中源數據庫和目標數據庫的兼容性級別。源數據庫和目標數據庫沒必要有相同的兼容性級別。
Transport Scenario?????????????????????????????????????????????????Minimum Compatibility Setting
????????????????????????????????????????????????????????????????????????Source Database?Target Database
Databases on the same platform?????????????????????????????????????????8.0?8.0
Tablespace with different database block size than the target database?9.0?9.0
Databases on different platforms?????????????????????????????????10.0?10.0
5.數據庫間傳輸表空間,過程和實例
傳輸和拷貝表空間集,需要執行以下幾步
A.如果是跨平臺傳輸,查看V$TRANSPORTABLE_PLATFORM視圖,看endian是否一致。如果不一致,需要在源數據庫或者目標數據庫執行一次轉換。否則,不需要轉換。
B.選擇一個自包含的表空間集。
C.生成傳輸表空間集,一個傳輸表空間集由被傳輸的表空間的數據文件和包含表空間集的結構化信息的導出文件組成。如果源數據庫和目標數據庫的endian不一樣,需要在源數據
庫端或者目標數據庫端做一次轉換,讓兩方一致。
D.傳輸表空間集,拷貝數據文件和導出文件到目標位置,你可以用各種文件復制工具(比如,操作系統復制命令,ftp,dbms_file_copy包,發布到CDs).如果需要轉換并且在源數
據庫端沒有轉換,需要在目標數據庫端做一次轉換。
E.加入表空間,用數據泵工具把傳輸表空間加入目標數據庫。
下面是一個例子:
第一步:測試平臺是否支持并且endian一致
這一步只有在源數據庫和目標數據庫不一樣的情況下才需要,如果sale1和sale2表空間被傳輸到一個不同的平臺上,你可以按下面的步驟測試:
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
?????FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
?????WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;
源數據庫平臺查詢結果:
PLATFORM_NAME?????????????ENDIAN_FORMAT
------------------------- --------------
Solaris[tm] OE (32-bit)???Big
目標數據庫平臺查詢結果:
PLATFORM_NAME?????????????ENDIAN_FORMAT
------------------------- --------------
Microsoft Windows NT??????Little
可見,需要進行一次轉換。
第二步:選擇自包含的表空間集:
在選擇的傳輸表空間和沒有選擇表空間之間可能會有些依賴關系,你只能選擇自包含的表空間,自包含意味著沒有引用從選擇的表空間只想沒有選擇表空間,一些自包含紊亂的例
子包括:
A.位于選擇表空間中的索引對應的表不在選擇的表空間內
B.分區表只有部分分區在選擇的表空間內
C.一致性約束指向為選擇的表空間的內的表
D.選擇表空間內的表包含LOB列,這個LOB列執行未選擇表空間內的LOBS
為了測試一個表空間是否自包含的,你可以使用DBMS_TTS包的TRANSPORT_SET_CHECK存儲過程,你必須擁有EXECUTE_CATALOG_ROLE。
使用DBMS_TTS包時,你可以指定表空間集中的需要檢查的表空間,你可以選擇性的指定必須檢查的表空間,對于嚴格或者全密封的表空間,你必須另外指定TTS_FULL_CHECK 參數為
TRUE
下面的語句用于檢查表空間sale1和sale2是否自包含的,
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('sales_1,sales_2', TRUE);
執行DBMS_TTS后,你可以查看TRANSPORT_SET+VIOLATIONS視圖查看表空間是否自包含的,如果是自包含的,查詢結果是空的。下表顯示兩個紊亂:
QL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
---------------------------------------------------------------------------
Constraint DEPT_FK between table JIM.EMP in tablespace SALES_1 and table
JIM.DEPT in tablespace OTHER
Partitioned table JIM.SALES is partially contained in the transportable set
These violations must be resolved before sales_1 and sales_2 are transportable. As noted in the next step, one choice for bypassing the integrity constraint
violation is to not export the integrity constraints.
第三步、產生傳輸表空間集
為了執行傳輸表空間導出操作,你必須擁有EXP_FULL_DATABASE角色。
確定你選擇的表空間是自包含的以后,你可以執行下面的動作來產生傳輸表空間集
A.把所有表空間設置為只讀.
SQL> ALTER TABLESPACE sales_1 READ ONLY;
Tablespace altered.
SQL> ALTER TABLESPACE sales_2 READ ONLY;
Tablespace altered.
B.在數據庫主機上調用數據泵,指定傳輸表空間集中的表空間
SQL> HOST
$ EXPDP system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir
????????TRANSPORT_TABLESPACES = sales_1,sales_2
你必須執行TRANSPORT_TABLESPACES,這個參數決定導出操作的模式,這個例子中
*DUMPFILE 參數指定結構化信息導出文件的名稱
*DIRECTORY 參數指定指向操作系統導出文件目錄的目錄對象,執行之前,必須創建目錄對象,必須把目錄對象的write權限授予public角色。
*觸發器和索引默認情況下被導出
如果你希望執行嚴格數據一致性檢查的傳輸,用TRANSPORT_SET_CHECK。例如:
EXPDP system/password DUMPFILE=expdat.dmp DIRECTORY = dpump_dir
??????TRANSPORT_TABLESPACES=sales_1,sales_2 TRANSPORT_FULL_CHECK=Y
C.轉換
如果表空間需要轉換
$ RMAN TARGET /
Recovery Manager: Release 10.1.0.0.0
Copyright (c) 1995, 2003, Oracle Corporation.??All rights reserved.
connected to target database: salesdb (DBID=3295731590)
RMAN> CONVERT TABLESPACE sales_1,sales_2
2> TO PLATFORM 'Microsoft Windows NT'
3> FORMAT '/temp/%U';
Starting backup at 08-APR-03
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=11 devtype=DISK
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00005 name=/u01/oracle/oradata/salesdb/sales_101.dbf
converted datafile=/temp/data_D-10_I-3295731590_TS-ADMIN_TBS_FNO-5_05ek24v5
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile conversion
input datafile fno=00004 name=/u01/oracle/oradata/salesdb/sales_101.dbf
converted datafile=/temp/data_D-10_I-3295731590_TS-EXAMPLE_FNO-4_06ek24vl
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:45
Finished backup at 08-APR-03
RMAN> exit
Recovery Manager complete.
第四步、傳輸表空間集
拷貝數據文件和導出文件到目標數據庫,可以用操作系統工具,ftp,DBMS_FILE_TRANSPORT包等。
如果表空間需要轉換,你必須做一次轉換。
RMAN> CONVERT DATAFILE
2> '/hq/finance/work/tru/tbs_31.f',
3> '/hq/finance/work/tru/tbs_32.f',
4> '/hq/finance/work/tru/tbs_41.f'
5> TO PLATFORM="Solaris[tm] OE (32-bit)"
6> FROM PLATFORM="HP TRu64 UNIX"
7> DBFILE_NAME_CONVERT=
8> "/hq/finance/work/tru/", "/hq/finance/dbs/tru"
9> PARALLELISM=5;
第五步、加入表空間集
用數據泵加入表空間和結構化信息。
IMPDP system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir
???TRANSPORT_DATAFILES=
???/salesdb/sales_101.dbf,
???/salesdb/sales_201.dbf
???REMAP_SCHEMA=(dcranney:smith) REMAP_SCHEMA=(jfee:williams)
所有這些操作以后,傳輸過來的表空間是只讀的,把這些表空間設置為READ/WRITE
ALTER TABLESPACE sales_1 READ WRITE;
ALTER TABLESPACE sales_2 READ WRITE;
?
?
?
總結
- 上一篇: ora-01950 对表空间无权限
- 下一篇: 利用DBMS_FILE_TRANSFER