当前位置: 代码迷 >> Sql Server >> sql server数据库内存持续增长,几小时后就死机解决方案
  详细解决方案

sql server数据库内存持续增长,几小时后就死机解决方案

热度:77   发布时间:2016-04-24 09:12:40.0
sql server数据库内存持续增长,几小时后就死机
之前一直运行正常的数据库
最近两天就连续出现上述情况
有一次间隔4小时,就导致应用程序连接数据库断开,然后过几小时,数据库所在机器远程也连不上了 

请问可以从那些方面查找问题所在
------解决思路----------------------
内存没有释放,查看JOB\相关接口\程序连接是否有释放
------解决思路----------------------
引用:
Quote: 引用:

内存没有释放,查看JOB\相关接口\程序连接是否有释放


比如JOB怎么查看是否有释放?

--企业管理器里直接查看
查看JOB是否有耗时的调度

估计是程序连接没有释放
------解决思路----------------------
先从简单的来:
磁盘空间是否满了?
日志文件、数据文件是否满了?

排除后再用企业管理器,看还在活动的连接,当前在执行什么语句。具体分析。
------解决思路----------------------

这个问题,首先要明确,内存到底是 消耗在哪儿了,是 sql cache语句缓存,还是 buffer cache 数据缓存,还是其他的内存,比如连接,游标等。

然后才能解决问题
------解决思路----------------------
数据库服务器内存使用量持续增长有时是正常的,因为MSSQL会自动动态管理内存.

建议: 
1.之前一直运行正常,分析最近两天是否有做程序更新或上线新功能,
   检查其程序代码,是否有死循环和持续消耗内存的语句.

2.检查SQL Server最新的SP补丁是否有安装.如SQL2008R2 SP2等.

3.观察DMV视图sys.dm_os_memory_clerks,查看服务器内存使用情况.

4.检查SQL实例的内存设置,是否有限制其最大使用内存,可设为动态管理即可. 

5.检查数据库服务器windows上除了SQL实例,是否有其他应用程序消耗内存.
------解决思路----------------------
确认SQL2005 SP4补丁安装了没?
------解决思路----------------------
估计是过程缓存耗尽,数据缓存不会引发此故障,还得实际分析诊断,没法猜
------解决思路----------------------
1.先设置一下SQL Server的Maximum server memory,避免系统内存占满而失去响应。
2.在SQL Server的内存变得较高时,查看一下内存的分布情况:
SELECT * FROM sys.dm_os_performance_counters
WHERE object_name LIKE 'SQLServer:Buffer Manager%'
AND   counter_name IN ('Database pages', 'Free pages', 'Stolen pages', 'Total pages')
ORDER BY counter_name
3.如果Stolen pages的部分较高,查看一下sys.dm_os_memory_clerks视图,看看具体是哪个内存结构占用内存较多:
SELECT * FROM sys.dm_os_memory_clerks ORDER BY single_pages_kb + multi_pages_kb DESC
4.根据上述结果再进一步分析。我的环境是SQL Server 2008 R2,2005可能有些地方不同,但是大致思路是这样。
------解决思路----------------------
看看sql日志或者系统日志有什么提示。或者最近更改过什么。

1. 按楼上说,先在SQLserver的部分内存使用Maximum server memory

2. 确定是SQLserver占用的内存还是Windows应用程序其他占用内存。 这个可以打开性能计数器观察Memory和SQLServer:Memory Manager对比,可以让它持续跟踪保存下来,发生后再打开看看。

3. 发生时可以先执行一些视图判断看看
--查看当前是否有等待内存授予的进程
Select a.*,b.text, c.query_plan 
from sys.dm_exec_query_memory_grants a
CROSS APPLY sys.dm_exec_sql_text(sql_handle) b 
CROSS APPLY sys.dm_exec_query_plan (plan_handle) c


--当前线程数(确认是否线程增大导致连接问题)
select COUNT(*) as 当前线程数 from sys.dm_os_workers


--检查数据库活动游标(是否大量游标未关闭导致性能下降)
DBCC ACTIVECURSORS 

select * from master.dbo.syscursors where status<>-1


--检查当前存在的堵塞
select p.*,s.text from master.dbo.sysprocesses p cross apply sys.dm_exec_sql_text(p.sql_handle) s
where blocked > 0 or spid in(select blocked from master.dbo.sysprocesses where blocked > 0)



------解决思路----------------------
sql server数据库内存持续增长,一般会自动在极限前停止增长的
你的软硬件是什么情况?内存、数据文件。。。。
------解决思路----------------------
我一般是先查网络,
然后再看本机连接是否有问题。
其实还有不知道LZ的数据库是盗版还是正版。
我发现我们公司用的开发版和企业版差距也很大的
开发版经常莫名连不上
  相关解决方案