Windows上Oracle VSS内存泄露故障处理

张勇,北京海天起点公司数据库管理员,Oracle一体机用户组成员,获有OCP证书,具有多年金融行业oracle, mysql数据库日常维护,故障排除,性能优化、数据迁移、容灾备份等方面的运营维护经验;具有丰富的数据库设计和架构搭建经验,擅长数据统计和分析,熟悉NoSql产品;
这个故障遇过几次了,印象中Oracle 11g数据库在 Windows的Server2012和2016版本上都有发生。

最直观的迹象就是虚拟内存页面文件因未限制大小导致其所在的磁盘(默认C盘)发生空间告警。如下图:


图上可知总分配60G容量的C盘发生空间警告,提示可用空间只剩余5G。

既然可用空间所剩无几,那就找一找被什么对象使用了。寻找大对象发现pagefile.sys文件占用最大,使用了41G,这个文件就是虚拟内存页面文件。

虚拟内存是硬盘上一块区域,被Windows当作RAM使用;虚拟内存过大,表示有进程一直在使用却不释放,程序很可能发生了内存泄漏。内存泄漏一般系统会有提醒,登录事务管理器,找找有没相关的警告和错误事件:

事件管理器提示很明显:Oracle.VSSWrite.Oracle程序发生错误,心里有数了遇到老故障,这是一个Oracle Bug。

下一步就好办了,登录Oracle MOS输入关键字并选定Windows平台,搜索相关内容:

第一个搜索到的就是我们想要的结果,进入详细页:

Oracle认为在12.2版本以下会受到此Bug的影响,VSS程序将发生内存漏泄,同时11.2.0.4是被确认的故障版本,解决方案是打上Patch 16 的补丁。

因为VSS Writer泄漏内存是在对卷映射进行拷贝时发生,所以文章上提示的变通方法是不定期的重启VSS 服务,来即时释放内存。需要反复的人为干预,感觉不好;卷拷贝和数据库正常运行有什么关系,可不可以不要它? VSSWrite服务:卷映射拷贝写入服务,用来支持VSS的应用程序使其可以在线对数据库进行备份和恢复,因为我们生产上数据库备份和恢复使用的其它方式,不走这个功能,那就用不上了。最后商榷下来直接关掉此服务,并且改成手动开启模式,可以观察到虚拟内存页面文件的大小立刻就下来了,磁盘告警消失。当然如果程序要使用此服务,还是打上补丁一劳永逸的好。

Oracle常见内存泄漏相关参考:

Bug 19835650 – Windows: VSS oravssw.exe memory leak (文档 ID 19835650.8)

Bug 14245094 : CVU HEALTH CHECKS EXHAUST WINDOWS HEAP MEMORY

ODP.NET: Memory Leak While Using TIMESTAMP Column With Descriptor Based Types (文档 ID 2384364.1)

未经允许不得转载:Oracle一体机用户组 » Windows上Oracle VSS内存泄露故障处理

相关推荐