奇怪的间歇性 SQL 连接错误,重新启动时修复,3-5 天后恢复 (ASP.NET)
Posted
技术标签:
【中文标题】奇怪的间歇性 SQL 连接错误,重新启动时修复,3-5 天后恢复 (ASP.NET)【英文标题】:Strange intermittent SQL connection error, fixes on reboot, comes back after 3-5 days (ASP.NET) 【发布时间】:2009-01-09 16:57:39 【问题描述】:由于某种原因,每 3-5 天,我们的网络应用程序就会失去打开与数据库的连接的能力,并出现以下错误,奇怪的是我们所要做的就是重新启动容器(它是一个 VPS)并且它恢复正常功能。然后几天后,它再次发生。有没有人遇到过这样的问题?我在半夜从我们的 AD 服务器注意到安全日志中有很多匿名登录,这很奇怪,还有一些来自阿姆斯特丹的 IP。我不确定如何判断它们的确切含义或是否相关。
Server Error in '/ntsb' Application.
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
Source Error:
Line 11:
Line 12:
Line 13: dbConnection.Open()
Line 14:
Line 15:
Source File: C:\Inetpub\wwwroot\includes\connection.ascx Line: 13
Stack Trace:
[SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)]
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +248
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +245
System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnection owningObject) +475
System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) +260
System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) +2445449
System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) +2445144
System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) +354
System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) +703
System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) +54
System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) +2414696
System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) +92
System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) +1657
System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +84
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +1645687
System.Data.SqlClient.SqlConnection.Open() +258
ASP.includes_connection_ascx.getConnection() in C:\Inetpub\wwwroot\includes\connection.ascx:13
ASP.default_aspx.Page_Load(Object sender, EventArgs e) in C:\Inetpub\wwwroot\Default.aspx:16
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +42
System.Web.UI.Control.OnLoad(EventArgs e) +132
System.Web.UI.Control.LoadRecursive() +66
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2428
Version Information: Microsoft .NET Framework Version:2.0.50727.3053; ASP.NET Version:2.0.50727.3053
【问题讨论】:
当它进入这个状态时,你能从运行代码的服务器ping sql server吗? 好主意,下次我试试。 我也有同样的问题。该网站在我们的生产(非 VPS)盒子上完美运行,但它最近开始偶尔在我们的暂存(VPS)盒子上给我们这些错误。我认为这一定是某种资源问题,因为问题是间歇性的,重新启动似乎可以解决一段时间。你有想过这个吗? 【参考方案1】:允许连接到 sql server 的数量是一个固定资源。听起来您在某处的代码未正确关闭其连接,并且在一段时间后您无法再打开任何新代码。
【讨论】:
这种情况我已经见过好几次了 这很有趣,我会检查这样的事情。但是,我们在以前的服务器上运行了这个 Web 应用程序,从来没有遇到过这个问题,只有在我们迁移到这个新的虚拟服务器之后,问题才开始出现。所以我觉得不是那样... 可能是这样,也许您的资源较少。【参考方案2】:我们最近在生产环境中遇到了类似的问题,经过多轮“调试诊断”和转储分析后,我们得出的结论是,很大程度上是碎片化的大型对象堆导致了这种情况。参考http://msdn.microsoft.com/en-us/magazine/cc534993.aspx。简而言之,您的应用程序可能内存不足并且没有足够的连续空间来打开连接。您可以使用 VMMap http://technet.microsoft.com/en-us/sysinternals/dd535533 来识别可用空间。您是否定期回收您的 AppPools? AppPool 回收会拆除应用程序并释放任何帮助内存,从而解决任何相关问题。
【讨论】:
【参考方案3】:您是否尝试过使用 perfmon 和分析器(跟踪)收集基本信息,以查看建立了多少连接、内存统计信息和其他有趣的事情?
【讨论】:
不,我该怎么做?我会谷歌...我一直在使用计算机管理控制台中的事件日志。 好的,我尝试了 perfmon,它打开了,但没有可用的日志。 您可以访问 SQL Management Studio 吗? msdn.microsoft.com/en-us/library/ms187929.aspx我不熟悉你在 vps 情况下有什么能力。 Perfmon - 没有可用的日志?你的意思是没有可供选择的柜台?【参考方案4】:“我在半夜从我们的 AD 服务器注意到安全日志中有很多匿名登录,这很奇怪,还有一些来自阿姆斯特丹的 IP。”
听起来你可能有人试图闯入你的系统,也许这些是没有关闭的连接。我喜欢使用 perfmon 和 profiler 来查看问题的建议。
【讨论】:
以上是关于奇怪的间歇性 SQL 连接错误,重新启动时修复,3-5 天后恢复 (ASP.NET)的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 Xcode 10 中的“XCtests 间歇性无法在模拟器中启动应用程序”
如何使用 EmbeddedKafkaRule/EmbeddedKafka 设置 Spring Kafka 测试以修复 TopicExistsException 间歇性错误?