SQL Server运维6年踩坑实录:实战排障指南
|
2025年12月那个晚上,我蹲在三号机房靠窗那排机柜后头——不是维修,是躲监控录像死角,等SQL Agent把那个死循环作业杀干净。王磊在隔壁工位啃包子,油渍蹭到KB458045的补丁说明PDF上;老张推门进来,夹着个没拆封的热奶茶,手机还贴在耳朵上说“再给我十分钟,这波缓存我清三遍”。雨下得没停过,从下午三点开始,机房顶棚渗水点挪了两回位置,现在正滴在UPS告警灯罩上,噗、噗、噗,跟DBCC CHECKDB的IO等待节奏一模一样。 我说的不是什么高可用架构多难配,是半夜三点收到警报:tempdb日志文件暴涨到47GB,log_reuse_wait_desc居然是NOTHING——不是REPLICATION,不是ACTIVE_TRANSACTION,就他妈是NOTHING。我原以为是隐藏的隐式事务锁住了VLF链表头,结果抓着sp_whoisactive扒了二十分钟,发现是某人用SSIS包跑完一个132列的宽表导入后,顺手在最后加了句SET NOCOUNT OFF——然后整个包的执行计划被SQL Server误判成“有结果集要返回”,临时对象全堆进tempdb的版本存储区,没释放。这个我敢打包票,因为我在还原库重放时特意把那句删了,崩得更快。可为什么OFF比ON更触发版本生成?我说不准。文档没写,KB也没提,只有一篇2016年的论坛帖底下有个ID叫“sqlghost”的人留了句“别信SET NOCOUNT,它在内存池里认亲戚”。 上周二,客户现场。他们DBA指着SSMS里“自动更新统计信息”勾选框,眼神像看初恋——“我们开了啊,怎么执行计划还是走错?”我扫了一眼sys.dm_db_stats_properties,137张表里有49张stats last_updated是2024年。他立马调出维护计划截图:每天凌晨2:15执行“更新所有统计信息”。但没说出口的是——那个维护计划任务名是“DBA_Daily_Stats_Update_V2_副本”,真正跑的是“DBA_Daily_Stats_Update_V2”,而V2早在2023年就被他误删了。任务管理器里残留的那个“副本”,只是个永远不触发的占位符。他接电话的时候手指在抖,我看见他左手无名指指甲缝里嵌着蓝白相间的粉笔灰——早上肯定去培训室写过黑板。桌上的外卖盒盖掀开着,麻婆豆腐凝着油花,旁边压着一张便签:“张工:备份链路切换测试别忘(P.S. 你咖啡杯在我这儿)”。我没提这事。有些坑,踩进去才是唯一确认方式。 冷备份恢复慢?那是真慢。但去年冬天我在某省行做灾备演练,restore database命令卡在“正在处理数据库页……”七分十八秒不动,我敲了三次Ctrl+C都没反应。服务器没死,sp_who3显示SPID还在WAITING,状态是ASYNC_IO_COMPLETION。查磁盘队列长度是23,但队列里全是0字节IOPS请求——后来发现是某块NVMe盘的固件BUG,遇到4K对齐失败的log backup块会假死。厂商说“重启控制器能恢复”,我按了电源键,整机柜嗡一声闷响,空调突然停了十秒。机房温度当场涨了两度,墙上温湿度计玻璃管里的酒精柱往上蹦了半厘米。没人说话。小刘掏出打火机烤自己手指取暖,火苗刚亮起来,我就闻见一股焊锡味——他前天修坏的那块RAID卡还搁在防静电袋里没送修。 优胜劣汰不是口号。是去年十月我亲眼看见:集团把七个二级分行的DBA团队砍掉六个,剩下一个留在总部做轮值oncall,工资翻倍,权限开到sa_role+xp_cmdshell+启动代理作业。不是因为他多厉害,是他去年连续三个月没让任何一次索引重建落到生产高峰段。其余六个?一个改错参数导致AlwaysOn同步超时,一个误删syspolicy表,还有一个在SQL Agent里建了个每秒执行一次的“健康检查作业”……等等,说到这个——那天我看见财务系统凌晨四点的登录名是“healthcheck_automated_v2.1”,后面跟着个括号(已弃用),括号里又套着个括号(其实从来没启用过)。我笑出声了。对面运维大哥立刻抬头:“咋了?”我把屏幕转过去,他盯着看了三秒,低头继续敲键盘,嘴里嚼着最后一口韭菜盒子。
文章配图,仅供参考 哦对,忘了说:上周五上午九点十七分,主库tempdb又爆了。这次是CLR函数调用里new了一个没dispose的SqlDataReader,在GC前占着version store。排查时我发现,这个CLR assembly的创建时间是2019年4月,签名证书过期日期是2022年8月——但SQL Server直到2025年才开始验证证书有效性。为什么拖这么久?因为默认配置里trustworthy数据库关了,而他们把clr enabled设成1之后,忘了开show advanced options。这不是bug,是开关之间的时差。我录了个LIVE演示视频发群里,两小时后收到人事消息:下季度全员考核新增“开关协同失效”实操项。没提名字,但邮件抄送列表里,第一个是王磊。现在我抽屉最下层压着三张纸:一张是机房漏水点分布图,铅笔画的;一张是不同SQL Server版本下DBCC WRITEPAGE行为对比,密密麻麻全是批注;还有一张,是客户签字的《非紧急维护申请单》原件,签字日期是2025年12月23日,但我昨天看见它就摊在保洁阿姨的抹布桶沿上,边角翘起,沾着一点绿色洗洁精泡沫。要不要捡起来?先干完手头这单——他们刚把max server memory改回28GB了,说“看着顺眼”。我得盯着buffer pool前三分钟的页生命周期…… (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


MySQL运维设计实战:36小时崩盘到高可用蜕变
运维新手必踩的5个服务器配置坑,第3个90%人中招
网站运维者必知的5大云安全防护盲区
14年码农亲历:Linux深度学习环境搭建排障全路径
运维老手血泪总结:5大服务器部署深坑
站长必修:SQL Server运维12大坑及避坑指南
鸿蒙开发者必修:MySQL高并发运维实战
