关于DataPump工具引发OGG中断原因
一、问题描述
根据业务需求,备份某表中一行数据,在执行完该备份命令后,造成OGG中断,造成中断语句如下:
ORA-06564: object DIR_DP does not exist SQL CREATE TABLE XXX."ET$017DB8C30001" ( "ID", ..........--此处省略其他列信息 "ROLE" ) ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY DMP_TEST ACCESS PARAMETERS (DEBUG =0 DATAPUMP INTERNAL TABLE "FIRSOUL"."TEST" JOB ( "FIRSOUL","FIRSOUL_TEST12301",1) WORKERID 1 PARALLEL 1 VERSION COMPATIBLE ENCRYPTPASSWORDISNULL ) LOCATION ('bogus.dat') ) PARALLEL 1 REJECT LIMIT UNLIMITED AS SELECT "ID", ...... "ROLE" FROM RELATIONAL("FIRSOUL"."TEST" ) KU$ where id=20141230; |
从以上信息可以看出,在执行expdp时,Oracle数据库以创建外部表的方式导出数据,在创建外部表时,会指定一个目录(DIRECTORY),由于OGG目标端没有该目录造成此语句执行失败。此前一直使用expdp工具做相关备份、导出数据,并未发现此问题,问题出现后,在测试系统上分析引发该问题原因。
二、 问题分析过程
导出语句如下:
---全表导出语句
expdp
firsoul/firsoul DIRECTORY=dmp_test tables=test DUMPFILE=firsoul_table04.dmp
logfile=exp_firsoul_table03.log |
此次导出,先执行一次全表导出,而后执行的导出表中一行数据,数据库中创建外部表语句是在执行第二条语句后出现的。
查看相关资料,得知,DataPump可以通过直接路径和外部表路径这两种方法导出数据。
1)直接路径方式避开了数据库高速缓存,当使用直接路径模式抽取数据时,DataPump从磁盘直接读取数据文件,抽取和格式化文件内容,最后将内容写出的转储文件。该种方式和SGA交互等待少,其导入导出速度直接取决于数据库所在磁盘速度和cpu,因此,直接路径极为快速。
2)外部表路径模式将使用到数据库的告诉缓存buffer
cache,通过外部表路径方式导出数据时,DataPump使用普通的SELECT操作将数据块从数据文件中读入BUFFER CACHE,为了写出转储文件,数据会在存储中备格式化。通过外部表路径导入时,DataPump根据转储文件的内容构造标准的插入语句,并且通过将数据块从数据文件读至缓存来执行这些语句,插入操作按照标准的样式在缓存中完成,如同普通DML操作一样,外部表路径也会同时产生撤销和重做。
DataPump工具会根据对象的复杂性自动选择使用直接路径还是外部表路径方式,对于复杂的对象,为了分解复杂性而必须同SGA进行交互,此情况下DataPump只能采用外部表模式。我们可以通过access_method参数来控制其行为。例如一下语句
[oracle@firsoul backup]$ expdp firsoul/firsoul DIRECTORY=dmp_test tables=t_pic_edit query=t_pic_edit:"where id=20141230" DUMPFILE=firsoul_table07.dmp logfile=exp_firsoul_table07.log access_method=direct_path
Export: Release 11.2.0.3.0 - Production on Wed Dec 31 11:10:10 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options ORA-39001: invalid argument value ORA-39033: Data cannot be filtered under the direct path access method. |
如以上信息得知,我们无法使用直接路径导出数据,也就是当expdp导出语句中存在参数query时,无法使用直接路径方式,即使我们通过access_method参数指定,DataPump也会报错。
注意事项:在做DataPump相关操作时,建议添加access_method参数,尤其在配有OGG、DG等灾备工具的系统上,以免出现创建外部表语句造成OGG、DG等灾备工具中断。
三、关于Datapump选择导出方式参考(参考文章:http://www.askmaclean.com/archives/%e5%85%b3%e4%ba%8edatapump%e7%9a%84external_table%e6%a8%a1%e5%bc%8f.html)
若满足右列条件EXPDP将采用direct_path即直接路径模式 |
表结构允许使用直接路径模式,举例而言: 表上没有启用针对SELECT操作的fine-grained access control 非队列表(queue table) 表上没有BFILE和opaque类型的列,或包含有opaque列的对象类型 表上没有加密列 表上没有被废弃的旧类型列
若表上存在LONG或LONG RAW类型列,则此列只能是最后一列 需要导出的表或分区相对较少(多达250M),亦或者表或分区其实很大,但导出任务无法工作在并行模式(未指定parallel参数,或parallel参数设置为1) |
若满足右列条件EXPDP将采用external_table即外部表模式 |
数据结构不满足在直接路径模式下抽取的条件,举例而言: 表上启用了针对SELECT操作的精细粒度控制 队列表 表上包含了BFILE或opaque类型列,或者包含有opaque列的对象类型 表上存在加密列 表上存在被废弃的旧类型列 表上存在LONG或LONG RAW类型列,且不是最后列 数据结构满足使用直接路径模式的条件,但执行导出任务时相关表上指定了QUERY, SAMPLE, or REMAP_DATA等参数 数据结构满足使用直接路径模式的条件,但相关的表或分区相对较大(大于250M),此时并行SQL可以用来加速数据抽取 |
若满足右列条件IMPDP将采用direct_path即直接路径模式 |
数据结构满足使用直接路径模式的条件,举例而言: 当导入某单一表分区时该分区表上没有建立全局索引,这一点也包括分区的对象表 没有基于LOB列建立的域索引(domain index) 非cluster表 表上没有BFILE列或opaque类型列 表上没有嵌入了opaque类型的VARRAY列 表上没有加密列 没有启用补全日志(Supplemental logging)且表上没有LOB类型列 若导入表已预先建立了表建构,则需满足以下条件: 表上没有激活的触发器 并且 若是分区表则应有索引 并且 表上上没有启用针对INSERT操作的精细粒度控制 并且 表上除去check类型约束不存在其他类型约束 并且 表上没有unique的索引 执行导入任务时没有为相关表指定QUERY, REMAP_DATA等参数 需要导入的表或分区相对较小(少于250M),或者表或分区其实很大,但无法以并行模式导入(未指定parallel参数或指定其为1) |
若满足右列条件IMPDP将采用external_table即外部表路径 |
当数据结构不满足在直接路径模式下导入的条件,举例而言: 当导入某单一表分区时该分区表上建有全局索引,这一点也包括分区的对象表 表上有基于LOB列建立的域索引(domain index) cluster表 表上有BFILE列或opaque类型列 表上有嵌入了opaque类型的VARRAY列 表上有加密列 启用了补全日志且表上有至少一个LOB列 若导入表已预先建立了表建构,且满足以下条件: 表上有激活的触发器 或者 是分区表且没有任何索引 或者 表上启用了针对INSERT操作的精细粒度控制 或者 表上除去check类型约束还还有其他类型约束 或者 表上有unique的索引 执行导入任务时有为相关表指定QUERY, REMAP_DATA等参数 数据结构满足使用直接路径模式的条件,但相关的表或分区相对较大(大于250M),此时并行SQL可以用来加速数据导入 |
四、问题总结:
在执行第二条语句(导出表中某一行)时,由于语句复杂性(参数query),需要检索表中数据,进而必须与SGA进行交互,DataPump工具就会选择通过外部表方式导出数据,在导出时出现创建外部表语句,而造成OGG中断。如上述注意事项,在使用DataPump工具时,建议添加access_method参数(默认选择直接路径导出方式),当DataPump工具强行选择使用外部表方式导出时,DataPump语句会报错,以免造成OGG、DG等灾备工具中断及其他问题。