这几个月经常使用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组件