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

![[附源码]Nodejs计算机毕业设计基于社区人员管理系统Express(程序+LW)](https://img-blog.csdnimg.cn/68b5707b3b674272844e3cb4ff4d5819.png)

![[go]分布式系统之snowflake与锁](https://img-blog.csdnimg.cn/c0e566cdad434679a6643237e9488009.png#pic_center)




![[附源码]Node.js计算机毕业设计孤儿院救助平台Express](https://img-blog.csdnimg.cn/f1c57db5c77048ca941617a082e60b28.png)









