Linux上监控 SQL Server 性能的可落地方案
一 快速排障的 Linux 与 SQL 组合
二 长期监控与可视化
三 常用 SQL 查询模板
SELECT TOP 5
r.session_id,
r.status,
r.cpu_time,
r.total_elapsed_time,
t.text AS query_text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
ORDER BY r.total_elapsed_time DESC;
SELECT
(1.0 - CAST(SUM(CAST(1.0 * cntr_value AS FLOAT)) / SUM(CAST(1.0 * base.cntr_value AS FLOAT))) * 100.0 AS BufferCacheHitRatio
FROM sys.dm_os_performance_counters c
CROSS JOIN (
SELECT cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE '%Buffer Manager%'
AND counter_name = 'Buffer cache hit ratio base'
) base
WHERE c.object_name LIKE '%Buffer Manager%'
AND c.counter_name = 'Buffer cache hit ratio';
DBCC SQLPERF(LOGSPACE);
SELECT
s.session_id,
s.login_name,
s.status,
r.wait_type,
r.wait_time,
r.blocking_session_id,
t.text
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t
ORDER BY r.wait_time DESC;
四 告警与自动化
#!/usr/bin/env bash
THRESHOLD=80
EMAIL="admin@example.com"
NOW=$(date '+%F %T')
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if (( $(echo "$CPU_USAGE > $THRESHOLD" | bc -l) )); then
echo "$NOW - CPU 使用率超过阈值($THRESHOLD%),当前:$CPU_USAGE%" | mail -s "SQL Server CPU 告警" "$EMAIL"
fi
五 实践建议与注意事项