關於oracle可傳輸表空間的總結

賀子_DBA時代發表於2016-09-21
傳輸表空間綜述:
不論是資料字典管理的表空間還是本地管理的表空間,都可以使用傳輸表空間技術;從9i開始傳輸表空間不需要在源資料庫和目標資料庫之間具有同樣的DB_BLOCK_SIZE塊大小;使用傳輸表空間遷移資料比使用資料匯入匯出工具遷移資料的速度要快,這是因為傳輸表空間只是複製包含實際資料的資料檔案到目標資料庫的指定位置,而使用資料匯入匯出工具將傳輸表空間物件的後設資料到目標資料庫。

我們知道oracle利用imp/impdp傳輸表空間transport_tablespace需要滿足以下條件:
1.字符集相同
2.要匯出的表空間必須是read only,而且是自包含的,就是說該表空間的物件不能依賴其他表空間。
3.先匯出源資料,傳輸表空間的資料檔案複製到另一個資料庫相應目錄下。
也可以使用rman傳輸表空間,但是其過程相對複雜的多,首先要備份全庫,歸檔日誌和控制檔案,最後還得用imp/impdp進行匯入,但是利用rman的好處是可以不用把目標表空間read only;
關於傳輸表空間的一下限制:
(1)10g之前源資料庫和目標資料庫必須處於相同的平臺。10g以後可以用RMAN命令修改資料檔案實現跨平臺移動表空間。
(2)對於源資料庫和目標資料庫版本不同時,源資料庫的版本必須低於目標資料庫。
(3)兩邊設定的資料庫字符集和國家字符集必須一致。
(4)目標資料庫不能存在需要匯入的表空間,否則報錯,他自己會建立該表空間。
(5)源資料庫和目標資料庫的blocksize必須一致(9i前)。9i之後blocksize可以不一致了。

整體的操作步驟:
1、如果是跨平臺的表空間傳輸,需要檢查兩個平臺支援的位元組儲存順序,檢查方法見如上文所述,如果可以確定源資料庫和目標資料庫屬於同一平臺,可以省略此步驟;
2、選擇自包含的(self-contained)表空間,這裡的限制相對於使用資料泵來說比較變態,實驗中將會有一些粗略的介紹。
3、將源資料庫上的選定表空間修改為read-only狀態,使用expde工具生成傳輸表空間(集)。      //在這一步,如果兩個平臺間的位元組儲存次序不同,還需完成位元組儲存次序的轉換
4、傳輸表空間及與表空間對應資料檔案 (使用作業系統命令、ftp命令等方式)到目標資料庫。   //位元組儲存次序的轉換也可以在這一步完成
5、將源資料庫的表空間恢復為read-write狀態(可選)
6、在目標資料庫,使用impdp工具匯入表空間(集)

下面展示具體的操作過程:

環境情況:

Source 端:
作業系統: OracleLinux 6.2 64位
endianness格式: little
資料庫版本:11.2.0.3
 
Target 端:
作業系統:OracleLinux 6.2 64位
endianness 格式: little
版本:11.2.0.3

1、檢視作業系統endianness格式
col platform_name for a40  
 
SELECT *   
FROM V$TRANSPORTABLE_PLATFORM   
ORDER BY PLATFORM_ID;  
  
PLATFORM_ID PLATFORM_NAME                            ENDIAN_FORMAT  
----------- ---------------------------------------- --------------  
          1 Solaris[tm] OE (32-bit)                  Big  
          2 Solaris[tm] OE (64-bit)                  Big  
          3 HP-UX (64-bit)                           Big  
          4 HP-UX IA (64-bit)                        Big  
          5 HP Tru64 UNIX                            Little  
          6 AIX-Based Systems (64-bit)               Big  
          7 Microsoft Windows IA (32-bit)            Little  
          8 Microsoft Windows IA (64-bit)            Little  
          9 IBM zSeries Based Linux                  Big  
         10 Linux IA (32-bit)                        Little  
         11 Linux IA (64-bit)                        Little  
         12 Microsoft Windows x86 64-bit             Little  
         13 Linux x86 64-bit                         Little  
         15 HP Open VMS                              Little  
         16 Apple Mac OS                             Big  
         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.  
  
--分別檢視 source 端 和target端作業系統endianness格式  
--source  
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  
---------------------------------------- --------------  
Linux x86 64-bit                         Little  
  
--target  
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  
---------------------------------------- --------------  
Linux x86 64-bit                         Little  
2、在source端建立測試表空間
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.  
  
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.  
  
--建立表空間建立表空間 tset  
create tablespace tset datafile '/u01/app/oracle/oradata/normal/test01.dbf' size 50M;  
Tablespace created.  
  
--建立使用者source_test,並指定表空間  
  
--在source端  
create user source_test   
identified by oracle   
default tablespace tset   
temporary tablespace TEMPTS1;  
  User created.  
  grant connect,resource to source_test;  
  Grant succeeded.  
  --在target端(暫時只先建立使用者)  
create user target_test   identified by oracle  temporary tablespace TEMPTS1;  
  
User created.  
  grant connect,resource to target_test;  
  Grant succeeded.  
  --建立測試表  
SQL> conn source_test/oracle  
Connected.  
SQL> create table t1(id number, name varchar2(30));  
  
Table created.  
  SQL> insert into t1 values(1, 'AAAAA');  
  1 row created.  
  SQL> insert into t1 values(2, 'BBBBB');  
  1 row created.  
  SQL> commit;  
  Commit complete.  
  select * from t1;  
  1.   
  2.         ID NAME  
  3. ---------- ------------------------------  
  4.          1 AAAAA  
  5.          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.  
  
--在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;  
  
no rows selected  
--沒有記錄說明沒有錯  
5、將表空間TSET設定成read?-only,生成Transportable Tablespace Set之後就可以改成read write 了。
SQL> alter tablespace TSET read only;  
  
Tablespace altered.  
 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.還有就是表空間對應的資料檔案
--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目錄下,這個路徑可以和source不樣。  
[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.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、檢視並修改表空間狀態
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;  
  1.   
        ID NAME  
---------- ------------------------------  
         1 AAAAA  
         2 BBBBB  
總結:
(一):如果是跨平臺了,則需要進行平臺轉換,可以在源端操作也可以在目的端操作。
例如:
源端:
SQL>SELECTd.PLATFORM_NAME,ENDIAN_FORMATFROMV$TRANSPORTABLE_PLATFORM tp,V$DATABASE dWHEREtp.PLATFORM_NAME=d.PLATFORM_NAME;

SQL>PLATFORM_NAME               ENDIAN_FORMAT

-----------------------------    --------------
Linux x8664-bit                 Little
目標端:
SQL>SELECTd.PLATFORM_NAME,ENDIAN_FORMATFROMV$TRANSPORTABLE_PLATFORM tp,V$DATABASEdWHEREtp.PLATFORM_NAME=d.PLATFORM_NAME;

PLATFORM_NAME                            ENDIAN_FORMAT
---------------------------------------- --------------
Solaris Operating System (x86-64)        Little
那麼需要平臺轉換:
如果在源端轉換:
RMAN>converttablespace'TTBS1' toplatform="Solaris Operating System (x86-64)" db_file_name_convert='/u01/app/oracle/oradata/silent/ttbs1.dbf','/tmp/ttbs1.dbf';

Starting conversion at source at12-AUG-12
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile conversion
input datafilefilenumber=00005name=/u01/app/oracle/oradata/silent/ttbs1.dbf
converted datafile=/tmp/ttbs1.dbf
channel ORA_DISK_1: datafile conversion complete, elapsed time:00:00:16
Finished conversion at source at12-AUG-12

 如果在target端轉換,方法如下:

RMAN>CONVERTDATAFILE'/u01/app/oracle/oradata/sun/ttbs1.dbf'TOPLATFORM="Solaris Operating System (x86-64)"FROMPLATFORM="Linux x8664-bit" DB_FILE_NAME_CONVERT="/u01/app/oracle/oradata/sun/","/tmp/";

Starting conversion at target at12-AUG-12
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile conversion
inputfilename=/u01/app/oracle/oradata/sun/ttbs1.dbf
converted datafile=/tmp/ttbs1.dbf
channel ORA_DISK_1: datafile conversion complete, elapsed time:00:00:14
Finished conversion at target at12-AUG-12
(二):可以使用引數:remap_tablespace=ttbs1:ttbs2,來修改傳過來的表空間名字。

心得:
可傳輸表空間加快了資料遷移的速度,可是使用邏輯匯入匯出來完成表空間傳輸需要將該表空間置為read only;雖然使用rman技術來完成表空間傳輸可以不將該表空間置為read only。但是用rman技術的過程相對非常複雜,這無疑導致該技術在生產環境使用的頻率不大。多數人還是選擇直接資料泵的方式來完成一個表空間的遷移工作。

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

相關文章