一、簡介
可傳輸表空間(還有個集)最大的優勢是其速度比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.log
7、將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 [email protected] 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 [email protected] 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.dbf
8、在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