前言:

近期处理了一起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

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: