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