日期:2014-05-16  浏览次数:20496 次

查询谁修改了数据库的恢复模式

QQ群里面有人说自己的数据库恢复模式自动被修改了,但是没有JOB也没有人修改,问我是否查出到底发生了什么。

 

其实在SQL Server Error Log里面会记录数据库恢复模式被更改的信息。比如我运行下面的脚本:

 

alter database sql2008 set recovery simple

go

alter database sql2008 set recovery full

 

然后用sp_readerrorlog可以看到下面的信息:

 

2013-09-1309:57:45.200        spid51      Settingdatabase option RECOVERY to SIMPLEfor database sql2008.

2013-09-1309:57:48.980        spid51      Settingdatabase option RECOVERY to FULLfor database sql2008.

 

可以看到Error Log获得的信息比较少无法确切知道当时是谁执行的,命令代码,应用程序是什么。但是在Default Trace中会记录对象的变更,事件类为 164,修改数据库的恢复模式也会被记录到这个事件。如果将Default TraceError Log的信息结合起来,就可以获得更为详细的资料,从而找到当时运行的脚本,用户名,应用程序名称。

 

这里面有一个问题,默认情况下sp_readerrorlog只获得当前的错误日志,但是可能错误信息不在这个日志里面。所以下面的脚本使用存储过程sp_enumerrorlogs循环所有的日志文件。

 

脚本如下:

 

--查询所有的错误日志文件找到修改Recovery Mode的信息,由于Error Log肯能被Recycle

--所以我们用Undocomented存储过程master..sp_enumerrorlogs循环所有的错误日志文件

 

set nocount on

 

declare @searchString1 varchar(255)

 

declare @searchString2 varchar(255)

 

set @searchString1 = 'RECOVERY'

 

set @searchStr