生產環境需確保 SQL Server 服務持續運行。腳本可部署為 SQL Agent 作業、Windows 排程器或系統監控(Zabbix、Prometheus node_exporter)定期執行。
#!/bin/bash
# 檢查連接埠 3306 (MySQL) 或 1433 (SQL Server)
PORT=1433
HOST=localhost
# 1. 連接埠存活檢查
if ! nc -z $HOST $PORT >/dev/null 2>&1; then
echo "[$(date)] Port $PORT down, starting service..."
systemctl start mssql-server # 或 systemctl start mysql
exit 0
fi
# 2. 實際連線測試
if ! /opt/mssql-tools/bin/sqlcmd -S $HOST -U monitor_user -P 'StrongP@ss' -Q "SELECT 1" >/dev/null 2>&1; then
echo "[$(date)] Connection test failed, restarting..."
systemctl restart mssql-server
# 等待啟動完成
sleep 10
# 再次驗證
if /opt/mssql-tools/bin/sqlcmd -S $HOST -U monitor_user -P 'StrongP@ss' -Q "SELECT 1" >/dev/null 2>&1; then
echo "[$(date)] Restart successful."
else
echo "[$(date)] CRITICAL: Restart failed, alerting..."
# 發送告警(郵件/Slack/Webhook)
fi
fi
$svc = Get-Service MSSQLSERVER
if ($svc.Status -ne 'Running') {
Write-Host "Service stopped, starting..."
Start-Service $svc
exit
}
# 測試連線
try {
$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Server=localhost;User ID=monitor;Password=StrongP@ss;Connect Timeout=5"
$conn.Open()
$conn.Close()
Write-Host "SQL Server healthy."
}
catch {
Write-Warning "Connection failed: $_"
Restart-Service MSSQLSERVER -Force
# 發送告警
}
| 指標 | T-SQL / DMV 取得方式 | 警示閾值建議 |
|---|---|---|
| CPU 使用率 | sys.dm_os_ring_buffers 或 PerfMon | > 80% 持續 5 分鐘 |
| 記憶體壓力 | DBCC MEMORYSTATUS / sys.dm_os_process_memory | Target < Total,或 PLE < 300 秒 |
| 鎖死鎖 | sys.dm_tran_locks, sys.dm_os_waiting_tasks | 出現即告警 |
| 磁碟延遲 | sys.dm_io_virtual_file_stats | 讀/寫 > 20ms |
| 備份狀態 | msdb.dbo.backupset | 超過 RPO 未備份 |
| 資料庫狀態 | sys.databases.state_desc | 非 ONLINE 即告警 |
VIEW SERVER STATE、SELECT ON msdb 等最小權限。DBCC FREEPROCCACHE、DBCC DROPCLEANBUFFERS 緩解暫時性壓力(謹慎)。自動化健康檢查與自癒,是資料庫高可用的基石。