上一篇描述了唯一索引对SKIP_CONSTRAINT_ERRORS的影响,这里通过讨论外键约束的情况将问题进一步深入。
还是利用第一篇文章中的例子,来看一下外键约束的情况:
SQL> CREATE TABLE T_PRI (ID NUMBER);
表已创建。
SQL> INSERT INTO T_PRI SELECT ROWNUM * 2 FROM TAB;
已创建22行。
SQL> COMMIT;
提交完成。
SQL> ALTER TABLE T_PRI ADD PRIMARY KEY (ID);
表已更改。
SQL> DELETE T_CONS WHERE MOD(ID, 2) = 1;
已删除5行。
SQL> COMMIT;
提交完成。
SQL> ALTER TABLE T_CONS ADD CONSTRAINT FK_T_CONS_ID FOREIGN KEY (ID) REFERENCES T_PRI; 表已更改。 SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME = ‘T_CONS’; CONSTRAINT_NAME CO ———————————————————— — CK_T_CONS_ID C FK_T_CONS_ID R SQL> ALTER TABLE T_CONS DROP CONSTRAINT CK_T_CONS_ID; |
表已更改。
SQL> DROP INDEX IND_T_CONS_NAME;
索引已删除。
SQL> CREATE INDEX IND_T_CONS_ID ON T_CONS(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 星期四, 16 10月, 2008 1:24: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_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 8 用完了 17 行 9 行因以下错误而被拒绝: |
ORA-02291: 违反完整约束条件 (YANGTK.FK_T_CONS_ID) – 未找到父项关键字。
作业 “YANGTK”.”SYS_IMPORT_FULL_01″ 已于 01:24:51 成功完成。
上面建立了一张主表,并建立了主键,然后去掉了T_CONS上面的唯一索引和CHECK约束,建立外键,并建立了一个普通的索引。
根据上一篇文章的测试,如果确实主键,SKIP_CONSTRANT_ERRORS将不起作用,可是这里确发现,SKIP_CONSTRAINT_ERRORS参数生效了。
看来唯一索引只是一个SKIP_CONSTRAINT_ERRORS生效的一个因素而已,而外键似乎也可以使这个参数生效。
而这两个条件,恰好是不使用直接路径加载,采用外部表方式导入的条件。Oracle的文档是这样描述的:
Situations in Which Direct Path Load Is Not Used
If any of the following conditions exist for a table, Data Pump uses external tables rather than direct path to load the data for that table:
■ A global index on multipartition tables exists during a single-partition load. This includes object tables that are partitioned.
■ A domain index exists for a LOB column.
■ A table is in a cluster.
■ There is an active trigger on a pre-existing table.
■ Fine-grained access control is enabled in insert mode on a pre-existing table.
■ A table contains BFILE columns or columns of opaque types.
■ A referential integrity constraint is present on a pre-existing table.
■ A table contains VARRAY columns with an embedded opaque type.
■ The table has encrypted columns
■ The table into which data is being imported is a pre-existing table and at least one of the following conditions exists:
– There is an active trigger
– The table is partitioned
– Fine-grained access control is in insert mode
– A referential integrity constraint exists
– A unique index exists
■ Supplemental logging is enabled and the table has at least one LOB column.
■ The Data Pump command for the specified table used the QUERY, SAMPLE, or REMAP_DATA parameter.
文档描述的十分清晰,对于表已经存在的情况,当表包含活动触发器、表为分区表、细粒度存储控制插入模式、参考完整性约束以及唯一索引存在等五个条件,会导入加载使用外部表方式。
那么现在其实已经很明确了,这个参数对于直接路径导入无效,而只在外部表导入时生效。
最后再验证一下:
SQL> ALTER TABLE T_CONS DROP CONSTRAINT FK_T_CONS_ID;
表已更改。
SQL> TRUNCATE TABLE T_CONS;
表被截断。
SQL> ALTER TABLE T_CONS ADD PRIMARY KEY (ID);
表已更改。
SQL> INSERT INTO T_CONS SELECT ROWNUM, TNAME FROM TAB WHERE ROWNUM < 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 星期四, 16 10月, 2008 1:54: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 |
ORA-31693: 表数据对象 “YANGTK”.”T_CONS” 无法加载/卸载并且被跳过, 错误如下:
ORA-00001: 违反唯一约束条件 (YANGTK.SYS_C0023723)作业 “YANGTK”.”SYS_IMPORT_FULL_01″ 已经完成, 但是有 1 个错误 (于 01:54:08 完成)
由于没有外键和唯一索引,采用直接路径导入,因此SKIP_CONSTRAINT_ERRORS参数无效,下面添加一个触发器:
SQL> CREATE OR REPLACE TRIGGER T_T_CONS BEFORE INSERT ON T_CONS 2 BEGIN 3 NULL; 4 END; 5 / |
触发器已创建
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 星期四, 16 10月, 2008 1:58:54 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 8 用完了 17 行 |
9 行因以下错误而被拒绝:
ORA-00001: 违反唯一约束条件 (YANGTK.SYS_C0023723)
带主键的被拒绝行是:
拒绝的行 #1:
列 ID: 1
拒绝的行 #2:
列 ID: 2
拒绝的行 #3:
列 ID: 3
拒绝的行 #4:
列 ID: 4
拒绝的行 #5:
列 ID: 5
拒绝的行 #6:
列 ID: 6
拒绝的行 #7:
列 ID: 7
拒绝的行 #8:
列 ID: 8
拒绝的行 #9:
列 ID: 9作业 “YANGTK”.”SYS_IMPORT_FULL_01″ 已于 01:59:00 成功完成。
现在已经可以确定,在直接路径导入过程中,DATA_OPTIONS参数无效。其实在文档中Oracle还是进行了说明:
Restrictions If SKIP_CONSTRAINT_ERRORS is used and if a data object has unique indexes or constraints defined on it at the time of the load, then the APPEND hint will not be used for loading that data object. Therefore, loading such data objects will take longer when the SKIP_CONSTRAINT_ERRORS option is used. Even if SKIP_CONSTRAINT_ERRORS is specified, it is not used unless a data object is being loaded using the external table access method. |
只不过开始没有注意到这里,而是将注意力放在了唯一索引处。从这个意义上将,这个问题不是bug,而是Oracle的实现方式。
不过个人仍然认为,既然设计了这个参数,且用户指定了这个参数,数据泵就应该放弃直接路径导入。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
DBA在使用SQL语句时需要注意的问题
Michael McLaughlin是Oracle 11g和MySQL 5.6开发者指南的作者,他在书中为Oracle数据库开发者提供了一些建议与帮助。
-
Oracle数据库不同版本的硬件需求
每个企业的IT环境都是不同的,这些环境中可能会包含虚拟服务器、各种网络操作系统、基于云计算的服务、SAN等等,根据应用场景选择硬件是基本的准则。
-
Oracle 11g SQL性能分析器技术指南
当今信息时代要求企业的IT系统能够始终保证系统的性能并且提供更高的服务质量,我们的IT系统经常要面对应用程序升级、硬件更新、数据库升级、对象结构变更等导致SQL性能下降的问题。
-
Oracle 11g SecureFile技术详解手册
SecureFile不仅是新一代 LOB,它们还为 LOB 带来了更多的价值,尤其是以前只能在文件系统领域中获得的特性。