传输表空间简介
1.簡介
可以用oracle的傳輸表空間特點把數(shù)據(jù)庫的一個子集加入到另外一個數(shù)據(jù)庫中,實質(zhì)上是在數(shù)據(jù)庫間移動表空間。被移動的表空間可以是字典管理的也可以是本地管理的。從
oracle9i開始,被傳輸?shù)谋砜臻g不在要求和目標(biāo)數(shù)據(jù)庫的數(shù)據(jù)塊大小一致。
移動相同的數(shù)據(jù),傳輸表空間比expdb/impdb以及unload/load要快得多。這是因為傳輸表空間把包含數(shù)據(jù)的數(shù)據(jù)文件只是簡單的拷貝到目標(biāo)位置,而導(dǎo)入工具把表空間對象的元數(shù)
據(jù)傳輸?shù)叫聰?shù)據(jù)庫中。
傳輸表空間在一些
場景中適用,包括:
*在數(shù)據(jù)倉庫表中導(dǎo)出/導(dǎo)入分區(qū)表
*把結(jié)構(gòu)化的數(shù)據(jù)發(fā)布到光盤(CDs)
*數(shù)據(jù)庫間拷貝多個只讀表空間
*歸檔歷史數(shù)據(jù)
*執(zhí)行表空間基于時間點的恢復(fù)
2.跨平臺表空間傳輸
從oracle10g開始,可以跨平臺表空間傳輸,可以用于:
*把數(shù)據(jù)庫從一個平臺遷移到另一個平臺
*為內(nèi)容提供上提供更簡易、更有效的方法來發(fā)布結(jié)構(gòu)化數(shù)據(jù),部署到在不同平臺上運行oracle數(shù)據(jù)庫的服務(wù)器上。
*簡單的從數(shù)據(jù)倉庫數(shù)據(jù)部署到運行于更小平臺的數(shù)據(jù)集市
*使安裝于不同操作系統(tǒng)或平臺上的ORACLE數(shù)據(jù)庫共享數(shù)據(jù)。如果所有的平臺可以訪問相同的存儲系統(tǒng),并且有相同的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.
如果源平臺和目標(biāo)平臺的endianness不同,需要一個補充的步驟來轉(zhuǎn)換源表空間或目標(biāo)表空間到一個目標(biāo)格式。如果他們有相同的endianness,不需要轉(zhuǎn)換,和相同的平臺一樣,
可以進行表空間傳輸。
一個表空間傳輸?shù)讲煌钠脚_之前,數(shù)據(jù)文件頭必須標(biāo)示它所屬平臺。在10.0.0及以上版本的oracle數(shù)據(jù)庫中,你可以設(shè)置數(shù)據(jù)文件為讀寫模式來完成標(biāo)示。
3.可傳輸表空間的限制
傳輸表空間受到如下限制:
*源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫有相同的字符集和national字符集
*如果目標(biāo)數(shù)據(jù)庫有相同名稱的表空間,你不能傳輸。你可以更改源數(shù)據(jù)庫的表空間名稱或者目標(biāo)數(shù)據(jù)庫的表空間名稱
*有底層對象的對象(物化視圖)或者包含對象的對象(分區(qū)表)不能被傳輸,除非底層對象或被包含的對象也在傳輸?shù)谋砜臻g集中
大多數(shù)實體在傳輸表空間后都是正常的,下面幾種情況例外:
*高級隊列
傳輸表空間不支持兼容8.0的高級隊列
*系統(tǒng)表空間對象
不能傳輸SYSTEM表空間或者SYS用戶擁有的對象。
*不透明的類型
*浮點數(shù)
INARY_FLOAT 和 BINARY_DOUBLE只能用數(shù)據(jù)泵傳輸
4.傳輸表空間的兼容性注意事項
當(dāng)你創(chuàng)建傳輸表空間集的時候,oracle計算在目標(biāo)數(shù)據(jù)庫運行的最低兼容性級別。從oracle10g開始,表空間可以傳輸給相同或更高兼容性級別的數(shù)據(jù)庫,無論目標(biāo)數(shù)據(jù)庫在相同還
是不同的平臺上。如果傳輸表空間集的兼容性級別高于目標(biāo)數(shù)據(jù)庫的兼容性級別,數(shù)據(jù)庫將報錯。
下表顯示在不同的場景中源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫的兼容性級別。源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫沒必要有相同的兼容性級別。
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.數(shù)據(jù)庫間傳輸表空間,過程和實例
傳輸和拷貝表空間集,需要執(zhí)行以下幾步
A.如果是跨平臺傳輸,查看V$TRANSPORTABLE_PLATFORM視圖,看endian是否一致。如果不一致,需要在源數(shù)據(jù)庫或者目標(biāo)數(shù)據(jù)庫執(zhí)行一次轉(zhuǎn)換。否則,不需要轉(zhuǎn)換。
B.選擇一個自包含的表空間集。
C.生成傳輸表空間集,一個傳輸表空間集由被傳輸?shù)谋砜臻g的數(shù)據(jù)文件和包含表空間集的結(jié)構(gòu)化信息的導(dǎo)出文件組成。如果源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫的endian不一樣,需要在源數(shù)據(jù)
庫端或者目標(biāo)數(shù)據(jù)庫端做一次轉(zhuǎn)換,讓兩方一致。
D.傳輸表空間集,拷貝數(shù)據(jù)文件和導(dǎo)出文件到目標(biāo)位置,你可以用各種文件復(fù)制工具(比如,操作系統(tǒng)復(fù)制命令,ftp,dbms_file_copy包,發(fā)布到CDs).如果需要轉(zhuǎn)換并且在源數(shù)
據(jù)庫端沒有轉(zhuǎn)換,需要在目標(biāo)數(shù)據(jù)庫端做一次轉(zhuǎn)換。
E.加入表空間,用數(shù)據(jù)泵工具把傳輸表空間加入目標(biāo)數(shù)據(jù)庫。
下面是一個例子:
第一步:測試平臺是否支持并且endian一致
這一步只有在源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫不一樣的情況下才需要,如果sale1和sale2表空間被傳輸?shù)揭粋€不同的平臺上,你可以按下面的步驟測試:
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
?????FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
?????WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;
源數(shù)據(jù)庫平臺查詢結(jié)果:
PLATFORM_NAME?????????????ENDIAN_FORMAT
------------------------- --------------
Solaris[tm] OE (32-bit)???Big
目標(biāo)數(shù)據(jù)庫平臺查詢結(jié)果:
PLATFORM_NAME?????????????ENDIAN_FORMAT
------------------------- --------------
Microsoft Windows NT??????Little
可見,需要進行一次轉(zhuǎn)換。
第二步:選擇自包含的表空間集:
在選擇的傳輸表空間和沒有選擇表空間之間可能會有些依賴關(guān)系,你只能選擇自包含的表空間,自包含意味著沒有引用從選擇的表空間只想沒有選擇表空間,一些自包含紊亂的例
子包括:
A.位于選擇表空間中的索引對應(yīng)的表不在選擇的表空間內(nèi)
B.分區(qū)表只有部分分區(qū)在選擇的表空間內(nèi)
C.一致性約束指向為選擇的表空間的內(nèi)的表
D.選擇表空間內(nèi)的表包含LOB列,這個LOB列執(zhí)行未選擇表空間內(nèi)的LOBS
為了測試一個表空間是否自包含的,你可以使用DBMS_TTS包的TRANSPORT_SET_CHECK存儲過程,你必須擁有EXECUTE_CATALOG_ROLE。
使用DBMS_TTS包時,你可以指定表空間集中的需要檢查的表空間,你可以選擇性的指定必須檢查的表空間,對于嚴(yán)格或者全密封的表空間,你必須另外指定TTS_FULL_CHECK 參數(shù)為
TRUE
下面的語句用于檢查表空間sale1和sale2是否自包含的,
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('sales_1,sales_2', TRUE);
執(zhí)行DBMS_TTS后,你可以查看TRANSPORT_SET+VIOLATIONS視圖查看表空間是否自包含的,如果是自包含的,查詢結(jié)果是空的。下表顯示兩個紊亂:
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.
第三步、產(chǎn)生傳輸表空間集
為了執(zhí)行傳輸表空間導(dǎo)出操作,你必須擁有EXP_FULL_DATABASE角色。
確定你選擇的表空間是自包含的以后,你可以執(zhí)行下面的動作來產(chǎn)生傳輸表空間集
A.把所有表空間設(shè)置為只讀.
SQL> ALTER TABLESPACE sales_1 READ ONLY;
Tablespace altered.
SQL> ALTER TABLESPACE sales_2 READ ONLY;
Tablespace altered.
B.在數(shù)據(jù)庫主機上調(diào)用數(shù)據(jù)泵,指定傳輸表空間集中的表空間
SQL> HOST
$ EXPDP system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir
????????TRANSPORT_TABLESPACES = sales_1,sales_2
你必須執(zhí)行TRANSPORT_TABLESPACES,這個參數(shù)決定導(dǎo)出操作的模式,這個例子中
*DUMPFILE 參數(shù)指定結(jié)構(gòu)化信息導(dǎo)出文件的名稱
*DIRECTORY 參數(shù)指定指向操作系統(tǒng)導(dǎo)出文件目錄的目錄對象,執(zhí)行之前,必須創(chuàng)建目錄對象,必須把目錄對象的write權(quán)限授予public角色。
*觸發(fā)器和索引默認(rèn)情況下被導(dǎo)出
如果你希望執(zhí)行嚴(yán)格數(shù)據(jù)一致性檢查的傳輸,用TRANSPORT_SET_CHECK。例如:
EXPDP system/password DUMPFILE=expdat.dmp DIRECTORY = dpump_dir
??????TRANSPORT_TABLESPACES=sales_1,sales_2 TRANSPORT_FULL_CHECK=Y
C.轉(zhuǎn)換
如果表空間需要轉(zhuǎn)換
$ 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.
第四步、傳輸表空間集
拷貝數(shù)據(jù)文件和導(dǎo)出文件到目標(biāo)數(shù)據(jù)庫,可以用操作系統(tǒng)工具,ftp,DBMS_FILE_TRANSPORT包等。
如果表空間需要轉(zhuǎn)換,你必須做一次轉(zhuǎn)換。
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;
第五步、加入表空間集
用數(shù)據(jù)泵加入表空間和結(jié)構(gòu)化信息。
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)
所有這些操作以后,傳輸過來的表空間是只讀的,把這些表空間設(shè)置為READ/WRITE
ALTER TABLESPACE sales_1 READ WRITE;
ALTER TABLESPACE sales_2 READ WRITE;
?
?
?
總結(jié)
- 上一篇: ora-01950 对表空间无权限
- 下一篇: 批处理如何清除文本文档里面的重复行