站长必修:SQL Server运维12大坑与交互避险指南
|
跟老板拍桌子。不是为预算,是为那个“自动优化建议”弹窗——它第十七次把主键索引删了又重建,而我们正在跑日结对账。PM在会议室白板上画第三遍“用户旅程图”,我盯着 SSMS 里那行绿色小字:“Index rebuild completed successfully”,手还在抖。 这个我敢打包票:SQL Server Management Studio 19.4 的“生成脚本向导”在勾选“包含依赖对象”后,会偷偷把你刚加的 computed column 的 PERSISTED 属性抹掉。不是漏,是抹。我亲眼看着它删的——删得特别利索,像用橡皮擦掉铅笔线,还带一点轻微反光。你回看脚本,啥都没写错,可上线一查,所有依赖视图全报 conversion failed。前天下午三点,我一边重跑 alter table,一边看见后端老陈蹲在茶水间门口啃冷馒头,他手机屏亮着,显示钉钉消息“客户问对账延迟是不是你们改了索引”。我没吭声。馒头太干,他噎了一下,伸手去接水,结果碰倒了饮水机旁边的绿萝盆栽,土洒了一地。 站长必修那十二个坑?别信标题。它没说清最要命的那个:auto-close = TRUE 在 Always On 可读副本上开启后,第一次查询触发数据库打开时,会卡住整个连接池三秒半。不报错,不告警,就挂在那里——就像电梯到了但门不开,所有人等,没人知道按钮早被谁按过三次。我原以为是网络抖动,结果抓包看到是 SPID 持有 LCK_M_SCH_S 锁在 sys.databases 上,而锁源头是那个被设成 auto-close 的数据库的内部状态同步线程。我说不准这算不算 bug,微软 KB 文档里用的是“behavioral quirk”这个词,翻译过来就是“我们懒得改”。
文章配图,仅供参考 碎成片的。去年夏天我们上线一个新报表,前端同事调了三次 API 才拿到完整数据——第一次返回空数组,第二次缺两列,第三次才齐。查日志,发现不是代码问题,是 SQL Server 把 tempdb 上的一个统计信息自动更新任务卡死了,连带阻塞了查询计划重编译。可问题在于:它根本没记到 errorlog 里。只在 sys.dm_exec_requests 里留了个 status=‘suspended’ 和 wait_type=‘WAIT_XTP_CKPT_LOG’,这玩意儿连 DBA 都要翻半小时文档才想起这是 In-Memory OLTP 日志检查点在等内存回收……等等,我们没开 In-Memory。后来才发现,是某个凌晨备份作业启用了 backup compression,而压缩引擎悄悄注册了一个 XTP 兼容模块。这个细节我查了四小时,Lighthouse 跑分截图发到群里没人回,桌面那个没关的录屏一直在右下角闪,进度条停在 00:03:27。再比如那个“最大并行度(MAXDOP)设成 0”的坑。文档写得跟禅宗公案一样:“SQL Server 将使用所有可用逻辑处理器”。可实际呢?当你在 64 核虚拟机上跑一个 SELECT TOP 1 FROM 表名 WHERE 主键 = @id,它真会拉满 64 个线程来扫单行?不。它会启动 19 个线程,其中 18 个等 I/O 完,1 个在等 CPU 缓存同步,还有一个在等另一个线程释放 spinlock。我敢打包票:这个数字 19,和服务器 BIOS 设置里的 NUMA 节点数、SQL Server 启动参数 -T1117 的启用状态、以及当天 Windows 更新是否重启过服务都有关,但它和你写的 SQL 无关。你写的越干净,它越疯。 CDN 账单这事其实跟我没关系。但上个月我们 CDN 流量暴涨 37%,后台发现全是 /api/heartbeat 带着 ?v=2023.8.12 参数在刷。运维说这是健康检查,没问题。我点了下那个 URL,响应头里 Content-Type 是 text/html;再看响应体,居然是 SQL Server 默认错误页的源码片段,混着一句:“Cannot open database ‘monitoring_db’ requested by the login.” 然后我就顺手把那段 HTML 里嵌着的 stack trace 截了图,发给了负责监控平台的 PM。她回复:“哦,我们改了探针配置,把连接字符串硬编码进容器镜像了。”——这人上周五刚提离职。现在她的工位上只剩一个空咖啡杯,杯底压着张便签,字是圆珠笔写的:“已转交小王”。小王是谁?没查。反正我那天中午没喝咖啡,只倒了半杯水,看见对面工程师换了一根充电线,Type-C 接口那种,灰白色,线身有点弯折,像用久了。 优胜劣汰这点倒是真。不是说技术淘汰人,是交互设计层面的淘汰:谁还容忍“执行查询 → 弹出确认对话框 → 勾选‘我理解风险’→ 输入管理员密码 → 再点确定 → 然后等三分钟才能看到结果”?我们给 DBA 做的运维工具里,就把“收缩日志文件”按钮藏了三级菜单,还加了个倒计时提示:“该操作可能引发查询阻塞(预计持续时间:22 秒)”,但真正点进去后,第一行大字却是:“您确定要让 SQL Server 自己决定什么该缩、什么不该缩?”——底下两个按钮:“听它的”、“让我自己写语句”。我们测过,82% 的人点“听它的”,结果三个月后他们服务器上 log_reuse_wait_desc 变成了 REPLICATION,因为“听它的”顺手把 transaction log backup job 给停了。所以后来我们改了:按钮变成“立刻收缩(不备份)”和“安全收缩(强制触发一次日志备份)”,第二选项默认高亮,且鼠标悬停时浮层弹出最近七天备份失败记录。这不是功能升级,是交互赎罪。 至于那些没写的坑?比如“WITH (NOLOCK) 在跨库 JOIN 时会让 tempdb 的 version store 增长不受控”,比如“SSIS 包部署后默认不加载 connection string 中的 integrated security=false 配置”,比如“SQL Server Agent 作业步如果用 PowerShell 子系统,失败时 exit code 总是 0,除非你手动加 $LASTEXITCODE -ne 0”……这些我懒得列了。真踩进去的人,早不看指南了,他在 grep errorlog、在改 registry key、在翻 SQL Server 内部视图 sys.dm_os_memory_brokers 里的 memory_node_id 字段含义。我现在桌面上开着三个窗口:SSMS、Notion、还有个 Chrome 标签页停在 GitHub sql-server-samples 仓库主页。我原以为能抄个现成的监控脚本,结果点进去全是 .md 文件,最后一个提交是两年半前,作者签名写着:“Moving on to Cosmos DB :)”。 下一步?我打算把那个“自动优化建议”弹窗替换成一行灰色文字,写在查询窗口底部状态栏里:“此操作将重建索引(影响约 3280 行),预估 IO 成本:47ms,CPU 开销:89%,上次类似操作导致订单表锁表 2.4 秒——是否继续?”不弹窗,不确认,就让它在那儿闪。用户爱点就点,不爱点拉倒。反正,我明天先去把茶水间门口的绿萝重新栽好。土是干的,根有点发白,但茎节还硬。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Linux运维老手也常踩的5个Unix环境搭建坑
5G模组低功耗:嵌入式运维的新标尺
差评变引擎:点评驱动的闭环运维法
PHP防SQL注入:11年运维总结的3层硬核防御体系
硬核巡检日志里的创业闭环:从运维到 tech startup 的实战逻辑
云运维老兵的跨界融合创业实战指南
Go驱动运维新范式:跨界融合赋能站长