方法一:
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.
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=====