站长必修:SQL Server运维避坑指南(含12个真实故障复盘)
|
SQL Server运维不是简单的“装好就跑”,很多看似微小的配置偏差或操作惯性,会在业务高峰期突然引爆。以下12个真实故障案例,均来自一线生产环境,每个都附带可立即落地的规避动作。 某电商大促前夜,DBA执行索引重建脚本时未加WHERE条件,全库千万级表逐个重建,导致tempdb暴涨至800GB,实例卡死。根源在于脚本复用时遗漏过滤逻辑。建议:所有自动化脚本必须强制包含“SET NOCOUNT ON”和“PRINT + RAISERROR”双校验,且在测试库用DBCC SHOW_STATISTICS验证影响行数。 一政务系统凌晨自动备份失败,但监控无告警。排查发现维护计划中备份任务被设为“忽略失败”,且未启用SQL Agent邮件通知。结果连续7天无可用备份。解决办法:禁用所有“忽略失败”选项,所有关键任务必须配置失败后发送告警到企业微信+短信双通道。 开发人员在SSMS中用GUI修改表结构(如加NOT NULL列),未勾选“生成脚本并执行”,直接点击执行——SQL Server后台自动生成DROP+CREATE语句,锁表超15分钟。正确做法:任何结构变更必须先生成ALTER语句,人工审查后再执行;禁止GUI直接操作生产库。 某金融系统日志文件增长失控,原因为简单恢复模式下仍启用了日志传送。日志无法截断,.ldf文件三天涨到4TB。根本原因是对恢复模式与高可用组件的耦合关系理解错误。牢记:简单恢复模式≠无需管理日志;启用日志传送、AlwaysOn等组件时,必须切换为完整恢复模式并配全量+日志备份。 DBA为提升查询性能,在订单表创建了包含12个字段的宽索引,结果写入性能下降60%。因每次INSERT/UPDATE都要维护该索引,且叶级页分裂频繁。原则:非聚集索引字段总数≤5,关键查询字段优先,避免INCLUDE过多冗余列。 误删数据后执行ROLLBACK失败,因事务已超2小时自动终止。根源是未设置SET LOCK_TIMEOUT 30000,导致长时间阻塞未及时感知。所有交互式会话必须前置执行:SET LOCK_TIMEOUT 30000; SET QUERY_TIMEOUT 600; TempDB配置仅用1个数据文件,高并发下出现PAGELATCH_UP争用。扩容后未同步调整文件大小与自动增长步长,新文件初始仅8MB,频繁自动增长拖慢性能。标准配置:按CPU核心数配置8~16个等大文件(≥8GB),禁用百分比增长,统一设为512MB固定增长。 备份文件存于系统盘D:\\Backup,磁盘满后备份作业静默失败,无人知晓。必须将备份目标路径设为独立LUN,并在作业开头添加EXEC xp_fileexist检查空间,不足则RAISERROR中断。 使用sp_who2查阻塞时,只看SPID和BLK,却忽略wait_type=PAGEIOLATCH_SH——这指向磁盘I/O瓶颈,而非锁等待。应改用sys.dm_exec_requests + sys.dm_os_wait_stats联合分析,重点关注CXPACKET、PAGEIOLATCH_、WRITELOG三类等待。 某报表库凌晨执行DBCC CHECKDB,持续5小时,期间用户查询大量超时。CHECKDB默认使用最大内存,挤占缓冲池。解决方案:对TB级库,务必加WITH MAXDOP=2,并安排在业务低谷且避开其他维护任务。 最后一条铁律:所有变更必须走发布单流程,含SQL脚本、回滚步骤、影响评估、审批人签字。没有发布单的任何操作,无论多紧急,一律视为违规。运维的确定性,永远来自流程的刚性,而非个人经验的弹性。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

浙公网安备 33038102330577号