SQL Server阻止问题

时间:2010-04-14 11:33:04

标签: sql sql-server sql-server-2005

我们目前在SQL 2005数据库服务器上每天大约发生一次问题,尽管它发生的时间并不一致。

基本上,数据库会停止运行,并开始拒绝连接以及以下错误消息。这包括登录SSMS:

已成功与服务器建立连接,但在登录过程中出错。 (提供者:TCP提供者,错误:0 - 指定的网络名称不再可用。)

我们对SQL的CPU使用率通常在15%左右,但是当数据库处于断开状态时,它大约为70%,所以即使没有人可以连接,它显然也会做一些事情。即使我禁用了使用数据库的Web应用程序,CPU仍然不会停机。

我无法重新启动SQLSERVER进程,因为它没有响应,因此我必须手动终止进程,然后将数据库置于可疑/恢复模式(我可以修复但这很痛苦)。

以下是我在数据库处于崩溃状态时收集的一些PerfMon统计数据,这可能有所帮助。如果人们想要请求,我还有更多:

  • 有效交易:2(从不
  • 更改)逻辑连接:34(NC)
  • 处理已阻止:16(NC)用户
  • 连接:30(NC)批量请求:0
  • (NC)活动作业:2(NC)日志
  • 截断:596(NC)Log Shrinks:24
  • (NC)持续时间最长的交易
  • 时间:99(NC)

我猜他们的关键是找出数据库正在使用它的CPU,但由于我甚至无法登录SSMS,因此使用标准方法是不可能的。

令人不安的是,我甚至无法使用专用的管理连接进入SSMS。我得到与所有其他请求相同的时间。

非常感谢任何建议,推荐或甚至同情!

3 个答案:

答案 0 :(得分:1)

您需要使用Profiler来确定可能导致此问题的查询和进程。

答案 1 :(得分:1)

虽然它阻止了正常连接,但您可能希望尝试使用Dedicated Admin Console连接。您将需要在数据库服务器的sysadmin角色中实现此目的,在SSMS中指定服务器名称前缀时使用“admin:” - 这使用不太可能被阻止的不同连接(但并非不可能,只是采取极端情况。)

默认情况下,您不应该使用此DAC,您可以访问系统表和其他您无法正常看到的项目,因此您也可以使用它进行大量破坏。

进入后,您有一个正常的查询窗口,可以开始查看正在运行的内容,锁定的内容等。

答案 2 :(得分:1)

dedicated admin connection旨在帮助解决这些问题

然后,这个脚本可以告诉你open tran和SQL运行的是什么

SELECT s_tst.[session_id],
   s_es.[login_name] AS [Login Name],
   S_tdt.[database_transaction_begin_time] AS [Begin Time],
   s_tdt.[database_transaction_log_record_count] AS [Log Records],
   s_tdt.[database_transaction_log_bytes_used] AS [Log Bytes],
   s_tdt.[database_transaction_log_bytes_reserved] AS [Log Reserved],
   s_est.[text] AS [Last T-SQL Text],
   s_eqp.[query_plan] AS [Last Query Plan]
FROM sys.dm_tran_database_transactions s_tdt
   JOIN sys.dm_tran_session_transactions s_tst
      ON s_tst.[transaction_id] = s_tdt.[transaction_id]
   JOIN sys.[dm_exec_sessions] s_es
      ON s_es.[session_id] = s_tst.[session_id]
   JOIN sys.dm_exec_connections s_ec
      ON s_ec.[session_id] = s_tst.[session_id]
   LEFT OUTER JOIN sys.dm_exec_requests s_er
      ON s_er.[session_id] = s_tst.[session_id]
   CROSS APPLY sys.dm_exec_sql_text (s_ec.[most_recent_sql_handle]) AS s_est
   OUTER APPLY sys.dm_exec_query_plan (s_er.[plan_handle]) AS s_eqp
ORDER BY [Begin Time] ASC;

最后,SQL Server 2005有一个default trace running:您可以使用它来找出问题所在