impdp数据泵导入使用table_exists_action=SKIP存在的问题以及如何接着导入数据而不用重新导入

0    217    1

Tags:

👉 本文共约1219个字,系统预计阅读时间或需5分钟。

引言

我们在使用数据泵导入数据库时,可能存在这种情况:

数据泵已经跑了8个小时了,而且表的数据都已经入库了,就剩后边的索引、约束和触发器等,那难道我还得重新从头接着导入吗?答案不是的,我们有办法,就是结合“table_exists_action=SKIP content=metadata_only sqlfile=index.sql”这几个参数来解决。

实验1:使用skip选项

lhr用户下t1和t3表,t1表含有1个索引:

实验2:导入一半后强制停止数据库

先导出sh用户的数据:

然后再导入sh用户的数据到lhr用户,在导入一半的时候将数据库重启:

在导入一半的时候,强制重启数据库,此时已经导入了2个表。

在强制重启完数据库后,进入数据库查看:

可以看到,LHR用户的表都已经创建完成了。由此可以推断出,尽管数据没有导入完成,但是在执行完“SCHEMA_EXPORT/TABLE/TABLE” 这个步骤后,其实数据库中的所有表都已经创建完成了。整个impdp导入过程是先创建所有表,然后再插入数据,而不是边建表边插入数据。

总结

1、使用参数table_exists_action=SKIP时需要特别注意,若表已存在,那么表上的索引不会被导入,所以可能导致索引丢失的问题。类似的提示:ORA-39151: Table "LHR"."T1" exists. All dependent metadata and data will be skipped due to table_exists_action of skip

2、参数table_exists_action的默认值为SKIP,

TABLE_EXISTS_ACTION
默认为:SKIP
作用:定义了如果要导入的表已经存在,impdp的动作
值及其含义:
SKIP:不管已经存在的表,直接跳过,会导致表上的索引、触发器、约束等缺失问题,也可能会导致数据丢失
APPEND:保持现有数据不变,导入源数据
TRUNCATE:删掉现有数据,导入源数据
REPLACE:删掉现有表,并重建,导入源数据

3、若需要重新做导入操作,而不导入之前已经导入的数据,那么可以使用如下的办法:

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

注意:

1、最后的sqlfile=ddl.sql也不能加 EXCLUDE=TABLE,否则也会排除掉索引

2、也可以只导最后的索引和约束。

3、在跑脚本建索引时需要注意临时表空间的使用率。

4、在执行完“SCHEMA_EXPORT/TABLE/TABLE” 这个步骤后,其实数据库中的所有表都已经创建完成了。整个impdp导入过程是先创建所有表,然后再插入数据,而不是边建表边插入数据。

5、最后需要特别注意的一点,使用方法3的前提条件是,必须保证所有的表和数据都已经导入完成了,否则会造成数据丢失,这个问题非常严峻。所以,若时间允许,我们强烈建议使用replace或truncate选项进行重新导入。

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部