上一篇
"王工!生产库突然卡死了!订单全堵住了!"凌晨3点接到这通电话时,我嘴里还留着睡前牛奶的味道。🆘 冲进系统一看——事务日志爆满、死锁连环撞、CPU持续100%...这场持续6小时的抢救最终发现:如果上个月做了健康检查,本可以避免这场灾难。
就像人需要年度体检,数据库的健康检查能:
1️⃣ 预防突发崩溃:提前发现日志文件膨胀、索引碎片等"慢性病"
2️⃣ 节省修复成本:修复一个损坏页面的成本是检查的100倍💰
3️⃣ 提升性能:识别缺失的索引就像找到堵车的真正路口
4️⃣ 合规要求:某些行业强制要求健康检查记录(比如金融业📈)
2025年微软调研显示:83%的严重故障可通过常规健康检查预测
-- 查看关键指标(建议每周跑) SELECT @@SERVERNAME AS 服务器名, DB_NAME() AS 数据库名, cntr_value AS 当前值 FROM sys.dm_os_performance_counters WHERE counter_name IN ( 'Buffer cache hit ratio', -- 缓存命中率<90%要警惕 'Page life expectancy', -- 页生命周期<300秒报警 'Batch Requests/sec' -- 突增可能预示问题 );
-- 查找碎片率>30%的索引(每月处理) SELECT OBJECT_NAME(i.object_id) AS 表名, i.name AS 索引名, ips.avg_fragmentation_in_percent AS 碎片率 FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips JOIN sys.indexes i ON ips.object_id = i.object_id WHERE ips.avg_fragmentation_in_percent > 30 ORDER BY ips.avg_fragmentation_in_percent DESC;
-- 捕获最耗资源的查询(TOP 10毒瘤) SELECT TOP 10 qs.execution_count AS 执行次数, qs.total_logical_reads/qs.execution_count AS 平均逻辑读, SUBSTRING(qt.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) AS 问题SQL片段 FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt ORDER BY qs.total_logical_reads DESC;
现象:.ldf
文件占用90%+磁盘空间
急救:
-- 立即收缩日志(临时方案) DBCC SHRINKFILE(2, 1024); -- 收缩到1GB -- 长期方案:调整恢复模式或增加日志备份频率
对策:
-- 开启死锁跟踪标志 DBCC TRACEON (1222, -1); -- 之后检查错误日志定位死锁链
频率 | 检查项 | 工具推荐 |
---|---|---|
每日 | 磁盘空间/错误日志 | 自定义警报📢 |
每周 | 性能计数器/阻塞查询 | DMV脚本📜 |
每月 | 索引碎片/统计信息更新 | Ola Hallengren维护方案✨ |
每季度 | 完整架构审查/安全审计 | 微软评估工具🧰 |
sp_Blitz
存储过程自动邮件报告(GitHub开源) 健康检查不是消防演习,而是疫苗注射💉 花1小时预防,省下72小时抢救!
(本文方法适用于SQL Server 2016-2025版本,部分语法可能需要调整)
本文由 阙乐儿 于2025-08-02发表在【云服务器提供商】,文中图片由(阙乐儿)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/518319.html
发表评论