研究 - IMPDP [TRANSFORM=segment_attributes:n] [remap_tablespace] 2引數間影響關係

maohaiqing0304發表於2014-08-22

註釋:
相信一些公司習慣將真實的表資料和索引不在一個表空間;
(例如:伺服器'編號:59'  TEST 使用者 T1表資料在 DATA表空間,索引在 IDX表空間)
那怎麼實現導到 其他伺服器'編號:69' TEST使用者 T1表資料在  USERS 表空間,索引在 USER01 表空間;
方案:
1)
     手動 其他伺服器 TEST使用者下建立表和索引分別指向;---表少可以這樣做
2)
     設定目標 TEST使用者 預設表空間 USER01,impdp 時加引數TRANSFORM ,索引 透過 remap_tablespace引數更改到自己想指定的表空間;
3)
     是否可以有這樣的引數,來實現 如果物件的表空間=data 改成USER01表空間=ind 改成USER01 


簡單說下2個引數意義:
TARGET_EDITION:用於載入後設資料的版本。
              TRANSFORM=segment_attributes:n  使用TRANSFORM選項可以完成去掉表空間和儲存子句的目的,這樣我們便可以控制匯入時按照目標預設的引數
REMAP_TABLESPACE:將表空間物件重新對映到另一個表空間。 



帶著方案/思想去實驗下哈~

方案一)create table ..tablespace ..;create index  ..tablespace ..;在這就不說明了....

方案二)
步驟:
搭建環境: 
    1)在  伺服器'編號:59 ' 上建立使用者/表/索引     
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0
Connected as sys@192.168.0.59/testdb AS SYSDBA
 
SQL>
SQL> create user test identified by test ;
 
User created
SQL> grant dba to test;
 
Grant succeeded
 
SQL> conn test/test@192.168.0.59:1521/testdb
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0
Connected as test@192.168.0.59:1521/testdb
 
SQL> create table t1 tablespace FWS_BUSINESS_DATA as select * from sinotest.cs_order ;
 
Table created
 
 
SQL> SELECT TABLE_NAME,TABLESPACE_NAME        FROM USER_tables C WHERE C.TABLE_NAME='T1';
 
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
T1                             FWS_BUSINESS_DATA
 
SQL> create index ind_t1 on T1 (con_id) tablespace FWS_BUSINESS_IDX;
 
Index created
 
SQL> SELECT TABLE_NAME,INDEX_NAME,TABLESPACE_NAME  FROM USER_INDEXES C WHERE C.TABLE_NAME='T1';
 
TABLE_NAME                     INDEX_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
T1                             IND_T1                         FWS_BUSINESS_IDX
 

SQL> SELECT COUNT(1) FROM t1;
 
  COUNT(1)
----------
    103402
 
SQL> 

2)在  伺服器'編號:69 ' 上建立 59的dblink
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0
Connected as sys@192.168.0.69/testdb AS SYSDBA
 
SQL> create public database link db_test connect to test identified by test using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.59)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = testdb)))';
 
Database link created
 
SQL> 檢驗dblink是否正常:
SQL> SELECT COUNT(1) FROM t1@db_test;
 
  COUNT(1)
----------
    103402
 
SQL> 由於伺服器'編號:69 有test使用者' 檢視下預設表空間 及 要測試的2個表空間存在情況:
 
SQL> SELECT username,default_tablespace FROM user_users;
 
USERNAME                       DEFAULT_TABLESPACE
------------------------------ ------------------------------
TEST                           USERS
 
SQL> select * from v$tablespace s where s.NAME in ('USER01','USERS','FWS_BUSINESS_DATA','FWS_BUSINESS_IDX');
 
       TS# NAME                           INCLUDED_IN_DATABASE_BACKUP BIGFILE FLASHBACK_ON ENCRYPT_IN_BACKUP
---------- ------------------------------ --------------------------- ------- ------------ -----------------
          4 USERS                          YES                         NO      YES         
          5 USER01                         YES                         NO      YES         
 
SQL> 可以看出 69伺服器只有users,user01 2個表空間... 


測試:
   命令:impdp test/test@192.168.0.69:1521/sinodb network_link=db_test  tables=test.t1 remap_schema=test:test TRANSFORM=segment_attributes:n remap_tablespace=FWS_BUSINESS_IDX:user01 table_exists_action=replace
   是否會按照之前的想法 :伺服器'編號:69 '  T1表 表資料應該在預設表空間,索引應該在user01表空間
E:>impdp test/test@192.168.0.69:1521/sinodb network_link=db_test  tables=test.t1 remap_schema=test:test TRANSFORM=segment_attributes:n remap_tablespace=FWS_BUSINESS_IDX:user01 table_exists_action=replace

Import: Release 10.2.0.1.0 - Production on 星期五, 22 8月, 2014 16:25:26

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

連線到: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
啟動 "TEST"."SYS_IMPORT_TABLE_01":  test/********@192.168.0.
69:1521/sinodb network_link=db_test tables=test.t1 remap_schema=test:test TRANSFORM=segment_attributes:n remap_tablespace=FWS_BUSINESS_IDX:user01 table_exists_action=replace
正在使用 BLOCKS 方法進行估計...
處理物件型別 TABLE_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的總估計: 32 MB
處理物件型別 TABLE_EXPORT/TABLE/TABLE
. . 匯入了 "TEST"."T1"                                 103402 行
處理物件型別 TABLE_EXPORT/TABLE/INDEX/INDEX
處理物件型別 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
作業 "TEST"."SYS_IMPORT_TABLE_01" 已於 16:20:34 成功完成
E:>

    --校驗...是否按照理想的表空間匯入
SQL> select u.USERNAME,u.DEFAULT_TABLESPACE  from user_users u;
 
USERNAME                       DEFAULT_TABLESPACE
------------------------------ ------------------------------
TEST                           USERS
 
SQL>  SELECT TABLE_NAME,INDEX_NAME,TABLESPACE_NAME  FROM USER_INDEXES C WHERE C.TABLE_NAME='T1';
 
TABLE_NAME                     INDEX_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
T1                             IND_T1                         USERS
 
SQL> 
   結論:
   從結構可以看出 帶有TRANSFORM=segment_attributes:n 引數,導致remap_tablespace引數失效,(及時表空間是否存在都不會報錯)都會匯入到使用者預設表空間;
       部落格:    有說以上測試remap_tablespace=FWS_BUSINESS_IDX:user01應該生效的
                                         ....是理解錯了還是什麼情況,望大家有思路的一起分享..謝謝

依據此場景測試下 
去掉TRANSFORM=segment_attributes:n 引數,只用remap_tablespace=FWS_BUSINESS_DATA:user01 看索引FWS_BUSINESS_IDX是不是正常的報錯(肯定是,但是還是簡單的付現下報錯資訊)
想檢視結果的...將如下 白色字型 選中可付現報錯資訊

E:>impdp test/test@192.168.0.69:1521/sinodb network_link=db_test  tables=test.t1 remap_schema=test:test  remap_tablespace=FWS_BUSINESS_DATA:user01  table_exists_action=replace

Import: Release 10.2.0.1.0 - Production on 星期五, 22 8月, 2014 16:25:26

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

連線到: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
啟動 "TEST"."SYS_IMPORT_TABLE_01":  test/********@192.168.0.69:1521/sinodb network_link=db_test tables=test.t1 remap_schema=test:test TRANSFORM=segment_attributes:n remap_tablespace=FWS_BUSINESS_IDX:user01 table_exists_action=replace
正在使用 BLOCKS 方法進行估計...
處理物件型別 TABLE_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的總估計: 32 MB
處理物件型別 TABLE_EXPORT/TABLE/TABLE
. . 匯入了 "TEST"."T1"                                 103402 行
ORA-39083: 物件型別 INDEX 建立失敗, 出現錯誤:
ORA-00959: 表空間 'FWS_BUSINESS_IDX' 不存在
失敗的 sql 為:
CREATE INDEX "TEST"."IDX_T1" ON "TEST"."T1" ("CON_ID") ........等
ORA-39083: 物件型別 INDEX 建立失敗, 出現錯誤:
ORA-00959: 表空間 'FWS_BUSINESS_IDX' 不存在
處理物件型別 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
ORA-39112: 跳過從屬物件型別 INDEX_STATISTICS, 建立基本物件型別 INDEX:"TEST"."IDX_T1" 失敗
處理物件型別 TABLE_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
處理物件型別 TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
C:\Users\mhq>

檢視匯入情況:
SQL> select u.USERNAME,u.DEFAULT_TABLESPACE  from user_users u;
 
USERNAME                       DEFAULT_TABLESPACE
------------------------------ ------------------------------
TEST                           USER01
 
SQL>  SELECT TABLE_NAME,INDEX_NAME,TABLESPACE_NAME  FROM USER_INDEXES C WHERE C.TABLE_NAME='T1';
 
TABLE_NAME                     INDEX_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
 
SQL> 


結論:索引報錯沒有FWS_BUSINESS_IDX表空間,remap_tablespace=FWS_BUSINESS_DATA:user01 只生效了表資料匯入;




 
方案三)
步驟:
     是否可以有這樣的引數,來實現 如果物件的表空間=data 改成users,表空間=ind 改成user01; 
     ...果真有啊...  設想寫為(remap_tablespace=FWS_BUSINESS_DATA:users  remap_tablespace=FWS_BUSINESS_idx:user01)是否可以都生效

測試:
E:\oracle>impdp test/test@192.168.0.69:1521/sinodb network_link=db_test  tables=test.t1 remap_schema=test:test remap_tablespace=FWS_BUSINESS_DATA:users remap_tablespace=FWS_BUSINESS_IDX:user01  table_exists_action=replace

Import: Release 10.2.0.1.0 - Production on 星期五, 22 8月, 2014 17:18:38

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

連線到: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
啟動 "TEST"."SYS_IMPORT_TABLE_01":  test/********@192.168.0.69:1521/sinodb network_link=db_test tables=test.t1 remap_schema=test:test remap_tablespace=FWS_BUSINESS_DATA:users remap_tablespace=FWS_BUSINESS_IDX:user01 table_exists_action=replace
正在使用 BLOCKS 方法進行估計...
處理物件型別 TABLE_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的總估計: 32 MB
處理物件型別 TABLE_EXPORT/TABLE/TABLE
. . 匯入了 "TEST"."T1"                                 103402 行
處理物件型別 TABLE_EXPORT/TABLE/INDEX/INDEX
處理物件型別 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
作業 "TEST"."SYS_IMPORT_TABLE_01" 已於 17:13:45 成功完成

E:\oracle>



校驗:
SQL>  SELECT TABLE_NAME,TABLESPACE_NAME        FROM USER_tables C WHERE C.TABLE_NAME='T1';
 
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
T1                             USERS
 
SQL>  SELECT TABLE_NAME,INDEX_NAME,TABLESPACE_NAME  FROM USER_INDEXES C WHERE C.TABLE_NAME='T1';
 
TABLE_NAME                     INDEX_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
T1                             IND_T1                         USER01
 
SQL> 

結論:
引數都生效了,也就是說它識別成2個引數了,且2個remap_tablespace沒有順序情況;


          所有測試結論: 
1) 測試:
引數TRANSFORM、remap_tablespace都存在,匯入測試 ,看引數生效情況
    結論:
 TRANSFORM=segment_attributes:n 引數,導致remap_tablespace引數失效,會匯入到使用者預設表空間
2) 測試:
去掉 TRANSFORM=segment_attributes:n 引數後
正常測試 remap_tablespace=FWS_BUSINESS_DATA:users  users表空間真是存在,看索引FWS_BUSINESS_IDX是否報錯?
   結論:
索引報錯沒有FWS_BUSINESS_IDX表空間,remap_tablespace=FWS_BUSINESS_DATA:user01只生效了表;(正常不過)
3) 測試:
想將索引轉換為users ,設想寫為(
remap_tablespace=FWS_BUSINESS_DATA:users  remap_tablespace=FWS_BUSINESS_idx:user01)是否可以都生效
結論:
引數都生效了,也就是說它識別成2個引數了,且2個remap_tablespace沒有順序情況;


   祝好~

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

相關文章