You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server随机断开PHP客户端连接问题排查求助

问题描述
  • 业务服务连接Windows Server 2016上的MS SQL Server 2017,此前多年运行正常,近期出现随机断开,报错信息:

SQLSTATE[08S01]: [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: An existing connection was forcibly closed by the remote host.

  • 系统事件查看器无相关记录;测试数据库(非生产旧副本)存在日志 shipping 备份超时错误,确认与当前问题无关:

The log shipping primary database SRV\DATA.testdb1 has backup threshold of 60 minutes and has not performed a backup log operation for 696777 minutes. Check agent log and logshipping monitor information.

  • 连接环境:已将PHP从7.4升级至8.2,安装微软最新ODBC驱动;服务器暴露在公网,存在大量黑客攻击尝试,可能导致连接数过载。
  • 测试情况:编写的简单连接查询脚本,有时立即失败,有时正常运行数天才出现故障。
  • 后续日志更新:
    • 两条与报错时间间隔约3分钟的错误(来自非测试库):
      Error: 59999, severity 16, state 1 was raised, but no message with that error number was found in sys.messages. If error is larger than 50000, make sure the user-defined message is added using sp_addmessage.
      Error: 18054, Severity: 16, State: 1.
      
    • 测试库关联错误:
      Error: 14420, Severity: 16, State: 1.
      Error: 3041, Severity: 16, State: 1.
      
  • 疑问:如何调试该问题?能否让SQL Server记录断开连接的原因?
调试方案与SQL Server日志配置

一、配置SQL Server记录断开原因

  1. 启用连接跟踪标志
    • 打开SQL Server配置管理器,找到目标实例的「SQL Server网络配置」,启用TCP/IP协议的「跟踪标志」,添加3605(将日志输出到错误日志)、1222(记录连接中断相关细节)、1204(辅助跟踪连接与死锁信息)。
    • 重启SQL Server服务使配置生效。
  2. 扩展错误日志级别
    • 在SSMS中右键实例→属性→「数据库设置」→「错误日志」,勾选「记录所有进程的CPU使用情况」「记录锁等待」等详细选项;或执行T-SQL命令:
      sp_configure 'show advanced options', 1;
      RECONFIGURE;
      sp_configure 'error log', 1;
      RECONFIGURE;
      
  3. 启用ODBC驱动跟踪
    • 打开Windows「ODBC数据源管理器」,找到「ODBC Driver 17 for SQL Server」,进入「跟踪」选项卡,启用驱动跟踪并指定日志文件路径,捕获PHP与SQL Server的TCP交互细节。

二、针对性调试步骤

  1. 排查公网攻击与连接过载
    • 执行以下SQL查看当前用户连接数与来源IP:
      SELECT host_name, client_net_address, COUNT(*) AS connection_count
      FROM sys.dm_exec_sessions 
      WHERE is_user_process = 1
      GROUP BY host_name, client_net_address;
      
      统计异常IP的连接数,确认是否存在恶意连接占用资源。
    • 在服务器前端部署防火墙,限制访问白名单;或启用SQL Server「登录审核」(实例属性→安全性→登录审核→选择「失败和成功的登录」),记录所有登录尝试定位攻击源。
  2. 验证网络稳定性
    • 在业务服务器与SQL Server间持续执行ping -t和tracert命令,监测网络丢包、延迟情况,排查网络波动或路由问题。
    • 调整Windows Server TCP/IP参数:修改TcpTimedWaitDelay缩短TIME_WAIT连接回收时间,增大MaxUserPort提升可用端口数,缓解端口耗尽问题。
  3. 排查SQL Server内部资源问题
    • 分析错误日志中的18054错误:该错误为内部映射错误,通常关联连接中断或资源不足,结合详细日志查看错误前后的上下文操作记录。
    • 用以下SQL查看服务器资源压力:
      SELECT * FROM sys.dm_os_ring_buffers WHERE ring_buffer_type IN ('RING_BUFFER_RESOURCE_MONITOR', 'RING_BUFFER_SCHEDULER_MONITOR');
      
      或通过性能监视器跟踪「SQL Server:General Statistics」下的「User Connections」「Processes Blocked」等指标。
  4. 优化PHP连接配置
    • 调整PHP数据库连接参数:启用PDO持久化连接(注意资源释放逻辑),设置合理的ConnectionTimeout和LoginTimeout,避免长时间等待无响应连接。
    • 在测试脚本中添加时间戳、连接ID、执行结果等详细日志,捕获故障精确时间点,方便与SQL Server日志对应分析。

三、错误日志关联说明

  • 测试库的14420(日志 shipping 代理故障)和3041(备份失败)错误与生产连接问题无关,可忽略。
  • 59999为未注册的自定义错误号,需结合故障时间点,排查当时的SQL作业或应用操作,确认是否影响连接稳定性。

内容的提问来源于stack exchange,提问作者NickSoft

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:25:00