跳转至

SQL Server 常见运维典型问题示例及解析

汇总生产环境中高频出现的典型问题、定位思路与解决建议,便于快速响应与知识沉淀。

1. 连接失败/超时

  • 症状:应用超时、偶发断连
  • 排查:
  • 网络与端口:telnet <host> 1433 / 防火墙规则
  • 端点:SQL Browser、侦听器(AG)解析是否正确
  • 认证:AD/Kerberos/双机切换后的 SPN 是否正确
  • 建议:固定连接字符串(含 MultiSubnetFailover)、启用连接重试

2. 锁与阻塞

  • 症状:CPU 低但请求等待、响应慢
  • 排查:
  • 等待统计:sys.dm_os_wait_stats
  • 活动会话:sys.dm_exec_requestssys.dm_tran_locks
  • 语句文本:sys.dm_exec_sql_text()
  • 示例:
SELECT r.session_id, r.status, r.wait_type, r.blocking_session_id,
       t.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.session_id <> @@SPID;
  • 建议:合理事务粒度与隔离级别;热点表加索引/行版本控制(RCSI)

3. TempDB 压力

  • 症状:写延迟高、空间暴涨
  • 排查:文件数量、扩展次数、分配争用(PFS/SGAM)
  • 建议:按 CPU 核数设定数据文件数量(上限 8~16)、预分配、启用 TF 1117/1118(旧版本)

4. 日志文件持续增长

  • 排查:长事务/未备份日志;log_reuse_wait_desc
  • 建议:及时日志备份;清理长事务;合理恢复模式

5. 性能回退/查询变慢

  • 排查:执行计划变化、统计信息过期、参数嗅探
  • 建议:更新统计信息;参数化策略;Plan Guide/Query Store 固定计划

6. 死锁

  • 排查:扩展事件抓取 deadlock graph;定位冲突对象与顺序
  • 建议:统一访问顺序;拆分事务;细化锁粒度

7. Agent 作业失败

  • 排查:历史日志、代理账户权限、依赖网络/共享资源可用性
  • 建议:失败告警、重试策略、将脚本纳入源码管理

8. 高可用相关

  • AG 同步延迟:检查网络与事务日志吞吐;只读路由是否合理
  • FCI 漂移:心跳网络与仲裁;存储可用性

9. 备份/还原问题

  • 备份链中断、校验失败、压缩比异常
  • 建议:RESTORE VERIFYONLY、隔离测试还原、定期演练

附:常用视图/DMV 速查

  • 会话/请求:sys.dm_exec_sessionssys.dm_exec_requests
  • 等待:sys.dm_os_wait_stats
  • IO:sys.dm_io_virtual_file_stats
  • 索引:sys.dm_db_index_usage_statssys.dm_db_index_physical_stats

详细解决方案(逐项落地)

1. 连接失败/超时(Network/DNS/Kerberos)

  • 诊断:
Test-NetConnection server.contoso.com -Port 1433
Resolve-DnsName server.contoso.com
  • 防火墙放通:
netsh advfirewall firewall add rule name="SQL TCP 1433" dir=in action=allow protocol=TCP localport=1433
  • Kerberos/SPN:
setspn -L CONTOSO\svc_sql
setspn -S MSSQLSvc/server.contoso.com:1433 CONTOSO\svc_sql
klist purge -li 0x3e7   # 清系统 Kerberos 缓存(管理员)
  • 连接字符串:在多子网 AG 使用 MultiSubnetFailover=True,并启用客户端重试。

2. 锁与阻塞(快速止血→根治)

  • 快速定位阻塞链:
SELECT r.session_id, r.blocking_session_id, r.wait_type, t.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.session_id <> @@SPID AND (r.blocking_session_id <> 0 OR r.wait_type IS NOT NULL);
  • 临时止血:与业务确认后 KILL <spid>(谨慎)。
  • 根治:细化索引、拆分事务;如读多写少,开启行版本控制:
ALTER DATABASE [DB] SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;

3. TempDB 压力

  • 增加数据文件并预分配:
ALTER DATABASE tempdb ADD FILE (NAME=N'tempdev2', FILENAME='E:\\TempDB\\tempdb2.ndf', SIZE=8GB, FILEGROWTH=1024MB);
-- 按 CPU 核心数配置,通常上限 8~16 个文件
  • 旧版本(<2016)可考虑 TF 1117/1118;新版本不必。

4. 事务日志持续增长

  • 判断原因:
SELECT name, recovery_model_desc, log_reuse_wait_desc FROM sys.databases WHERE name=N'DB';
DBCC OPENTRAN('DB');
  • 处理:
BACKUP LOG [DB] TO DISK='X:\\Backup\\DB_log.trn' WITH INIT, COMPRESSION;
-- 如空间紧急且非生产建议,谨慎收缩:
DBCC SHRINKFILE (N'DB_log', 2048);

5. 性能回退/查询变慢(计划回退)

  • 更新统计信息:
EXEC sp_updatestats;
-- 关键表:UPDATE STATISTICS dbo.T WITH FULLSCAN;
  • 启用并使用 Query Store 强制计划:
ALTER DATABASE [DB] SET QUERY_STORE = ON;
-- 在已确认的计划上执行强制:UI 或
-- EXEC sp_query_store_force_plan @query_id, @plan_id;

6. 死锁

  • 启用扩展事件捕获:
CREATE EVENT SESSION [deadlock] ON SERVER
ADD EVENT sqlserver.xml_deadlock_report
ADD TARGET package0.event_file(SET filename=N'C:\\XEs\\deadlocks.xel');
ALTER EVENT SESSION [deadlock] ON SERVER STATE = START;
  • 优化:统一对象访问顺序;必要时分库分表、降事务粒度。

7. Agent 作业失败

  • 自检与重试:
EXEC msdb.dbo.sp_help_job @job_name=N'JobX';
EXEC msdb.dbo.sp_update_job @job_name=N'JobX', @retry_attempts=3, @retry_interval=5;
  • 代理凭据/代理账户(需要最小权限并校验网络共享)。

8. 高可用(AG/FCI)

  • AG 延迟定位:
SELECT DB_NAME(database_id) AS db, log_send_queue_size, redo_queue_size, synchronization_state_desc
FROM sys.dm_hadr_database_replica_states;
  • 恢复数据移动:
ALTER DATABASE [DB1] SET HADR RESUME;
  • FCI 漂移:
Get-ClusterGroup "SQL Server (MSSQLSERVER)" | Move-ClusterGroup -Node NODE2
Get-ClusterLog -UseLocalTime -Destination C:\\ClusterLogs

9. 备份/还原问题

RESTORE VERIFYONLY FROM DISK='X:\\Backup\\DB_full.bak';
-- 在隔离环境验证还原链条与 STOPAT 恢复点