Oracle Data Pump导入过慢求助(排除补丁/升级方案)
针对Oracle Data Pump导入含XML列表慢(Bug 19520061)的替代优化方案
方案1:拆分该表的导出导入流程
- 单独导出
ASSISTANT.ASSIST_NODES_METADATA表,使用传统导出工具exp(不受该Bug对XML列的并行限制影响) - 导入时采用SQL*Loader批量加载:
- 从源库将表数据导出为适配的文本格式(注意对XML列做转义处理)
- 编写SQL*Loader控制文件,开启并行加载(
PARALLEL=true),直接加载到目标表
方案2:调整Data Pump导入参数规避Bug
- 对该表采用分批并行导入,结合
QUERY参数拆分数据范围,同时禁用归档日志减少开销:
多次执行该命令并调整impdp user/pass@db schemas=ASSISTANT tables=ASSIST_NODES_METADATA parallel=8 TABLE_EXISTS_ACTION=APPEND QUERY="WHERE ROWNUM <= 100000" TRANSFORM=DISABLE_ARCHIVE_LOGGING:YQUERY的数值范围,实现分批导入;导入前需临时禁用表上的触发器、约束,完成后再启用 - 若仅针对该表,可单独指定
PARALLEL=8并搭配DIRECT_PATH=YES强制走直接路径(需确认表无LOB列之外的限制)
方案3:临时修改表结构绕过XML列限制
- 源库导出时排除
XML_DATA列:expdp user/pass@db tables=ASSISTANT.ASSIST_NODES_METADATA exclude=column:\"IN ('XML_DATA')\" - 将数据导入目标库的临时表(或修改原表删除
XML_DATA列后导入) - 单独从源库导出
XML_DATA列数据,用DBMS_PARALLEL_EXECUTE包并行插入:
注:需提前创建指向源库的数据库链接BEGIN DBMS_PARALLEL_EXECUTE.CREATE_TASK('INSERT_XML_TASK'); DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID('INSERT_XML_TASK', 'ASSISTANT', 'ASSIST_NODES_METADATA', 10000); DBMS_PARALLEL_EXECUTE.RUN_TASK('INSERT_XML_TASK', 'UPDATE ASSISTANT.ASSIST_NODES_METADATA t SET t.XML_DATA = (SELECT s.XML_DATA FROM SOURCE_LINK.ASSISTANT.ASSIST_NODES_METADATA s WHERE s.ROWID = t.ROWID) WHERE t.ROWID BETWEEN :start_id AND :end_id', DBMS_SQL.NATIVE, parallel_level => 8); DBMS_PARALLEL_EXECUTE.DROP_TASK('INSERT_XML_TASK'); END; /SOURCE_LINK
方案4:优化数据库层面单进程效率
- 临时调大
PGA_AGGREGATE_TARGET和SGA_TARGET参数,为XML列的解析、写入分配更多内存 - 禁用目标表的索引,导入完成后并行重建:
ALTER INDEX ASSISTANT.IDX_ASSIST_NODES_XML UNUSABLE; -- 导入完成后 ALTER INDEX ASSISTANT.IDX_ASSIST_NODES_XML REBUILD PARALLEL 8; - 临时禁用目标表的外键、检查约束,导入完成后重新启用
内容的提问来源于stack exchange,提问作者pedrodavila93
相关产品推荐
相关产品推荐

