前言:
近期处理了一起expdp导出时间变长的问题,在数据量没有较大增长的情况下,expdp导出时间发生倍数增长,后面分析发现是由于Bug 27634991导致在AMM,ASMM模式下,由于streams pool内存抖动触发了内存收缩,内存收缩的过程中会堵塞stream pool内存池里面的操作,导致expdp导出时间变长。
版本:
Oracle版本:11.2.0.4
问题:
expdp导出时间变长,3月14号的备份数据为83.57GB ,时间6分钟
3 月15号的备份数据为83.86GB 时间为46分钟
问题原因:
Bug 27634991导致在AMM,ASMM模式下,由于streams pool内存抖动触发了内存收缩,内存收缩的过程中会堵塞stream pool内存池里面的操作,导致expdp导出时间变长。
问题分析:
查看数据库的alert日志,没有发现报错
查看expdp导出dm,dw进程的运行状态以及等待时间,期间出现大量的等待Streams AQ: enqueue blocked on low memory,stream pool队列操作出现等待
查看stream pool 的历史使用情况,在3月15号导出期间,stream pool 发生内存收缩,这说明expdp导出期间存在stream pool内存抖动的情况
在官方文档Bug 27634991 - Datapump Frequently Waits On 'Streams AQ: enqueue blocked on low memory' (Doc ID 27634991.8),我们查到了在Oracle11.2.0.4,12.1,12.2,18版本下,Bug 27634991会导致在AMM,ASMM模式下,由于streams pool内存抖动触发进行内存收缩,内存收缩的过程中会堵塞stream pool内存池里面的操作,导致expdp导出时间变长
可以通过查询查stream pool 是否存在收缩状态,来确认是否遇到该问题
select shrink_phase_knlasg from X$KNLASG;
“1”。该值表示 streams pool 处于收缩阶段。当 streams pool 完成收缩时,该值应返回”0”,
但如果它一直返回”1”,则您可能遇到此问题。
查询当前的stream pool 收缩状态为1,结合当前数据库的版本11.2.0.4以及发生的现象,我们可以确认问题命中了Bug 27634991,在AMM,ASMM模式下,由于streams pool内存抖动触发了内存收缩,内存收缩的过程中会堵塞stream pool内存池里面的操作,导致expdp导出时间变长。
问题修复:
1 应用补丁27634991,修复bug问题
2 手动强制完成stream pool 内存池空间收缩,临时规避该问题
alter system set events 'immediate trace name mman_create_def_request level 6';
3 调整stream pool的大小避免出现内存抖动,将内存256M调整为512M