当前位置: 代码迷 >> Sql Server >> 没有足够的内存储器来运行此查询
  详细解决方案

没有足够的内存储器来运行此查询

热度:6   发布时间:2016-04-24 18:34:10.0
没有足够的内存来运行此查询
服务器:三台服务器做的数据库镜像,带自动故障转移,见证服务器的配置就不贴了。


数据库:数据库都是 SQL Server 2008,版本号 10.0.4000.0。

现在的问题是:最近一段时间不定期出现数据库无法访问的情况,平均一个月出现1-2次,以前稳定运行1年都没什么问题。

出现问题后具体表现:




错误日志:
EXEC xp_readerrorlog 1,1,Null,Null,'20131231 10:20','20131231 10:25','Asc'
--------------------------------------------------------
2013-12-31 10:20:00.190 服务器 Error: 17312, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.
2013-12-31 10:20:00.190 服务器 Error: 17053, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.
2013-12-31 10:20:00.200 spid42s Error: 701, Severity: 17, State: 123.
2013-12-31 10:20:00.200 spid42s There is insufficient system memory in resource pool 'internal' to run this query.
2013-12-31 10:20:00.200 spid42s Error: 9642, Severity: 16, State: 4. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.
2013-12-31 10:20:00.230 服务器 Error: 17300, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.
2013-12-31 10:20:00.230 服务器 Error: 17312, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.
2013-12-31 10:20:00.230 服务器 Error: 17053, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.
--未完:日志内容比较多,回复里面再继续贴


在网上找到了这样一段话,我想可能和这个有关:
SQL Server尤其是32位的SQL Server对不同种类的内存的申请大小是不一样的,对Commit、Stolen和MemTOLeave等类型的内存是有限制的。因此会出现系统中还有空闲内存,但是SQL Server不会申请使用的现象。

头疼了比较久,一直也没能解决,网上也找到了一些解决办法,但还没有尝试:
1、升级新版本或者补丁;
2、使用现有服务器并开启AWE;
3、设置SQL Server Max Server Memory;
4、给SQL Server 启动账号赋予Lock Pages in memory权限;
5、禁用“set working set size”;
6、升级硬件驱动;
7、使用64位服务器和数据库。

数据库还有许多客户正在用,没找到问题根源,也不敢有大的改动。
而且问题不易重现,改动之后效果如何验证也是个问题。

跪求指点迷津。
------解决方案--------------------
引用:

求指点,指指点点也行。


你的系统是32位的,那么整个系统最多只能用4G的内存,而分配到sql server的就更少了,那么就很有可能导致没有足够的内存来运行此查询的错误。

但是直接升级到64位,可能不一定能马上施行,这个时候,建议开启awe选项:


设置SQL Server数据库AWE机制使其支持大内存
http://database.51cto.com/art/201108/285703.htm
------解决方案--------------------
升64位是正道,也是最简单的
否则加大MEM TO LEAVE内存大小
------解决方案--------------------
这个问题要看几个关键的信息。
1,“Failed allocate pages: FAIL_PAGE_ALLOCATION 1”
2, “MEMORYCLERK_SQLUTILITIES (node 0)  ... SinglePage Allocator    1481200"

上面第一条信息FAIL_PAGE_ALLOCATION 1,说明是SinglePage Allocator 的失败,
而第二条信息更是证明了由于镜像(MEMORYCLERK_SQLUTILITIES 就说明是镜像造成的)分配的过多的Single Page,造成了SinglePage的不足,这个时候加大MTL的大小应该不会起作用。

建议就是升级为64位OS。
------解决方案--------------------
没见过镜像出过这类问题,不过试过一些查询出类似的报错,优化查询即可,但是既然是镜像的报错,可能只能提升硬件,这些自带功能很难干预
------解决方案--------------------
查看你的服务器是否运行超过500天,如果超过500天请重启服务器
如果你的业务很繁忙,请把超过300天的服务器也重启。这是因为系统缓存不足,一些资源没有释放。
这是微软服务器的一个BUG(请允许这样说)。起码超过500天就会出现无法访问数据库的情况。