Oracle傳輸表空間

season0891發表於2014-04-04
這兩天一直在看文件當中的傳輸表空間部分。說起來十分慚愧,經過不斷的嘗試,總算完成了一次不太完美的傳輸表空間的實驗。

一、傳輸表空間概述
首先來認識一下什麼是傳輸表空間,傳輸表空間技術始於oracle9i,不論是資料字典管理的表空間還是本地管理的表空間,都可以使用傳輸表空間技術;傳輸表空間不需要在源資料庫和目標資料庫之間具有同樣的DB_BLOCK_SIZE塊大小;使用傳輸表空間遷移資料比使用資料匯入匯出工具遷移資料的速度要快,這是因為傳輸表空間只是複製包含實際資料的資料檔案到目標資料庫的指定位置,而使用資料匯入匯出工具則是傳輸表空間物件的後設資料到目標資料庫。

二、傳輸表空間的方法
1、使用SQL*PLUS,RMAN,Data Pump工具實現手動的傳輸表空間。
2、使用EM工具中的傳輸表空間嚮導實現傳輸表空間。

三、跨平臺傳輸表空間
從oracle 10g開始,oracle實現了跨平臺的表空間傳輸,跨平臺的意味著資料庫可以從一種型別的平臺遷移到另一中型別的平臺上,大多數(但不是全部)的平臺都支援傳輸表空間。首先必須透過檢視v$transportable_platform檢視檢視oracle支援的平臺,並確定每種平臺的位元組儲存次序,注意:這一點非常重要。以下查詢為oracle支援的各種平臺及位元組儲存次序(版本為10.2.0.4),在跨平臺表空間傳輸時,需要透過查詢該檢視進行平臺和位元組儲存次序的比對。
SQL> select * from v$transportable_platform order by platform_name;
PLATFORM_ID PLATFORM_NAME                        ENDIAN_FORMAT
----------- ------------------------------------ --------------
          6 AIX-Based Systems (64-bit)           Big
         16 Apple Mac OS                         Big
         19 HP IA Open VMS                       Little
         15 HP Open VMS                          Little
          5 HP Tru64 UNIX                        Little
          3 HP-UX (64-bit)                       Big
          4 HP-UX IA (64-bit)                    Big
         18 IBM Power Based Linux                Big
          9 IBM zSeries Based Linux              Big
         10 Linux IA (32-bit)                    Little
         11 Linux IA (64-bit)                    Little
         13 Linux x86 64-bit                     Little
          7 Microsoft Windows IA (32-bit)        Little
          8 Microsoft Windows IA (64-bit)        Little
         12 Microsoft Windows x86 64-bit         Little
         17 Solaris Operating System (x86)       Little
         20 Solaris Operating System (x86-64)    Little
          1 Solaris[tm] OE (32-bit)              Big
          2 Solaris[tm] OE (64-bit)              Big
19 rows selected.

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

五、本次實驗記錄
本來設計的實驗過程為:透過轉換位元組儲存次序,實現跨平臺的表空間傳輸。但是透過查詢v$transportable_platform檢視發現所擁有的平臺(windows 64bit和Linux x86-64)的位元組儲存次序相同,並且在測試過程中出現了字符集不相容的錯誤。由於條件不具備,無奈之下只好選擇了兩個Linux平臺資料庫(10.2.0.4和11.2.0.1)之間的表空間傳輸。

實驗限制
一:Windows 64bit和Linux x86-64的位元組儲存次序相同

SQL> select * from v$transportable_platform where platform_name like 'Microsoft%64%' or platform_name like 'Linux%64%';
PLATFORM_ID PLATFORM_NAME                        ENDIAN_FORMAT
----------- ------------------------------------ --------------
         11 Linux IA (64-bit)                    Little
          8 Microsoft Windows IA (64-bit)        Little
         13 Linux x86 64-bit                     Little
         12 Microsoft Windows x86 64-bit         Little

實驗限制二:表空間匯入時,由於字符集不相容出現的儲存資訊

C:\Users\Manganese>impdp system/oracle dumpfile=expdat.dmp directory=dump_dir transport_datafiles=D:\app\Manganese\oradata\orcl\test01.dbf logfile=tts_import.log
Import: Release 11.2.0.1.0 - Production on 星期一 3月 17 22:08:29 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
連線到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已成功載入/解除安裝了主表 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01"
啟動 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01":  system/******** dumpfile=expdat.dmp directory=dump_dir transport_datafiles=D:\app\Manganese\oradata\orcl\test01.dbf logfile=tts_import.log
處理物件型別 TRANSPORTABLE_EXPORT/PLUGTS_BLK
ORA-39123: 資料泵可傳輸的表空間作業中止
ORA-29345: 無法使用不相容的字符集將表空間插入到資料庫中
作業 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" 因致命錯誤於 22:08:30 停止

1、實驗前準備。建立測試用表空間、使用者、表、插入兩條資料(用於最後驗證表傳輸成功,資料都可以正常訪問)
SQL> create tablespace test 
  2  datafile '/u01/app/oracle/oradata/stdb/test01.dbf' size 10m;                                                  //建立測試用表空間,表空間名為test
Tablespace created.
SQL> create user tester identified by tester default tablespace test account unlock;                      //建立測試使用者,使用者名稱為tester,預設表空間為test
User created.
SQL> grant connect,resource to tester;
Grant succeeded.
SQL> conn tester/tester;
Connected.
SQL> create table t1 (id number,name varchar(10),sex char(1),age int,class varchar(3));              //建立測試驗證用表,表名為t1
Table created.
SQL> insert into t1 values (2001,'alex','M',18,'10');
1 row created.
SQL> insert into t1 values (2002,'bob','M',18,'20');
1 row created.
SQL> select * from t1;
        ID NAME       S        AGE CLA
---------- ---------- - ---------- ---
      2001 alex       M         18 10
      2002 bob        M         18 20
SQL> commit;
Commit complete.

2、表空間自包含(獨立性)檢查
根據檔案介紹,傳輸表空間由諸多限制,如下:
An index inside the set of tablespaces is for a table outside of the set of tablespaces.
A partitioned table is partially contained in the set of tablespaces.
A referential integrity constraint points to a table across a set boundary.
A table inside the set of tablespaces contains a LOB column that points to LOBs outside the set of tablespaces.
等等。


SQL> conn /as sysdba
Connected.
SQL> execute dbms_tts.transport_set_check('test',true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
no rows selected                                                    //查詢無返回結果說明檢查透過,否則需要根據violation欄位的說明解決各類參照完整性問題,比如說主鍵、外來鍵約束、分割槽等問題

3、在源資料庫將表空間設為只讀狀態
SQL> alter tablespace test read only;
Tablespace altered.

4、使用expdp工具生成表空間(集)
[oracle@stdb ~]$ expdp system/oracle dumpfile=expdat.dmp directory=dump_dir transport_tablespaces=test logfile=export.log
Export: Release 10.2.0.4.0 - 64bit Production on Monday, 17 March, 2014 19:29:02
Copyright (c) 2003, 2007, Oracle.  All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01":  system/******** dumpfile=expdat.dmp directory=dump_dir transport_tablespaces=test logfile=export.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 "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
  /u01/app/oracle/dump_dir/expdat.dmp
Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at 19:29:18

5、將源資料庫表空間設為read-write狀態。
6、使用ftp工具分別複製表空間(集)和與表空間對應資料檔案到相應的目錄。

7、在目標資料庫使用impdp工具將表空間(集)匯入目標資料庫,根據需要決定是否需要建立與源資料庫相同的使用者,或者在使用impdp是可以使用remap_schema引數。
[oracle@dbserver2 ~]$ impdp system/oracle dumpfile=expdat.dmp directory=dump_dir transport_datafiles=/u01/app/oracle/oradata/prac/test01.dbf logfile=import.log
Import: Release 11.2.0.1.0 - Production on Mon Mar 17 14:32:29 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Master table "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01":  system/******** dumpfile=expdat.dmp directory=dump_dir transport_datafiles=/u01/app/oracle/oradata/prac/test01.dbf logfile=import.log 
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Job "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at 14:32:31

8、驗證結果
[oracle@dbserver2 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Mon Mar 17 14:34:36 2014
Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select ts#,name from v$tablespace;
       TS# NAME
---------- ------------------------------
         0 SYSTEM
         1 SYSAUX
         2 UNDOTBS1
         4 USERS
         3 TEMP
         6 EXAMPLE
         7 TEST
7 rows selected.

SQL> conn tester/tester;
Connected.
SQL> select * from t1;
        ID NAME       S        AGE CLA
---------- ---------- - ---------- ---
      2001 alex       M         18 10
      2002 bob        M         18 20

六、附錄
由於沒能進行位元組儲存次序轉換測試,特地從文件上複製兩個示例,待有條件時再進行測試。
示例一:在源資料庫端完成位元組儲存次序轉換
RMAN> CONVERT TABLESPACE sales_1,sales_2 
2> TO PLATFORM 'Microsoft Windows IA (32-bit)'
3> FORMAT '/tmp/%U';

Starting conversion at source at 30-SEP-08
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile conversion
input datafile file number=00007 name=/u01/app/oracle/oradata/salesdb/sales_101.dbf converted datafile=/tmp/data_D-SALESDB_I-1192614013_TS-SALES_1_FNO-7_03jru08s channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:45
channel ORA_DISK_1: starting datafile conversion
input datafile file number=00008 name=/u01/app/oracle/oradata/salesdb/sales_201.dbf converted datafile=/tmp/data_D-SALESDB_I-1192614013_TS-SALES_2_FNO-8_04jru0aa channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:25
Finished conversion at source at 30-SEP-08
示例二:在目標資料庫端完成位元組儲存次序轉換
C:\>RMAN TARGET /
Recovery Manager: Release 11.2.0.0.1 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
connected to target database: ORAWIN (DBID=3462152886)

RMAN> CONVERT DATAFILE 
2>'C:\Temp\sales_101.dbf',
3>'C:\Temp\sales_201.dbf'
4>TO PLATFORM="Microsoft Windows IA (32-bit)"
5>FROM PLATFORM="Solaris[tm] OE (32-bit)"
6>DB_FILE_NAME_CONVERT=
7>'C:\Temp\', 'C:\app\orauser\oradata\orawin\'
8> PARALLELISM=4;

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

相關文章