Oracle impdp时选项TABLE_EXISTS_ACTION

impdp有一个参数选项TABLE_EXISTS_ACTION,help=y的解释为:

Action to take if imported object already exists.

Valid keywords are: APPEND, REPLACE, [SKIP] and TRUNCATE.

官方文档有句话:

“Only objects created by the Import will be remapped. In particular, the tablespaces for preexisting tables will not be remapped if TABLE_EXISTS_ACTION is set to SKIP, TRUNCATE, or APPEND.”。

仅仅是import创建的对象会被重新映射,如果使用了SKIP、TRUNCATE或APPEND,已存表对应的表空间不会有变化。

官方文档中对这个参数的描述如下:

这个参数目的是为了告诉impdp,试图创建的表是否在库中已存在。

默认值是skip,但若设置了CONTENT=DATA_ONLY,则默认值是APPEND,不是SKIP。

TABLE_EXISTS_ACTION=[SKIP | APPEND | TRUNCATE | REPLACE]

SKIP:跳过这张表,继续下一个对象。如果CONTENT设置了DATA_ONLY参数,则不能使用SKIP。

APPEND:会加载数据至对象,但不会影响已存在的行。

TRUNCATE:删除已存在的行,然后加载所有的数据。

REPLACE:drop已存在的表,然后create并加载数据。如果CONTENT设置了DATA_ONLY,则不能使用REPLACE。

还有一些其他的考虑:

1. 使用TRUNCATE或REPLACE,确保所有涉及的表行不会存在其他的参照约束关系。容易理解,例如目标表是和其他表存在外键关联,但只导入这张表,就可能会破坏这种关系。

2. 使用SKIP,APPEND,TRUNCATE,已存在表的依赖对象,例如索引、grants授权、触发器和约束,不会被修改。对于REPLACE,如果依赖对象未被显式或隐式使用EXCLUDE排除,并且存在于dump文件中,则会drop然后create重建。

3. 使用APPEND或TRUNCATE,会在执行操作前进行一些检查,以确保源dump和已存表兼容,包括:

(1) 若已存在的表有active的约束和触发器,就会使用外部表访问的方法加载数据。如果任何行违反了约束,则加载失败,不会有任何数据加载进来。当然,可以使用DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS来跳过这环节。

(2) 如果需要加载一些可能会违反约束的数据,可以考虑先disable这些约束,加载数据后,删除这些有问题的记录,然后再enable约束。

(3) 使用APPEND,数据会加载至新的空间,即使现有空间仍能重用。可以加载完成后,压缩数据。

另外,如果数据泵发现原表和目标表不匹配(例如两张表的列数量不同,或者目标表中有一列不在原表中),他会比较两张表的列名。如果两张表至少有一个列相同,则会导入这个列的数据(前提是数据类型兼容)。这种做法也有一些限制,

(a) 如果使用network参数导入则不能使用。

(b) 以下列的类型不能删除:列对象、列属性、嵌套表列、基于主键的引用列。

还有就是TRUNCATE不能用于聚簇表。

在使用 `IMPDP`(Oracle Data Pump Import),`TABLE_EXISTS_ACTION` 参数用于指定当目标表已经存在于数据库中所采取的动作。这个参数非常重要,因为它直接影响数据导入的方式和结果的一致性。以下是该参数的具体选项及其含义: ### TABLE_EXISTS_ACTION 的可用值 1. **SKIP**: 如果目标表已存在,则跳过对该表的所有操作。这意味着现有表的内容保持不变,并且不会从转储文件加载新记录。 2. **APPEND**: 若表已经存在,则将新的数据追加到现有的表中。原有数据保留不动,新增的数据会被插入进来。这是最常见的选择之一,尤其是在增量备份恢复场景中非常有用。 3. **TRUNCATE**: 先清空现有表中的所有内容后再开始导入工作。这会删除原有的全部行,只留下结构定义,然后再填充来自`.dmp` 文件的新数据。注意,此动作还会重置高水位标记(HWM),可能会释放一些空间但也会影响性能优化策略。 4. **REPLACE**: 删除旧有的表并重建它。这种方法最为彻底——先丢弃当前的对象(包括索引等约束条件),再按照转储文件里的元数据重新建立相同的对象并将数据填进去。这样做虽然能够确保最终得到的是最新版本的信息,但可能导致长间运行以及潜在的应用层兼容性问题。 ### 示例用法 假设我们有一个名为`my_table.dmp`的dump文件想要导入到数据库里,并希望覆盖掉同名的老表格,那么可以在命令行里面加上相应的设置: ```bash impdp username/password@database DIRECTORY=dump_dir DUMPFILE=my_table.dmp TABLES=SCHEMA.MY_TABLE TABLE_EXISTS_ACTION=REPLACE LOGFILE=import.log ``` 上述例子选择了 REPLACE 方式来进行全量更新。 ### 注意事项 - 使用 TRUNCATE 或 REPLACE 可能会导致依赖这些表的应用程序暂无法正常运作,所以在生产环境中实施这类变更之前一定要谨慎评估影响范围并且做好充分准备; - APPEND 和 SKIP 则相对安全些,它们不会改变已有数据的状态,因此风险较小,但在某些特定业务逻辑下仍需小心对待以免造成意外后果;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值