X impdp導數據的時候批量替換表空間的方法


 

 

方法一:

impdp導數據的時候經常會有很多表在不同的表空間的情況,如果想進行批量替換表空間,可以用%作為通配符來替換。

remap_tablespace=%:tbs  

 

 

 

===============================================================================================================

方法二: 

如上的方法我在自己的機器上測試可以,但是在其他的環境上不可以正常運行。

然后可以用其他的方法,如下:

 

transform 可用在這樣的場景中:

 

要將SLKTESTNEW模式下的表導入到另一個庫下的SH_SMCVDMS_SLK_OWSLK模式下。

該模式下對象實際所占的大小:

SQL> select sum(bytes)/1024/1024 from dba_segments where owner=upper('SLKTESTNEW');

SUM(BYTES)/1024/1024

--------------------

            11747.25   -----------很大,會計算所有hwm下的block

導出語句:

expdp system/1111sys directory=dmpdata SCHEMAS=SLKTESTNEW dumpfile=owslk20110630.dmp logfile=owslk20110630.log  

導出數據后的dmp大小:

$ du -m OWSLK20110630.DMP

80.63   OWSLK20110630.DMP   ----很小,因為expdp只把有效block導出

 

 

若不加transform,且導入的表空間小於前面計算的11747.25,中間報錯:

 

ORA-01659: unable to allocate MINEXTENTS beyond 14 in tablespace SH_SMCVDMS_SLK_OWSLK_DATA01。

也不必為了80M的數據再加入11G的空間。那就用impdp的transform 選項 實現導入。

 

 

 

impdp的transform 選項決定是否去掉ddl語句的各種存儲參數

 

Purpose

Enables you to alter object creation DDL for specific objects, as well as for all applicable objects being loaded.

 

Metadata transform to apply to applicable objects.   Valid transform keywords: SEGMENT_ATTRIBUTES, STORAGE,OID, and PCTSPACE

 

Syntax and Description

TRANSFORM = transform_name:value[:object_type]

 

例如:transform=storage:n:table ,去掉ddl的storage參數,只對table有效,若沒有table這個子句的話,就對所有對象有效,比如index

sql_file 選項加入后只是模擬導入過程,形成sql腳本,不會真正的導入。通過腳本可查看storage選項是否存在,segment_attributes是否存在。

使用transform可降低導入數據的存儲需求,比如若源數據需要30G的表空間,但導出數據后只有300M,再導入的時候不必分配30G,由於transform起作用,把storage去掉了。

舉例:

沒指定transform,導入形成的dll

CREATE TABLE "SH_SMCVDMS_SLK_OWSLK"."DE_DEMESSAGEIDMAP"

   (        "DEMESSAGEID" CHAR(40) NOT NULL ENABLE,

       ..................................

        "UPDATE_BY" CHAR(10)

   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

  STORAGE(INITIAL 2952790016 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645   -----先要初始化這么大的空間出來,這個不必要。若空間不足導入會終止

  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

  TABLESPACE "SH_SMCVDMS_SLK_OWSLK_DATA01" ;

 

加入了transform=storage:n

CREATE TABLE "SH_SMCVDMS_SLK_OWSLK"."DE_DEMESSAGEIDMAP"

   (        "DEMESSAGEID" CHAR(40) NOT NULL ENABLE,

          ..................................

        "UPDATE_BY" CHAR(10)

   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

  TABLESPACE "SH_SMCVDMS_SLK_OWSLK_DATA01" ;   ------------把storage部分去掉了,這樣可不必需要那么多的空間,按數據庫默認的initial 64k.

 

加入了transform=segment_attributes:n

CREATE TABLE "SH_SMCVDMS_SLK_OWSLK"."DE_DEMESSAGEIDMAP"

   (        "DEMESSAGEID" CHAR(40) NOT NULL ENABLE,

         ..................................

        "UPDATE_BY" CHAR(10)

   ) ; ---------------這個很干凈了,create table的時候都是使用數據庫的默認存儲參數,表空間也使用的是用戶默認表空間

 

---模擬導入,形成sql腳本:

impdp system/1111directory=dmp transform=storage:n  REMAP_SCHEMA="SLKTESTNEW:sh_smcvdms_slk_owslk"   remap_tablespace="SH_DMS_SLK_OWSGM_DATA01:sh_smcvdms_slk_owslk_data01"    remap_tablespace="SH_DMS_SLK_OWSGM_LOB01:SH_SMCVDMS_SLK_OWSLK_LOB01"    dumpfile=OWSLK20110630.DMP logfile=owslk20110702_storage_n.log  sqlfile=owslk0702_storage_n.sql

----真正導入:

impdp system/1111 directory=dmp transform=storage:n  REMAP_SCHEMA="SLKTESTNEW:sh_smcvdms_slk_owslk"   remap_tablespace="SH_DMS_SLK_OWSGM_DATA01:sh_smcvdms_slk_owslk_data01"    remap_tablespace="SH_DMS_SLK_OWSGM_LOB01:SH_SMCVDMS_SLK_OWSLK_LOB01"    dumpfile=OWSLK20110630.DMP logfile=owslk20110702_storage_n.log  table_exists_action=replace

 

------ 最簡單的方法:

如果是按照用戶導入的,那么需要在新服務器上新建用戶,並且指定默認表空間。

然后按照如下的方案導入,那么所有的語句都會導入到 新建用戶的默認表空間中的。

impdp system/1111 directory=dmp transform=storage:n  REMAP_SCHEMA="SLKTESTNEW:sh_smcvdms_slk_owslk"   \

dumpfile=OWSLK20110630.DMP logfile=owslk20110702_storage_n.log   transform=segment_attributes:n  table_exists_action=replace 

 

====end=====

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM