impdp/expdp使用心得

来源:互联网 发布:通信网络 相关专业 编辑:程序博客网 时间:2024/05/29 08:27

这几个月经常使用impdp/expdp来做数据迁移,稍微总结一下。


1、如果dump备份文件的用户和即将导入的用户不同,则需要使用remap_schema参数。而当使用了这个参数之后,还想用tables参数指定要导入的表,则必须在表前使用旧的“用户名.表名”的方式,如从A用户导出备份dump文件,导入到B用户中,只导入表table1,则参数需要这样使用:

impdp remap_schema=A:B tables=A.table1


2、同样,如果导出和导入的表空间不同,则需要使用remap_tablespace参数。


3、如果只导入表的数据,则使用content=data_only


4、关于table_exists_action参数:

当值为replace时,则只对表有效,对其他数据库对象无效,不要妄想它对sequence等也能生效。

当值为truncate时,导入前会先清空表,再导入,如果表之前存在外键约束,则truncate时可能会失败,所以在使用truncate值时,建议先将要导入的表之间的外键约束disable掉。且建议使用truncate时,配合DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS参数一起使用,否则导入的过程中,无法保证有外键约束的表之间的导入顺序,可能会报错。一般只会对table进行操作,才会使用truncate参数,则可以考虑与content_data_only一起使用。

当值为append时,如果发生了主键、唯一键冲突,则会导致导入失败,建议提前排查。

注意:只有replace导入后才会重新统计,否则建议使用dbms_stats.gather_table_stats来对所导入的表重新统计信息,以便让SQL优化器CBO获得较佳的执行计划,才能获得更好的性能。


5、在导入过程中,可能出现卡死现象,可能有如下原因:

1)、sga太小,分配shared_pool等内存不足

2)、遇到过PROCESSING PASSWORD_HISTORY卡死的情况,则exclude=PASSWORD_HISTORY即可

3)、磁盘空间不足,使用df -h可以进行查看

4)、如果是CPU 100%,则需要再进行定位

5)、如果是undo表空间不足,则可以调大undo表空间,在demo环境下,可以直接设置成自动扩展的

6)、temp表空间不足,同上


6、parallel参数,最好根据show parameter cpu中的参数来设定,我一般设置为网上推荐的cpu个数*每个cpu的线程个数-1。

这个parallel参数设置多少还真不一定,有时候设置大了,线程之间打架,反而帮倒忙。

如果数据量比较大,比如亿级,很可能是分区表,则可以考虑将大的分区表,按分区拆分成一个个dump文件,然后再配合parallel参数来完成导入。


7、当你使用了schema参数时,意味着你要导入该schema下全部的对象。


8、在执行impdp/expdp时,执行Ctrl + C不会退出程序,只是进入了交互模式,如果想停止进程,则输入命令:stop_job,回车即可。

如果想恢复,则使用CONTINUE_CLIENT继续执行。


9、使用expdp备份时,建议exclude掉自己不需要备份的东西,比如:SYSTEM_GRANT、ROLE_GRANT、DEFAULT_ROLE、TABLE_QUOTA、PASSWORD_HISTORY、USER、GRANT等。


10、几个小Tips:

1)、Linux上可以使用strings命令,直接查看dump二进制文件中的内容,可以看到表名等有用的信息

2)、可以使用impdp命令将dump文件转换成sql文件,需要使用到sqlfile参数,指定将dump生成的sql文件名

3)、有时候include、exclude参数中,配置了很多值,在shell脚本中会太长,不美观,则建议使用parfile参数,来指定参数文件

4)、使用include和exclude时,括号、引号等符号,都需要进行转义,如果觉得转义比较麻烦,则将参数写到parfile中就可以避免转义问题

5)、使用impdp导入时,如果源表结构与目标表结构不同,还想导入的话,需要安装XDB组件