11gr2資料泵REMAP_TABLE功能

yangtingkun發表於2010-06-04

Oracle其實在11.1.0.6中已經推出了這個功能,不過11.1.0.6中還存在bug。這裡簡單介紹一下11.2中的REMAP_TABLE功能。

Oracle11g新特性——資料泵(六):http://yangtingkun.itpub.net/post/468/473311

1106版本中資料泵匯入REMAP_TABLE無效:http://yangtingkun.itpub.net/post/468/473037

 

 

看一個簡單的例子:

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> create table t
  2  (id number,
  3  name varchar2(30));

表已建立。

SQL> insert into t
  2  select rownum, tname
  3  from tab;

已建立11行。

SQL> commit;

提交完成。

SQL> create index ind_t_id
  2  on t (id);

索引已建立。

下面匯出T表:

SQL> host expdp yangtk/yangtk directory=d_output dumpfile=t.dp tables=t

Export: Release 11.2.0.1.0 - Production on 星期五 6 4 23:31:50 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

連線到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
啟動 "YANGTK"."SYS_EXPORT_TABLE_01":  yangtk/******** directory=d_output dumpfile=t.dp tables=t
正在使用 BLOCKS 方法進行估計...
處理物件型別 TABLE_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的總估計: 128 KB
處理物件型別 TABLE_EXPORT/TABLE/TABLE
處理物件型別 TABLE_EXPORT/TABLE/INDEX/INDEX
處理物件型別 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
. .
匯出了 "YANGTK"."T"                                5.562 KB      11
已成功載入/解除安裝了主表 "YANGTK"."SYS_EXPORT_TABLE_01"
******************************************************************************
YANGTK.SYS_EXPORT_TABLE_01
的轉儲檔案集為:
  /home/oracle/t.dp
作業 "YANGTK"."SYS_EXPORT_TABLE_01" 已於 23:31:59 成功完成

利用REMAP_TABLE將匯入表重新對映到T_NEW表中:

SQL> host impdp yangtk/yangtk directory=d_output dumpfile=t.dp remap_table=t:t_new

Import: Release 11.2.0.1.0 - Production on 星期五 6 4 23:32:19 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

連線到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已成功載入/解除安裝了主表 "YANGTK"."SYS_IMPORT_FULL_01"
啟動 "YANGTK"."SYS_IMPORT_FULL_01":  yangtk/******** directory=d_output dumpfile=t.dp remap_table=t:t_new
處理物件型別 TABLE_EXPORT/TABLE/TABLE
處理物件型別 TABLE_EXPORT/TABLE/TABLE_DATA
. .
匯入了 "YANGTK"."T_NEW"                            5.562 KB      11
處理物件型別 TABLE_EXPORT/TABLE/INDEX/INDEX
ORA-31684:
物件型別 INDEX:"YANGTK"."IND_T_ID" 已存在
處理物件型別 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
ORA-39111:
跳過從屬物件型別 INDEX_STATISTICS, 基本物件型別 INDEX:"YANGTK"."IND_T_ID" 已存在
作業 "YANGTK"."SYS_IMPORT_FULL_01" 已經完成, 但是有 2 個錯誤 ( 23:32:22 完成)


SQL> select count(*) from t_new;

  COUNT(*)
----------
        11

REMAP_TABLE成功,T_NEW表建立,而且資料已經匯入,不過可以看到,索引並沒有別建立,不過這並不難理解,因為同名索引已經被建立,因此索引顯然不能匯入,下面刪除索引:

SQL> drop table t_new purge;

表已刪除。

SQL> drop index ind_t_id;

索引已刪除。

再次執行匯入操作:

SQL> host impdp yangtk/yangtk directory=d_output dumpfile=t.dp remap_table=t:t_new

Import: Release 11.2.0.1.0 - Production on 星期五 6 4 23:32:54 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

連線到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已成功載入/解除安裝了主表 "YANGTK"."SYS_IMPORT_FULL_01"
啟動 "YANGTK"."SYS_IMPORT_FULL_01":  yangtk/******** directory=d_output dumpfile=t.dp remap_table=t:t_new
處理物件型別 TABLE_EXPORT/TABLE/TABLE
處理物件型別 TABLE_EXPORT/TABLE/TABLE_DATA
. .
匯入了 "YANGTK"."T_NEW"                            5.562 KB      11
處理物件型別 TABLE_EXPORT/TABLE/INDEX/INDEX
處理物件型別 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
作業 "YANGTK"."SYS_IMPORT_FULL_01" 已於 23:32:58 成功完成


SQL> select table_name, index_name
  2  from user_indexes
  3  where index_name = 'IND_T_ID';

TABLE_NAME                     INDEX_NAME
------------------------------ ------------------------------
T                              IND_T_ID

索引也成功匯入,但是檢查後發現,索引仍然建立到T表上,並沒有因為使用了REMAP_TABLE而建立在T_NEW表中。

因此,至少在11.2.0.1中,REMAP_TABLE只對表和資料有效,而對索引無效,而且使用REMAP_TABLE對於原表仍然存在的情況下要小心,因為REMAP_TABLE操作很可能導致源表發生匯入操作,導致一些非預期的物件被匯入,比如:

SQL> alter table t add check (id > 0);

表已更改。

SQL> host expdp yangtk/yangtk directory=d_output dumpfile=t.dp tables=t reuse_dumpfiles=y

Export: Release 11.2.0.1.0 - Production on 星期五 6 4 23:51:13 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

連線到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
啟動 "YANGTK"."SYS_EXPORT_TABLE_01":  yangtk/******** directory=d_output dumpfile=t.dp tables=t reuse_dumpfiles=y
正在使用 BLOCKS 方法進行估計...
處理物件型別 TABLE_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的總估計: 128 KB
處理物件型別 TABLE_EXPORT/TABLE/TABLE
處理物件型別 TABLE_EXPORT/TABLE/INDEX/INDEX
處理物件型別 TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
處理物件型別 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
. .
匯出了 "YANGTK"."T"                                5.562 KB      11
已成功載入/解除安裝了主表 "YANGTK"."SYS_EXPORT_TABLE_01"
******************************************************************************
YANGTK.SYS_EXPORT_TABLE_01
的轉儲檔案集為:
  /home/oracle/t.dp
作業 "YANGTK"."SYS_EXPORT_TABLE_01" 已於 23:51:23 成功完成


SQL> drop table t_new purge;

表已刪除。

SQL> host impdp yangtk/yangtk directory=d_output dumpfile=t.dp remap_table=t:t_new

Import: Release 11.2.0.1.0 - Production on 星期五 6 4 23:55:51 2010

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

連線到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已成功載入/解除安裝了主表 "YANGTK"."SYS_IMPORT_FULL_01"
啟動 "YANGTK"."SYS_IMPORT_FULL_01":  yangtk/******** directory=d_output dumpfile=t.dp remap_table=t:t_new
處理物件型別 TABLE_EXPORT/TABLE/TABLE
處理物件型別 TABLE_EXPORT/TABLE/TABLE_DATA
. .
匯入了 "YANGTK"."T_NEW"                            5.562 KB      11
處理物件型別 TABLE_EXPORT/TABLE/INDEX/INDEX
ORA-31684:
物件型別 INDEX:"YANGTK"."IND_T_ID" 已存在
處理物件型別 TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
處理物件型別 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
ORA-39111:
跳過從屬物件型別 INDEX_STATISTICS, 基本物件型別 INDEX:"YANGTK"."IND_T_ID" 已存在
作業 "YANGTK"."SYS_IMPORT_FULL_01" 已經完成, 但是有 2 個錯誤 ( 23:55:55 完成)


SQL> col search_condition format a20
SQL> select table_name, constraint_name, search_condition
  2  from user_constraints
  3  where table_name = 'T';

TABLE_NAME                     CONSTRAINT_NAME                SEARCH_CONDITION
------------------------------ ------------------------------ --------------------
T                              SYS_C0011261                   id > 0
T                              SYS_C0011277                   id > 0

在這個例子中,就由於約束是系統名稱,導致在執行REMAP_TABLE匯入後,同樣的約束在源表上重複建立。

 

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

相關文章