数据泵导入SKIP_CONSTRAINT_ERRORS的bug(一)

日期: 2008-10-21 作者:杨廷琨 来源:TechTarget中国 英文

Oracle11g的数据泵新增了一个DATA_OPTIONS选项,目前只有一个参数SKIP_CONSTRAINT_ERRORS。利用这个参数可以在导入数据的时候,忽略掉违反约束的数据,而使得其他正常的数据顺利的导入。

但是在11g中,这个参数还存在bug,下面通过一个例子进行说明。

SQL> CREATE TABLE T_CONS (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> INSERT INTO T_CONS SELECT ROWNUM, TNAME FROM TAB;

已创建17行。

SQL> COMMIT;

提交完成。


SQL> HOST expdp yangtk/yangtk directory=d_output dumpfile=t_cons.dp tables=t_cons
Export: Release 11.1.0.6.0 – 64bit Production on 星期一, 13 10月, 2008 8:12:45
Copyright (c) 2003, 2007, Oracle. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options启动 “YANGTK”.”SYS_EXPORT_TABLE_01″: yangtk/******** directory=d_output dumpfile=t_cons.dp tables=t_cons 正在使用 BLOCKS 方法进行估计…处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA使用 BLOCKS 方法的总估计: 192 KB处理对象类型 TABLE_EXPORT/TABLE/TABLE处理对象类型 TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
. . 导出了 “YANGTK”.”T_CONS” 5.648 KB 17 行已成功加载/卸载了主表 “YANGTK”.”SYS_EXPORT_TABLE_01″ 
******************************************************************************
YANGTK.SYS_EXPORT_TABLE_01 的转储文件集为:
/export/home/oracle/t_cons.dp作业 “YANGTK”.”SYS_EXPORT_TABLE_01″ 已于 08:13:05 成功完成

创建了一个带主键的表,并插入了一些记录。并利用expdp对这个表进行了导出操作。

SQL> DELETE T_CONS WHERE ID < 10;

已删除9行。

SQL> COMMIT;

提交完成。


SQL> HOST impdp yangtk/yangtk directory=d_output dumpfile=t_cons.dp content=data_only data_options=skip_constraint_errors
Import: Release 11.1.0.6.0 – 64bit Production on 星期一, 13 10月, 2008 8:17:52
Copyright (c) 2003, 2007, Oracle. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options已成功加载/卸载了主表 “YANGTK”.”SYS_IMPORT_FULL_01″ 启动 “YANGTK”.”SYS_IMPORT_FULL_01″: yangtk/******** directory=d_output dumpfile=t_cons.dp content=data_only data_options=skip_constraint_errors 处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
. . 导入的 “YANGTK”.”T_CONS” 5.648 KB 9 用完了 17 行
8 行因以下错误而被拒绝:
ORA-00001: 违反唯一约束条件 (YANGTK.SYS_C0023309)

带主键的被拒绝行是:

拒绝的行 #1:

列 ID: 10

拒绝的行 #2:

列 ID: 11

拒绝的行 #3:

列 ID: 12

拒绝的行 #4:

列 ID: 13

拒绝的行 #5:

列 ID: 14

拒绝的行 #6:

列 ID: 15

拒绝的行 #7:

列 ID: 16

拒绝的行 #8:

列 ID: 17作业 “YANGTK”.”SYS_IMPORT_FULL_01″ 已于 08:17:58 成功完成

可以看到DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS已经起到了作用,这时导入忽略掉重复的数据,而将表中不存在的数据导入到表中。

下面修改一下表结构,将主键删除,手工建立一个非唯一索引,然后添加主键:

SQL> ALTER TABLE T_CONS DROP PRIMARY KEY;

表已更改。

SQL> CREATE INDEX IND_T_CONS_ID ON T_CONS(ID);

索引已创建。

SQL> ALTER TABLE T_CONS ADD CONSTRAINT PK_T_CONS PRIMARY KEY (ID);

表已更改。

SQL> DELETE T_CONS WHERE ID < 10;

已删除9行。

SQL> COMMIT;

提交完成。


SQL> HOST impdp yangtk/yangtk directory=d_output dumpfile=t_cons.dp content=data_only data_options=skip_constraint_errors
Import: Release 11.1.0.6.0 – 64bit Production on 星期二, 14 10月, 2008 1:33:24
Copyright (c) 2003, 2007, Oracle. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options已成功加载/卸载了主表 “YANGTK”.”SYS_IMPORT_FULL_01″ 启动 “YANGTK”.”SYS_IMPORT_FULL_01″: yangtk/******** directory=d_output dumpfile=t_cons.dp content=data_only data_options=skip_constraint_errors 处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
ORA-31693: 表数据对象 “YANGTK”.”T_CONS” 无法加载/卸载并且被跳过, 错误如下:
ORA-00001: 违反唯一约束条件 (YANGTK.PK_T_CONS)作业 “YANGTK”.”SYS_IMPORT_FULL_01″ 已经完成, 但是有 1 个错误 (于 01:33:30 完成)
只是将系统自动产生的索引改为非唯一索引,就导致了SKIP_CONSTRAINT_ERRORS参数无效。

下面再次修改表结果,尝试将非唯一索引改为唯一索引:

SQL> ALTER TABLE T_CONS DROP PRIMARY KEY;

表已更改。

SQL> DROP INDEX IND_T_CONS_ID;

索引已删除。

SQL> CREATE UNIQUE INDEX IND_T_CONS_ID ON T_CONS(ID);

索引已创建。

SQL> ALTER TABLE T_CONS ADD CONSTRAINT PK_T_CONS PRIMARY KEY (ID);

表已更改。


SQL> HOST impdp yangtk/yangtk directory=d_output dumpfile=t_cons.dp content=data_only data_options=skip_constraint_errors
Import: Release 11.1.0.6.0 – 64bit Production on 星期二, 14 10月, 2008 1:38:03
Copyright (c) 2003, 2007, Oracle. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options已成功加载/卸载了主表 “YANGTK”.”SYS_IMPORT_FULL_01″ 启动 “YANGTK”.”SYS_IMPORT_FULL_01″: yangtk/******** directory=d_output dumpfile=t_cons.dp content=data_only data_options=skip_constraint_errors 处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
. . 导入的 “YANGTK”.”T_CONS” 5.648 KB 9 用完了 17 行
8 行因以下错误而被拒绝:

ORA-00001: 违反唯一约束条件 (YANGTK.PK_T_CONS)

带主键的被拒绝行是:

拒绝的行 #1:

列 ID: 10

拒绝的行 #2:

列 ID: 11

拒绝的行 #3:

列 ID: 12

拒绝的行 #4:

列 ID: 13

拒绝的行 #5:

列 ID: 14

拒绝的行 #6:

列 ID: 15

拒绝的行 #7:

列 ID: 16

拒绝的行 #8:

列 ID: 17作业 “YANGTK”.”SYS_IMPORT_FULL_01″ 已于 01:38:09 成功完成
看来问题与索引是否是Oracle自动生成的没有关系,而与索引类型是唯一索引还是非唯一索引有关。
下面创建只创建一个唯一索引,不在添加主键:
SQL> ALTER TABLE T_CONS DROP PRIMARY KEY;
表已更改。
SQL> SELECT INDEX_NAME, UNIQUENESS FROM USER_INDEXES WHERE TABLE_NAME = ‘T_CONS’;
INDEX_NAME UNIQUENESS
———————————————————— ——————
IND_T_CONS_ID UNIQUE
SQL> DELETE T_CONS WHERE ID < 10;

已删除9行。

SQL> COMMIT;

提交完成。

以下是引用片段:
SQL> HOST impdp yangtk/yangtk directory=d_output dumpfile=t_cons.dp content=data_only data_options=skip_constraint_errors
Import: Release 11.1.0.6.0 – 64bit Production on 星期二, 14 10月, 2008 1:53:15
Copyright (c) 2003, 2007, Oracle. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options已成功加载/卸载了主表 “YANGTK”.”SYS_IMPORT_FULL_01″ 启动 “YANGTK”.”SYS_IMPORT_FULL_01″: yangtk/******** directory=d_output dumpfile=t_cons.dp content=data_only data_options=skip_constraint_errors 处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
. . 导入的 “YANGTK”.”T_CONS” 5.648 KB 9 用完了 17 行
8 行因以下错误而被拒绝:

ORA-00001: 违反唯一约束条件 (YANGTK.IND_T_CONS_ID)

作业 “YANGTK”.”SYS_IMPORT_FULL_01″ 已于 01:53:21 成功完成
虽然错误信息和有主键时不一致,但是数据是可以导出的,从这里也可以看到,Oracle在导入的时候不是看主键约束信息,而是看索引是否是唯一索引。

且不论Oracle如何实现这个功能,不过根据文档描述,可是看不到这个说明的,而且DATA_OPTIONS的参数名称为SKIP_CONSTRAINT_ERRORS也可以说明问题,这里应该是CONSTRANT,而不是INDEX。这里暂时认为是Oracle的实现上的小bug吧。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐