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中国
作者
相关推荐
-
甲骨文自治数据库亮相 带来云计算新希望
早前甲骨文还不在云计算公司之列,而现在该公司正在迅速弥补其失去的时间。甲骨文的云计算核心是甲骨文自治数据库(O […]
-
2017年12月数据库流行度排行榜 定格岁末排名瞬间
数据库知识网站DB-engines最近更新的2017年12月份数据库流行度排名情况是否能提供更多的看点呢?TechTarget数据库网站将与您分享12月份的榜单排名情况,让我们拭目以待。
-
2017年11月数据库流行度排行榜 半数以上数据库积分减少
数据库知识网站DB-engines更新了2016年11月份的数据库流行度排行榜。TechTarget数据库网站将与您一同关注11月份的榜单排名情况。
-
控制合约 不再畏惧Oracle
许多公司都与Oracle有无限制授权协议,他们害怕离开这个协议,所以就证明他们在使用Oracle的软件,即使因为需求单独购买部分授权许可也可能总体是省钱的。