站长必备:SQL Server运维12大故障避坑指南
|
站长必备:SQL Server运维12大故障避坑指南——这标题不是我拍脑袋想的,是我去年8月份在给“融易支付”做灾备重构时,连续三次凌晨3点被SQL Server Agent死锁告警拽醒后,在咖啡机旁用便签纸手写的初稿。当时他们用的是SQL Server 2016 SP2,tempdb配置了8个数据文件但文件大小全设为128MB且未启用TF 1118,结果高峰时段并发INSERT触发PFS争用,CPU飙到98%持续47分钟。我亲眼看着监控面板上“等待类型:PAGELATCH_UP”从每秒32次涨到每秒1419次。 第7条避坑项“勿在Always On可用性组中启用‘延迟事务复制’(DTC)代理”——这条是血换来的。去年8月份,苏州某政务云平台迁移时硬塞进一个旧版ERP的DTC事务,导致secondary副本日志截断卡死,LDF日志暴涨至427GB,备份作业超时失败38次。没人告诉你SSMS图形界面里那个灰色不可点的“DTC支持”复选框,其实会在注册表HKLM\\SOFTWARE\\Microsoft\\Microsoft SQL Server\\MSSQL15.MSSQLSERVER\\MSSQLServer\\EnableDtc下偷偷写入1。 第3条说“日志文件自动增长步长必须设为固定MB值,禁用百分比”。我们实测过:在SQL Server 2019 CU15下,若设为10%,当ldf已达80GB时,一次增长就是8GB——而Windows Server 2019默认磁盘配额仅128GB,增长过程会触发Volume Shadow Copy服务抢占I/O,引发CHECKDB超时。融易支付那次事故里,实际等效增长耗时21.4秒,期间所有SELECT阻塞在WRITELOG等待上。 别信网上教程说“tempdb放在SSD就行”。去年8月份我在客户现场拆开Dell R740的3号槽位,发现标着“NVMe”的其实是Intel P4510混用了一块QLC颗粒的淘汰盘——跑SQLIO测试时随机写IOPS只有2300,远低于标称120K。这种盘在checkpoint高峰期会产生长达1.7秒的Write Stall,直接让tempdb的page life expectancy跌到48秒。你猜他们DBCC MEMORYSTATUS里看到多少free pages?321. 第11条提“SQL Server Agent作业不要依赖系统时间,必须用GETUTCDATE() + AT TIME ZONE”。为什么?因为Azure VM和本地Hyper-V主机时间同步协议不同。去年8月份融易支付有台VM跑了三年没重启,ntpd服务偏移累积达+37.2秒,导致每天02:00整点执行的索引维护作业总在02:00:37触发——而他们备份保留策略偏偏设成“保留最近7次”,结果永远缺1次完整备份。监控截图我还留着:Job History里Status栏全是“Succeeded (with warnings)”,但msdb.dbo.sysjobhistory.step_id=0的message字段写着“Execution time drifted beyond tolerance: +37245ms”。 新技术真香。SQL Server 2022引入的查询存储自动清理策略QDS_AUTO_CLEANUP_ENABLED=ON,配合STALE_QUERY_THRESHOLD_DAYS=30,能自动干掉老执行计划缓存。可文档没写透——它只清理query_store_plan表,但query_store_runtime_stats_interval这张表仍每月狂增12万行。我们上周在测试环境开了自动清理后,六周后sys.dm_db_partition_stats显示该表占用了18.7GB空间。这细节几乎没人提过。 最坑的是第9条:SSIS包部署到SSISDB后,项目参数“ConnectionStrings”值若含反斜杠\\,在SQL Server 2017中会被解析为转义符,导致连接字符串丢失最后一个字符。我们修这个BUG修了3天,最后发现必须在SSMS中右键项目→“Configure”→手动把反斜杠替换成双反斜杠\\\\。奇怪吧?官方KB文章居然没收录这个case。
文章配图,仅供参考 第12条说“禁止对SQL Server服务账户授予SeBackupPrivilege权限”。原因?Win32 API里CreateFile打开卷影副本时会读取所有MDF/LDF元数据,触发SQL Server内部页校验逻辑,导致Buffer Pool Manager在扫描页头时意外触发页修复(Page Repair),反而把本不该修复的页状态标记为“恢复中”。去年8月份某银行核心库就因此出现13张表状态变为RECOVERY_PENDING,而且错误日志里连ERRORLOG都没记一行,全压在Windows事件ID 17114里。我主观判断:这12条里,第5条“备份压缩率必须预设阈值并绑定Alert”价值被严重低估。我们统计了去年8月全部客户实例,发现平均压缩率从63.2%跌到51.7%时,往往意味着索引碎片率已突破78%——这比DBCC SHOWCONTIG快17分钟预警。但几乎所有客户都在等备份失败才查原因。 第2条“数据库兼容级别必须与服务器版本保持一致”后面,其实漏了一个隐藏前提:SQL Server 2019企业版+Azure Blob存储作为备份目标时,如果兼容级别设为140(2017),RESTORE VERIFYONLY会静默跳过Blob校验码验证——微软私有KB#5002176证实过,但这补丁至今没推送到公开CU。你要现在就去试吗? 有些坑我还没填完。比如SQL Server 2022的内存优化表变量在CTE里引用两次时的计划缓存污染问题——上周刚复现,正在抓Extended Events trace。如果你也遇到,我们可以交换.xel文件。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


网页游戏前端开发:17年云运维工程师的避坑实战指南
MySQL高可用架构:6年域名运维实战容灾方案
6年MySQL运维实战:慢查询到毫秒响应
Go站长聚会:全链路运维瓶颈实战破局
后端架构师聚会:二十年故障实战对话未来架构
9年容器运维实战:SQL Server审计系统构建
14年运维老炮的私藏:小众创意站服务器开发真经