我有一个应用程序,它与它需要运行的 SQL Server 实例之间的连接间歇性中断。解决此类问题的好方法是什么。如果 SQL 服务器故意断开连接,是否有某种日志记录某些内容。
我知道应用程序和数据库之间的任何事情都可能导致连接丢失。我不认为这是客户端和服务器之间的网络连接问题,因为该应用程序是通过 Citrix XenApp 提供服务的,并且在同一主机上运行的所有其他实例在我看到的那个时间点或附近都没有问题问题。
如果重要的话,这是 SQL Server 2005 - 企业版。我的应用程序是一个基于 Visual FoxPro 的应用程序,通过 Citrix XenApp 提供给客户端机器。这个问题很少见,而且是间歇性的(每天 1-2 次,超过数百个客户)。
此外,SQL Server 和 Citrix 在虚拟化服务器基础架构上运行。
TL;DR:如何解决间歇性数据库连接丢失问题?
更新:这是问题发生时应用程序错误日志中的消息:
Connectivity error: [Microsoft][ODBC SQL Server Driver]Communication link failure
我之前唯一一次看到该消息是在 SQL Server 完全过载以及实际网络连接本身出现问题(断开连接)时。在这种情况下,我认为这两件事都不是这种情况。
一定要查看 NT 和 SQL 日志……如果您在 SQL Server 2008 或更高版本上运行,请检查环形缓冲区 DMV 以获取一些额外的线索。您是否有任何可以提高采样率的监控工具,以证明问题可能与 Citrix Xenapp 交付有关?
环形缓冲区: 链接
Kendra Little 就查询超时故障排除做了一个很好的介绍视频,与连接超时不太一样。 http://www.brentozar.com/archive/2011/07/mystery-of-query-timeouts-video/
我相信当应用程序失去与数据库的连接时,SQL 服务器不会写入错误日志。sys.dm_exec_sessions DMV是一个很好的起点。
当您看到这些超时时,您是否有虚拟机的快照?请记住,超时是在应用程序级别设置的,并不是 SQL Server 放弃了。
运行配置文件跟踪并捕获超时事件和死锁图事件。
现在是 2022 年,但我仍然会为 2012 年提出的这个问题添加一个答案,因为它今天出现在列表中 :-)
Windows“内存压力检测”功能可能是一个真正的难题,尤其是对于 SQL Server 客户端-服务器应用程序。它可能会导致初始连接的间歇性失败,并且可能导致现有的已建立连接被破坏。而且它不必在任何地方记录其操作。我实际上从未见过指示 MPP 采取的操作的日志条目。而且 afaik 没有办法查看给定系统以知道它在 MPP 干预连接和连接的“区域内”。
TCP 堆栈的新内存压力保护功能说明
根据运行 SQL Server 的给定虚拟机/服务器的安全位置,MPP 可能能够完全禁用。这就是我尽可能推荐的。配置文件和豁免也可以配置。全局禁用 MPP 是一种动态更改。如果对配置文件或豁免进行了更改,我希望更新仅在重新启动服务或至少在创建新连接端口/套接字的 TCP 侦听器进程后才能运行。