以下是一个用于监控并自动重启 SQL Server 服务的批处理脚本,适用于 Windows Server 2008 和 SQL Server 2012(默认实例):
@echo off
setlocal enabledelayedexpansion
:: 配置参数
set SERVICE_NAME=MSSQLSERVER
set LOG_FILE=C:\SQL_ServiceMonitor.log
:: 检查服务状态
sc query %SERVICE_NAME% | find "STATE" > nul
if %errorlevel% equ 0 (
for /f "tokens=3 delims=: " %%A in ('sc query %SERVICE_NAME% ^| find "STATE"') do set "STATUS=%%A"
) else (
echo [%date% %time%] 错误:服务 %SERVICE_NAME% 不存在 >> %LOG_FILE%
exit /b 1
)
:: 记录状态
echo [%date% %time%] 检测服务 %SERVICE_NAME% 状态码: !STATUS! >> %LOG_FILE%
:: 判断是否需要重启
if not !STATUS! equ 4 (
echo [%date% %time%] 服务未运行,尝试重启... >> %LOG_FILE%
net stop %SERVICE_NAME% > nul 2>&1
net start %SERVICE_NAME% > nul 2>&1
:: 验证重启结果
sc query %SERVICE_NAME% | find "STATE" | find "RUNNING" > nul
if %errorlevel% equ 0 (
echo [%date% %time%] 服务重启成功 >> %LOG_FILE%
) else (
echo [%date% %time%] 错误:服务重启失败 >> %LOG_FILE%
)
)
endlocal
使用说明:
-
保存脚本:将代码保存为
SQLServiceMonitor.bat
,建议存放在服务器固定路径(如C:\Scripts\
)。 -
修改配置(按需):
SERVICE_NAME
:若使用命名实例(如实例名为SQL2012
),改为MSSQL$SQL2012
。LOG_FILE
:自定义日志文件路径。
-
计划任务配置:
- 打开“任务计划程序”,创建新任务。
- 常规选项中勾选“不管用户是否登录都要运行”和“使用最高权限”。
- 触发器:设置周期性执行(如每5分钟)。
- 操作:启动程序选择保存的bat文件。
- 条件:取消所有勾选以避免休眠时失效。
-
测试:
- 手动停止 SQL Server 服务,等待脚本自动重启并检查日志。
注意事项:
- 需确保执行账户有权限管理服务(建议使用管理员账户)。
- 若服务器启用了防火墙,需确保不影响服务操作。
- 定期检查日志文件以确认监控状态。
此脚本会持续监测 SQL Server 服务状态,异常时自动重启并记录详细日志,便于后续维护。