焦点

sqlserver2008的mssqlserver服务自动停止

时间:2010-12-5 17:23:32  作者:焦点   来源:综合  查看:  评论:0
内容摘要:昨天凌晨两点,监控系统第三遍报警,客户的ERP数据库服务又停了。日志文件里躺着一条孤零零的错误记录:MSSQLSERVER服务自动停止,没有预兆,没有崩溃转储。这已经是本月第四次了。 问题出在SQL

昨天凌晨两点,的动停监控系统第三遍报警,的动停客户的的动停ERP数据库服务又停了。日志文件里躺着一条孤零零的的动停错误记录:MSSQLSERVER服务自动停止,没有预兆,的动停没有崩溃转储。的动停这已经是的动停本月第四次了。

问题出在SQL Server 2008的的动停一个老毛病上——内存压力导致的线程资源枯竭。别急着翻性能计数器,的动停先看看Windows事件日志里的的动停SQLAgent告警。多数情况下,的动停服务停止前几分钟,的动停系统日志会记录到“SQL Server无法生成新的的动停线程”这类提示。你如果没开“牺牲进程优先级”或“最小工作集”这类隐藏开关,的动停那八成是的动停操作系统在物理内存耗尽前,优先干掉了SQL Server的进程。

我处理过一个典型案例:某工厂的MES系统,白天运行正常,一到夜间批量任务跑起来就宕机。排查到最后,发现是服务器的“锁定内存页”权限没给SQL Server服务账户。Windows默认不允许普通账户锁定内存,SQL Server却需要这个权限来防止自身缓冲区被换出到虚拟内存。一旦夜间内存压力上来,操作系统把SQL Server的缓存页全部换到磁盘,服务就卡死,然后自动停止。解决办法很简单——在本地安全策略里,给SQL Server服务账户授予“锁定内存页”权限,重启服务,完事。

另一个容易被忽略的触发点是SQL Server 2008对“最大服务器内存”的默认设置。它默认不设上限,等于让SQL Server和操作系统抢内存。你要是装了多个实例,或者同一台机器上跑了IIS、其他应用程序,系统内存告急时,SQL Server会先被“牺牲”掉。我见过一台8GB内存的服务器,SQL Server吃掉了7.5GB,剩下的连Windows自身都快跑不动了。服务不自动停止才怪。

还有种情况比较隐蔽——SQL Server 2008的“自动关闭”数据库选项。如果你在数据库属性里勾选了“Auto Close”,当最后一个用户连接断开时,数据库会释放所有资源。如果此时某个后台任务(比如作业调度器)尝试访问该数据库,而数据库还没完全重新打开,就可能触发服务内部错误,导致整个实例停止。这问题在SQL Server 2008 R2上尤其明显,因为它的延迟持久性机制会在数据库关闭时产生竞态条件。

最后提醒一句,别忽略SQL Server错误日志中“错误: 701”或“错误: 802”这类记录。前者表示内存不足,后者表示内存请求被拒绝。如果频繁出现,基本可以判定是内存配置问题。别急着加物理内存,先把“最大服务器内存”调整到系统总内存的70%左右,再给服务账户加锁定内存页权限,最后检查一下所有数据库的Auto Shrink和Auto Close选项是否都关掉了。

这些操作做完,再观察一周。要是服务还自动停止,那可真得考虑升级到更新版本了——SQL Server 2008已经停止支持多年,很多底层内存管理缺陷根本没法通过补丁修复。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap