Oracle迁移分区踩的坑

之前用数据泵来来回回也用了不少次,自以为对数据泵了解还ok的时候,昨天却惨遭打脸...

很简单的业务需求,表A和表B是具有相同表结构的,且分区结构都相同的两个表,旨在将表 A 中 a 分区迁移到表 B 中 b 分区中。

由于表 A 为测试表,表 A 的分区数量只有两个,在导出dmp的时候,直接指定 A 用户下的表 A 的 a 分区 进行导出,然后...在导入得时候就发现很奇葩的问题,按照之前的经验,SQL并无问题,

impdp icds/*** directory  = data1 dumpfile=***.DMP tables=icds_smp_trade_record:sys8441 table_exists_action=append

一直抛这样的问题

Oracle迁移分区踩的坑

注意红线中的sys_p8441是表B的b分区,表B中b分区是存在的。

查了很多资料,最后在metalink找到了一些思路。

Oracle迁移分区踩的坑

SOLUTION 2中发现该SQL中 TABLES=old.user.TABLEA:TABLE_PARITION1 

导入的时候指定表A的a分区。

于是将导入SQL优化为:

Oracle迁移分区踩的坑

这里简单解释一下参数的作用:

remap_schema=icds:icds  ==》 将A用户中的数据迁移到B用户中

TABLE_EXISTS_ACTION=append ==》 导入数据追加到原数据中

DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS  ==>  跳过序列化ID

至此。坑已填平...

不过,在昨日翻阅资料发现另一个有意思的参数,只不过这次填坑没有用到。这里还是介绍一下。

 

PARTITION_OPTIONS 参数控制数据泵分区表的导入。

从取值上看,PARTITION_OPTIONS参数包括三个可选值,DepatitionMergeNone,用于指定导入分区表的转换方式。

介绍一下,这三个可选值的实际含义:

 

默认情况下,该参数取值为NONE,表示不进行任何转换,如果是分区数据表,导入之后依然为分区数据表。

Departtion为分表操作,也就是将每个分区作为一个独立的数据表进行导入,导入之后可见与原数据表分区对应的数据表集合。

Merge参数是取消分区设置,将数据导入到一个非分区表的转换动作。

 

PARTITION_OPTIONS是11g数据泵提出的新功能选项,在一些特殊场景下,可以方便帮助我们解决实际问题。从本质上看,这部分转换应该是元数据导入过程中进行的转换转化。这样提供了一定的灵活性。

 

欢迎关注微信公众号,“珏衫的博客”Oracle迁移分区踩的坑

交流QQ群:Oracle迁移分区踩的坑