expdp导出的时候指定了contents=metadata_only只导出元数据,但是在impdp导入到新库的时候,发现新库的表空间增长非常大,其实这个直接就可以想到,应该是大表的initial segment过大导致的
正常impdp,在执行创建表和索引的sql的时候,会带上存储参数,存储参数中就指定了初始化段大小,如果原表非常大或者表分区特别多,那么这个默认的初始化段也会变的非常大,因此会导致你建表的时候占用的空间非常大
expdp/impdp提供了transform参数,可以指定在导出和导入的时候去除哪些属性:
TRANSFORM
Metadata transform to apply to applicable objects.
Valid keywords are: OID, PCTSPACE, SEGMENT_ATTRIBUTES and STORAGE.
内部可能是调用的DBMS_METADATA.SET_TRANSFORM_PARAM函数,关于此函数可以参考:
DBMS_METADATA中使用SESSION_TRANSFORM过滤不想获取的DDL-CSDN博客
此外,建表的时候创不创建初始段还和参数:
deferred_segment_creation boolean TRUE
有关,如果设置为true,那么默认建表的时候如果不加任何存储参数,是不会创建段的,如果设置为n,那么就会创建段,如果不显式的指定initial extentd,其实这个初始段一般是非常小的,但是如果要加快创建速度,是可以把他设置为true,这么就是只会建表,而不会创建段
最后修改导入语句如下:
impdp \'/ as sysdba\' directory=expdir dumpfile=str.dmp full=y exclude=statistics TRANSFORM=SEGMENT_ATTRIBUTES:N
导入完成检查表空间使用:
发现只有system表空间占用,因为元数据保存在system表空间中,其它表空间中都没有数据。