我们目前在SQL 2005数据库服务器上每天大约发生一次问题,尽管它发生的时间并不一致。
基本上,数据库会停止运行,并开始拒绝连接以及以下错误消息。这包括登录SSMS:
已成功与服务器建立连接,但在登录过程中出错。 (提供者:TCP提供者,错误:0 - 指定的网络名称不再可用。)
我们对SQL的CPU使用率通常在15%左右,但是当数据库处于断开状态时,它大约为70%,所以即使没有人可以连接,它显然也会做一些事情。即使我禁用了使用数据库的Web应用程序,CPU仍然不会停机。
我无法重新启动SQLSERVER进程,因为它没有响应,因此我必须手动终止进程,然后将数据库置于可疑/恢复模式(我可以修复但这很痛苦)。
以下是我在数据库处于崩溃状态时收集的一些PerfMon统计数据,这可能有所帮助。如果人们想要请求,我还有更多:
我猜他们的关键是找出数据库正在使用它的CPU,但由于我甚至无法登录SSMS,因此使用标准方法是不可能的。
令人不安的是,我甚至无法使用专用的管理连接进入SSMS。我得到与所有其他请求相同的时间。
非常感谢任何建议,推荐或甚至同情!
答案 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:您可以使用它来找出问题所在