目前我遇到了在两个SQL Server实例上循环错误日志的问题,因为该文件正由另一个进程使用。简单我知道,但是,当你试图杀死SPID时,它会挂起,我们被迫重启实例,我想不惜一切代价避免它。为了给你一些背景知识,我们使用sqldm来监控数据库,并收到一条消息,告知我们的错误日志达到了最大大小阈值并循环错误日志。我执行时
exec sp_cycle_errorlog
我被告知以下信息:
消息17049,级别16,状态1,过程sp_cycle_errorlog,第9行
由于操作系统错误'32(无法进程),无法将错误日志文件从'J:\ MSSQL10.SQL6 \ MSSQL \ Log \ ERRORLOG.1'循环到'J:\ MSSQL10.SQL6 \ MSSQL \ Log \ ERRORLOG.2'访问该文件,因为它正被另一个进程使用。)'。 SQL Server外部的进程可能阻止SQL Server读取文件。因此,错误日志条目可能会丢失,并且可能无法查看某些SQL Server错误日志。确保没有其他进程使用只写访问权限锁定文件。DBCC执行完成。如果DBCC打印了错误消息,请与系统管理员联系。
然后我在实例A中运行了以下查询,发现sqldm有一个活动进程。
SELECT *
FROM sys.dm_exec_requests a
OUTER APPLY sys.dm_exec_sql_text(a.sql_handle) b
WHERE session_id > 50
and session_id <> @@spid AND( text = 'xp_readerrorlog' OR text = 'sp_cycle_errorlog')
ORDER BY start_time a
就像我之前说的那样,当我杀死SPID时,它会挂起并保持回滚状态(该过程不会回滚)。我的同事之前在同一个实例上遇到过这个问题,并联系了Idera寻求支持,这里是他们的回答“开发团队提供了有关此案例的更新。在查看代码后,SQLdm只读取每个集合中的SQL日志信息,并且不要锁定此资源。鉴于您描述的行为,这可能是SQL Server 2008“
的问题我认为他们是对的,因为我们在这两个例子中只看到了这一点。使用sqldm的所有其他实例都没有报告此问题,这使我相信它是导致它的MS SQL Server。这就是我被困住的地方,那就是试图找出为什么锁定这个文件以及出于什么原因。我昨天使用Process explorer搜索通过Find DLL and Handle窗口使用ERRORLOG的任何进程,并且有多个进程触及此文件。当我今天看时,我现在看到此文件的锁定,我仍然无法循环错误日志。我在上面运行了slect查询,我仍然在两个实例中都看到了sqldm SPID。我很想知道是否有其他人在使用sqldm之前是否遇到过这个问题。任何信息都有助于跟踪此问题。
提前谢谢。