Oracle 表空間傳輸

studywell發表於2016-10-18
oracle 表空間傳輸

轉:http://blog.itpub.net/29515435/viewspace-1123714/
並整理修改部分錯誤

一、傳輸表空間概述
首先來認識一下什麼是傳輸表空間,傳輸表空間技術始於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 s order by s.ENDIAN_FORMAT;
 
PLATFORM_ID PLATFORM_NAME                        ENDIAN_FORMAT
----------- ------------------------------------ --------------
          6 AIX-Based Systems (64-bit)              Big
         18 IBM Power Based Linux                   Big
          2 Solaris[tm] OE (64-bit)                 Big
          4 HP-UX IA (64-bit)                       Big
         16 Apple Mac OS                            Big
          1 Solaris[tm] OE (32-bit)                 Big
          9 IBM zSeries Based Linux                 Big
          3 HP-UX (64-bit)                          Big
         17 Solaris Operating System (x86)          Little
         20 Solaris Operating System (x86-64)       Little
         12 Microsoft Windows x86 64-bit            Little
         13 Linux x86 64-bit                        Little
          8 Microsoft Windows IA (64-bit)           Little
         19 HP IA Open VMS                          Little
         11 Linux IA (64-bit)                       Little
          5 HP Tru64 UNIX                           Little
         10 Linux IA (32-bit)                       Little
          7 Microsoft Windows IA (32-bit)           Little
         15 HP Open VMS                             Little
 
19 rows selected


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

五、本次實驗記錄
選擇了兩個Linux平臺資料庫(10.2.0.4和11.2.0.1)之間的表空間傳輸。


1、實驗前準備。建立測試用表空間、使用者、表、插入兩條資料(用於最後驗證表傳輸成功,資料都可以正常訪問)
create tablespace test datafile '/u01/app/oracle/oradata/stdb/test01.dbf' size 10m;                                                  --------------建立測試用表空間,表空間名為test

create user tester identified by tester default tablespace test account unlock;                      //建立測試使用者,使用者名稱為tester,預設表空間為test
grant connect,resource to tester;

conn tester/tester;
create table t1 (id number,name varchar(10),sex char(1),age int,class varchar(3));              //建立測試驗證用表,表名為t1

insert into t1 values (2001,'alex','M',18,'10');
insert into t1 values (2002,'bob','M',18,'20');


 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.
等等。

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

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

4、使用expdp工具生成表空間(集)Transportable Tablespace Set
    Transportable Tablespace Set有兩部分:
        1.expdp 匯出的表空間的metadata
        2.還有就是表空間對應的資料檔案


建立備份目錄
mkdir -p /data/dump
create directory dump_dir as '/data/dump';
expdp system/oracle dumpfile=expdat.dmp directory=dump_dir transport_tablespaces=test logfile=export.log transport_full_check=y


5、使用ftp或scp工具分別複製表空間(集)和與表空間對應資料檔案到相應的目錄。
   將Transportable Tablespace set 傳送到Target端
    1)將表空間test 對應的資料檔案copy到Target 對應的ORADATA目錄下。
    2)將expdp 匯出的表空間metadta 資料copy 到Target 端的backup 目錄下


在目標端建立備份目錄
mkdir -p /data/dump
create directory dump_dir as '/data/dump';

檢視源端和目標端的資料檔案位置;
select * from dba_data_files f;

 scp -r /data/dump/exp* 10.98.156.149:/data/dump
 scp /data/oradata/oral/data01.dbf 10.98.156.149:/oracle/app/oradata/oral/


6、將源資料庫表空間設為read-write狀態。
將資料檔案傳到目標庫後才能將源庫表空間啟動為讀寫狀態,否則在目標庫匯入時報版本錯誤。
alter tablespace test read write;

7、在目標資料庫使用impdp工具將表空間(集)匯入目標資料庫,根據需要決定是否需要建立與源資料庫相同的使用者,或者在使用impdp是可以使用remap_schema引數。

建立同名使用者。
create user tester identified by tester;         
--建立測試使用者,使用者名稱為tester,
grant connect,resource to tester;

impdp system/oracle dumpfile=expdat.dmp directory=dump_dir transport_datafiles=/oracle/app/oradata/oral/data01.dbf logfile=import.log


匯入到不同名使用者下
impdp directory=backup dumpfile=test01.dmp transport_datafiles=/u01/app/oracle/oradata/normal/test01.dbf remap_schema=source_test:target_test logfile


8、驗證結果
select ts#,name from v$tablespace;
conn tester/tester;
select * from t1;
        ID NAME       S        AGE CLA
---------- ---------- - ---------- ---
      2001 alex       M         18 10
      2002 bob        M         18 20

insert into t1 values (2003,'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/29519108/viewspace-2126696/,如需轉載,請註明出處,否則將追究法律責任。

相關文章