Oracle传输表空间
一、簡介
可傳輸表空間(還有個集)最大的優勢是其速度比export/import或unload/load要快的多。因為可傳輸表空間主要是復制數據文件到目標路徑,然后再使用export/import或Data Pump export/import等應用僅導出/導入表空間對象的元數據到新數據庫。
(1)可傳輸表空間的特性主要用于進行庫對庫的表空間復制,要進行傳輸的表空間必須置于read-only模式。如果生產庫不允許表空間置為只讀模式,沒關系,方法還是有的,通過RMAN備份也可以創建可傳輸表空間集。
(2)要使用可傳輸表空間的特性,oracle至少是8i企業版或更高版本。如果是相同操作系統平臺相互導入,則8i及以上版本均可支持,但如果是不同操作系統平臺,數據庫版本至少10g。
(3)被傳輸的表空間即可以是字典管理,也可以是本地管理。并且自oracle9i開始,被傳輸表空間的block size可以與目標數據庫的block size不同。
? ? 一些操作系統(包括 Windows)在低位內存地址中用最低有效字節存儲多字節二進制數據;因此這種系統被稱為低地址低字節序。相反,其它的操作系統(包括 Solaris)將最高有效字節存儲在低位內存地址中,因此這種系統被稱為低地址高字節序。當一個低地址高字節序的系統試圖從一個低地址低字節序的系統中讀取數據時,需要一個轉換過程— 否則,字節順序將導致不能正確解釋讀取的數據。不過,當在相同字節順序的平臺之間傳輸表空間時,不需要任何轉換。
? ? 如果平臺間的endian不同,那么在執行導入操作之之前必須首先轉換源平臺的表空間到目標格式,如果平臺間endian format相同,則可以跳過轉換的步驟,即使是不同平臺。當然前提是各平臺的數據庫版本都不低于10g。
在表空間可被傳輸到不同平臺之前,數據文件的文件頭必須能夠識別其所屬的原平臺是什么,對于oracle數據庫初始化參數中COMPATIBLE置為10.0.0或更高之后,你必須至少將表空間置為read-write一次,這點非常重要。
表空間傳輸是通過oracle的邏輯導出命令exp/imp添加參數transport_tablespace=y進行導出導入。
1.1、執行表空間傳輸有以下限制條件:
(1)源數據庫和目標數據庫必須處于相同的平臺。10g以后可以用RMAN命令修改數據文件實現跨平臺移動表空間。
(2)對于源數據庫和目標數據庫版本不同時,源數據庫的版本必須低于目標數據庫。
(3)兩邊設置的數據庫字符集和國家字符集必須一致。
(4)目標數據庫不能存在需要導入的表空間。
(5)源數據庫和目標數據庫的blocksize必須一致(9i前)。
注意:
? 自oracle10gR2開始,可以傳輸含XMLTypes的表空間,不過必須使用imp/exp而不能選擇數據泵(impdp/expdp)。并確保imp/exp命令的CONSTRAINTS和TRIGGERS參數設置為Y。
下列腳本可以列出數據庫中哪些表空間含XMLTypes:
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;
1.2、傳輸表空間的一些限制:
(1)高級隊列(Advanced Queues):可傳輸表空間的特性并不支持8.0兼容的高級隊列
(2)系統表空間(SYSTEM Tablespace Objects):不能傳輸SYSTEM表空間或者SYS用戶擁有的對象。
(3)映射類型(Opaque Types):由應用指定并且映射到數據庫(如RAW,BFILE等)的類型可以被傳輸,但是它們并不會被做為跨平臺轉換的一部分。其實際類型是什么只有指定它的應用清楚,所以必須保證這個應用解決讀取各種endian問題后再考慮將其傳輸到新平臺。
(4)浮點數據(Floating-Point Numbers):BINARY_FLOAT和BINARY_DOUBLE類型可以使用數據泵導入導出但不支持EXP。
注意:
? ?對于跨平臺的傳輸,查詢V$TRANSPORTABLE_PLATFORM視圖檢查兩平臺的endian format。如果你準備傳輸表空間集到不同endian平臺,必須首先轉換表空間集的endian與目標平臺相同。前面提到,如果涉及了endian的轉換,可以在生成可傳輸表空間集時進行(源平臺進行),或者在導入表空間集之前進行(目標平臺進行),轉換的命令都是一個,只是參數略有不同,關于命令的用法暫且不提,后面會有專門章節介紹和實踐。在這里我們先來深入一個這個操作究竟放在哪里合適。按說這個操作放在哪里執行都可以,應該沒有什么可爭辯的,但是值的注意的是針對我們操作的數據庫,特別是對于正在運行的生產數據庫,三思建議你采用在目標平臺上進行轉換的操作,緣由如下:
(1)縮短停機時間
在創建可傳輸表空間集之前,需要將要傳輸的表空間狀態置為read-only。你可以將數據文件迅速復制一份鏡像,并生成包含元數據的export文件,然后即可將表空間狀態置為read-write狀態。這種安排使得表空間必須保持為只讀的時間盡可能的短。
(2) 提高執行性能
生產數據庫往往同時在處理多個應用,而此時如果再用其進行轉換操作可能增加系統負載,并且系統此時由于執行的任務較多,轉換效率也并非最高。將轉換操作移到目標平臺進行,通常對于目標平臺都是做為備份角色,其系統負載相對是比較低的,執行轉換操作的效率相對也會更高。
(3)簡化復制操作
通過在目標平臺執行轉換命令時指定db_file_name_convert參數,直接將數據文件轉換到目標目錄內,簡化復制時的操作。
二、表空間傳輸的步驟:
2.1、需要移動的表空間必須是自包含的。
? 如果表空間中的數據與其他表空間中的數據有參照關系,那么在移動表空間時,凡是相關的表空間都需要一同移動。、
可以通過如下命令檢查是否為自包含表空間:
SQL>execute dbms_tts.transport_set_check(ts_list=>'<tablespace>',incl_constraints=>TRUE);
參數ts_list指定需要傳輸的表空間,incl_constraints指定是否檢查完整性約束。執行完后,檢查臨時表transport_set_violations,如果沒有返回信息,表示表空間為自包含。
2.2、將需要傳輸的表空間設置為只讀。(如果是生成數據庫也是可以有辦法的,可以使用rman功能)
SQL>alter tablespace XXX read only;
如果生產庫不允許表空間只讀,可以選擇通過RMAN備份生成表空間集的方式進行
2.3、以sysdba身份連接數據庫執行exp導出。
C:>exp userid='sys/sys@jiong as sysdba' file=d:\testspace.dmp log=d:\testspaceexp.log transport_tablespace=y tablespaces=testspace buffer=10240000
只是導出的待傳輸表空間的目錄結構信息(元數據),并不包含實際數據,因此導出的速度非常快,而且文件也很小
2.4、使用RMAN轉換所要傳輸表空間的數據文件頭為目標系統文件(10g下在不同的平臺傳輸時)
這步轉換可以在源數據庫也可以在目標數據庫進行。
RMAN>convert tablespace "TESTSPACE" to platform 'Microsoft Windows IA (32-bit)' format 'd:\TESTSPACE01.DBF'
記住這步結束后別忘了將表空間置回可寫:
alter tablespace TESTSPACE read write
關于platform參數可以通過查詢v$db_transportable_platform得到。
(1)v$db_transportable_platform
V$DB_TRANSPORTABLE_PLATFORM displays all platforms to which the database can be transported using the RMAN CONVERT DATABASE command. The transportable database feature only supports transports of the same endian platform. Therefore, V$DB_TRANSPORTABLE_PLATFORM displays fewer rows than V$TRANSPORTABLE_PLATFORM.
(2)v$transportable_platform
V$TRANSPORTABLE_PLATFORM displays all platform names and their identifiers
2.5、復制表空間轉換后的數據文件及導出文件到目標平臺
2.6、使用imp導入表空間
? ?這里需要注意,在目標數據庫需要先建立原先表空間里對象所屬的用戶,但是又不能使用同名的表空間,所以這個用戶會建立在其他表空間上。
還有,如果傳輸的表空間集block_size與目標庫的默認block_size不同,那你的第一步就得是設置目標庫中DB_nK_CACHE_SIZE的初始化參數(9i以上)。
c:>imp userid='sys/sys@mood as sysdba' file=d:\testspace.dmp log=d:\testspaceimp.log tablespaces=testspace datafiles=d:\TESTSPACE01.DBF transport_tablespace=y
將用戶默認表空間修改為導入的表空間:
alter user TUSER default tablespace TESTSPACE
如果需要,將導入到目標數據庫的表空間置為可寫,因為導入后也是處于read only狀態。
alter tablespace TESTSPACE read write
#####################################################
? ? ? ? ? ? ? ? ? ?創建傳輸表空間測試
##############################################
一、測試環境
Source 端:
操作系統: OracleLinux 6.2 64位
endianness格式: little
數據庫版本:11.2.0.3
?
Target 端:
操作系統:OracleLinux 6.2 64位
endianness 格式: little
數據庫版本:11.2.0.3
二、開始測試
2.1、在source端創建測試表空間
SQL>?select?tablespace_name,?status???from?dba_tablespaces;??TABLESPACE_NAME????????????????STATUS?? ------------------------------?---------?? SYSTEM?????????????????????????ONLINE?? UNDOTBS1???????????????????????ONLINE?? SYSAUX?????????????????????????ONLINE?? TEMPTS1????????????????????????ONLINE?? USERS??????????????????????????ONLINE?? OUTLN??????????????????????????ONLINE??6?rows?selected.??SQL>?select?file_name?from?dba_data_files;??FILE_NAME?? ------------------------------------------------?? /u01/app/oracle/oradata/normal/system01.dbf?? /u01/app/oracle/oradata/normal/undotbs01.dbf?? /u01/app/oracle/oradata/normal/sysaux01.dbf?? /u01/app/oracle/oradata/normal/users01.dbf?? /u01/app/oracle/oradata/normal/undotbs02.dbf?? /u01/app/oracle/oradata/normal/system02.dbf?? /u01/app/oracle/oradata/normal/outln01.dbf??7?rows?selected.2.2、創建表空間創建表空間 tset ?
SQL>?create?tablespace?tset?datafile?'/u01/app/oracle/oradata/normal/test01.dbf'?size?50M;?? Tablespace?created.??
2.3、創建用戶source_test,并指定表空間 ?
??
--在source端?? SQL>?create?user?source_test???identified?by?oracle???default?tablespace?tset???temporary?tablespace?TEMPTS1;??SQL>?grant?connect,resource?to?source_test;??Grant?succeeded.??--在target端(暫時只先創建用戶)?? SQL>?create?user?target_test???identified?by?oracle??temporary?tablespace?TEMPTS1;??SQL>?grant?connect,resource?to?target_test;2.4、創建測試表 ?
SQL>?conn?source_test/oracle?? SQL>?create?table?t1(id?number,?name?varchar2(30));??SQL>?insert?into?t1?values(1,?'AAAAA');??SQL>?insert?into?t1?values(2,?'BBBBB');??SQL>?commit;??Commit?complete.??SQL>?select?*?from?t1;??ID?NAME?? ----------?------------------------------??1?AAAAA??2?BBBBB? ? ? ? ? ? ? ? ? ? ??
3、在source端和target端創建 backup 的目錄
[oracle@normal?~]$?mkdir?-p?/u01/backup?? [oracle@normal?~]$?ls?-l?/u01?? total?24?? drwxr-xr-x?3?oracle?oinstall??4096?Jul?28?12:31?app?? drwxr-xr-x?2?oracle?oinstall??4096?Sep?14?16:21?backup??SQL>?show?user?? USER?is?"SYS"?? SQL>?create?directory?backup?as?'/u01/backup';??Directory?created.??SQL>?col?owner?format?a5?? SQL>?col?directory_name?format?a25?? SQL>?col?DIRECTORY_PATH?format?a50?????SQL>?select?*?from?dba_directories;????? OWNER?DIRECTORY_NAME????????????DIRECTORY_PATH?? -----?-------------------------?--------------------------------------------------?? SYS???BACKUP????????????????????/u01/backup?? SYS???OUTLN_DIR?????????????????/home/oracle?? SYS???DATA_PUMP_DIR?????????????/u01/app/oracle/product/11.2.0/db_1/rdbms/log/?? SYS???ORACLE_OCM_CONFIG_DIR?????/u01/app/oracle/product/11.2.0/db_1/ccr/state??SQL>?GRANT?read,?write?ON?DIRECTORY?backup?TO?source_test;??Grant?succeeded.3.1、在target端 ?
[oracle@test?~]$?mkdir?-p?/u01/backup?? [oracle@test?~]$?ls?-l?/u01?? total?24?? drwxr-xr-x?3?oracle?oinstall??4096?Aug?28?09:09?app?? drwxr-xr-x?2?oracle?oinstall??4096?Sep?14?16:40?backup??SQL>?show?user?? USER?is?"SYS"?? SQL>?create?directory?backup?as?'/u01/backup';??Directory?created.??SQL>?col?owner?format?a5?? SQL>?col?directory_name?format?a25?? SQL>?col?DIRECTORY_PATH?format?a50?? SQL>?select?*?from?dba_directories;??OWNER?DIRECTORY_NAME????????????DIRECTORY_PATH?? -----?-------------------------?--------------------------------------------------?? SYS???BACKUP????????????????????/u01/backup?? SYS???OUTLN_DIR?????????????????/home/oracle?? SYS???DATA_PUMP_DIR?????????????/u01/app/oracle/product/11.2.0/db_1/rdbms/log/?? SYS???ORACLE_OCM_CONFIG_DIR?????/u01/app/oracle/product/11.2.0/db_1/ccr/state??SQL>?GRANT?read,?write?ON?DIRECTORY?backup?TO?target_test;??Grant?succeeded.4、檢查表空間自包含(就是改表空間里的數據沒有和其他表空間數據有關聯,如果有關聯會報錯)
SQL>?execute?dbms_tts.transport_set_check('TSET',?TRUE);??PL/SQL?procedure?successfully?completed.--查看自包含驗證結果: ?
SQL> select * from transport_set_violations; ?
??
--沒有記錄說明沒有錯 ?
5、將表空間TSET設置成read--only
SQL>?alter?tablespace?TSET?read?only;??SQL>?select?tablespace_name,?status??from?dba_tablespaces;??TABLESPACE_NAME????????????????STATUS?? ------------------------------?---------?? SYSTEM?????????????????????????ONLINE?? UNDOTBS1???????????????????????ONLINE?? SYSAUX?????????????????????????ONLINE?? TEMPTS1????????????????????????ONLINE?? USERS??????????????????????????ONLINE?? OUTLN??????????????????????????ONLINE?? TSET???????????????????????????READ?ONLY??7?rows?selected.6、生成:Transportable Tablespace Set
Transportable Tablespace Set有兩部分:
1.expdp 導出的表空間的metadata
2.還有就是表空間對應的數據文件
6.1、expdp 導出的表空間的metadata ? ?
[oracle@normal?normal]$?pwd?? /u01/app/oracle/oradata/normal?? [oracle@normal?normal]$?ll?? total?2294664?? -rw-r-----?1?oracle?oinstall???9781248?Sep?14?16:46?control01.ctl?? drwx------?2?oracle?oinstall?????16384?Aug?22?12:44?lost+found?? -rw-r-----?1?oracle?oinstall??20979712?Sep?14?15:52?outln01.dbf?? -rw-r-----?1?oracle?oinstall??52429312?Sep?14?16:45?redo01a.log?? -rw-r-----?1?oracle?oinstall??52429312?Sep?14?16:45?redo01b.log?? -rw-r-----?1?oracle?oinstall??52429312?Sep?14?15:52?redo02a.log?? -rw-r-----?1?oracle?oinstall??52429312?Sep?14?15:52?redo02b.log?? -rw-r-----?1?oracle?oinstall??52429312?Sep?14?15:52?redo03a.log?? -rw-r-----?1?oracle?oinstall??52429312?Sep?14?15:52?redo03b.log?? -rw-r--r--?1?oracle?oinstall?????22633?Aug?22?17:00?su.lst?? -rw-r-----?1?oracle?oinstall?340795392?Sep?14?16:40?sysaux01.dbf?? -rw-r-----?1?oracle?oinstall?340795392?Sep?14?16:43?system01.dbf?? -rw-r-----?1?oracle?oinstall?314580992?Sep?14?16:43?system02.dbf?? -rw-r-----?1?oracle?oinstall??20979712?Sep?14?15:53?temp01.dbf?? -rw-r-----?1?oracle?oinstall??52436992?Sep?14?15:53?temp02.dbf?? -rw-r-----?1?oracle?oinstall??52436992?Sep?14?16:31?test01.dbf?? -rw-r-----?1?oracle?oinstall?209723392?Sep?14?16:43?undotbs01.dbf?? -rw-r-----?1?oracle?oinstall?209723392?Sep?14?16:40?undotbs02.dbf?? -rw-r-----?1?oracle?oinstall?524296192?Sep?14?15:52?users01.dbf??[oracle@normal?normal]$?expdp?dumpfile=test01.dmp?directory=backup?transport_tablespaces=TSET?transport_full_check=y?logfile=TSET.log???Export:?Release?11.2.0.3.0?-?Production?on?Sun?Sep?14?16:54:30?2014??Copyright?(c)?1982,?2011,?Oracle?and/or?its?affiliates.??All?rights?reserved.??Username:?/?as?sysdba??Connected?to:?Oracle?Database?11g?Enterprise?Edition?Release?11.2.0.3.0?-?64bit?Production?? With?the?Partitioning,?OLAP,?Data?Mining?and?Real?Application?Testing?options?? Starting?"SYS"."SYS_EXPORT_TRANSPORTABLE_01":??/********/?AS?SYSDBA?dumpfile=test01.dmp?directory=backup?transport_tablespaces=TSET?transport_full_check=y?logfile=TSET.log??? Processing?object?type?TRANSPORTABLE_EXPORT/PLUGTS_BLK?? Processing?object?type?TRANSPORTABLE_EXPORT/TABLE?? Processing?object?type?TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK?? Master?table?"SYS"."SYS_EXPORT_TRANSPORTABLE_01"?successfully?loaded/unloaded?? ******************************************************************************?? Dump?file?set?for?SYS.SYS_EXPORT_TRANSPORTABLE_01?is:??/u01/backup/test01.dmp?? ******************************************************************************?? Datafiles?required?for?transportable?tablespace?TSET:??/u01/app/oracle/oradata/normal/test01.dbf?? Job?"SYS"."SYS_EXPORT_TRANSPORTABLE_01"?successfully?completed?at?16:55:13??[oracle@normal?normal]$?ls?-l?/u01/backup/???? total?80?? -rw-r-----?1?oracle?oinstall?77824?Sep?14?16:55?test01.dmp?? -rw-r--r--?1?oracle?oinstall??1160?Sep?14?16:55?TSET.log7、將Transportable Tablespace set 傳送到Target端
1)將表空間test 對應的數據文件copy到Target 對應的ORADATA目錄下。
2)將expdp 導出的表空間metadta 數據copy 到Target 端的backup 目錄下
--將表空間test?對應的數據文件copy到Target?對應的ORADATA目錄下。?? [oracle@normal?normal]$?scp?/u01/backup/test01.dmp?192.168.137.12:/u01/backup?? oracle@192.168.137.12?s?password:??? test01.dmp??????????????????????????????????100%???76KB??76.0KB/s???00:00???--將expdp?導出的表空間metadta?數據copy?到Target?端的backup?目錄下????? [oracle@normal?normal]$?scp?test01.dbf?192.168.137.12:/u01/app/oracle/oradata/normal/test01.dbf?? oracle@192.168.137.12?s?password:??? test01.dbf??????????????????????????????????100%???50MB??16.7MB/s???00:03????--在target端查看文件是否已經傳輸?? [oracle@test?~]$?ll?/u01/backup/??????????????? total?76?? -rw-r-----?1?oracle?oinstall?77824?Sep?14?17:03?test01.dmp??[oracle@test?~]$?ll?$ORACLE_BASE/oradata/normal/test01.dbf?? -rw-r-----?1?oracle?oinstall?52436992?Sep?14?17:04?/u01/app/oracle/oradata/normal/test01.dbf8、在Target 系統上Import 表空間的metadata(使用target_test用戶,需要用到remap_schema)
[oracle@test?~]$?impdp?directory=backup?dumpfile=test01.dmp?transport_datafiles=/u01/app/oracle/oradata/normal/test01.dbf?remap_schema=source_test:target_test?logfile=test.log??Import:?Release?11.2.0.3.0?-?Production?on?Sun?Sep?14?17:09:25?2014??Copyright?(c)?1982,?2011,?Oracle?and/or?its?affiliates.??All?rights?reserved.??Username:?/?as?sysdba??Connected?to:?Oracle?Database?11g?Enterprise?Edition?Release?11.2.0.3.0?-?64bit?Production?? With?the?Partitioning,?OLAP,?Data?Mining?and?Real?Application?Testing?options?? Master?table?"SYS"."SYS_IMPORT_TRANSPORTABLE_01"?successfully?loaded/unloaded?? Starting?"SYS"."SYS_IMPORT_TRANSPORTABLE_01":??/********/?AS?SYSDBA?directory=backup?dumpfile=test01.dmp?transport_datafiles=/u01/app/oracle/oradata/normal/test01.dbf?remap_schema=source_test:target_test?logfile=test.log??? Processing?object?type?TRANSPORTABLE_EXPORT/PLUGTS_BLK?? Processing?object?type?TRANSPORTABLE_EXPORT/TABLE?? Processing?object?type?TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK?? Job?"SYS"."SYS_IMPORT_TRANSPORTABLE_01"?successfully?completed?at?17:09:55?? 9、查看并修改表空間狀態 SQL>?select?tablespace_name,status??from?dba_tablespaces;??TABLESPACE_NAME????????????????STATUS?? ------------------------------?---------?? SYSTEM?????????????????????????ONLINE?? UNDOTBS1???????????????????????ONLINE?? SYSAUX?????????????????????????ONLINE?? TEMPTS1????????????????????????ONLINE?? USERS??????????????????????????ONLINE?? OUTLN??????????????????????????ONLINE?? TSET???????????????????????????READ?ONLY??7?rows?selected.??SQL>?alter?tablespace?TSET?read?write;??Tablespace?altered.10、驗證
SQL> conn target_test/oracle ?
Connected. ?
??
SQL> select * from t1; ?
??
? ? ? ? ID NAME ?
---------- ------------------------------ ?
? ? ? ? ?1 AAAAA ?
? ? ? ? ?2 BBBBB ?
轉載于:https://blog.51cto.com/fengfeng688/1951438
總結
以上是生活随笔為你收集整理的Oracle传输表空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 1260 Pearls
- 下一篇: (CZ深入浅出Java基础)线程笔记