欢迎进入c/c++编程社区论坛,与300万技术人员互动交流 >>进入 在qq群里面有人说自己的数据库恢复模式自动被修改了,但是没有job也没有人修改,问我是否查出到底发生了什么。 其实在sql server error log里面会记录数据库恢复模式被更改的信息。比如我运行下
欢迎进入c/c++编程社区论坛,与300万技术人员互动交流 >>进入
在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 trace和error log的信息结合起来,就可以获得更为详细的资料,从而找到当时运行的脚本,用户名,应用程序名称。
这里面有一个问题,默认情况下sp_readerrorlog只获得当前的错误日志,但是可能错误信息不在这个日志里面。所以下面的脚本使用存储过程sp_enumerrorlogs循环所有的日志文件。
脚本如下:
--查询所有的错误日志文件找到修改recovery mode的信息,由于error log肯能被recycle,
--所以我们用undocomented存储过程mastersp_enumerrorlogs循环所有的错误日志文件
set nocount on
declare @searchstring1 varchar(255)
declare @searchstring2 varchar(255)
set @searchstring1 = 'recovery'
set @searchstring2 = 'option'
declare @logs table (logno int, startdate datetime, filesize int)
declare @results table (logfileno int, logdate datetime, processinfovarchar(20),text varchar(max))
insert into @logs exec mastersp_enumerrorlogs
declare clogs cursor for select logno from @logs
declare @logno int
open clogs
fetch clogs into @logno
while @@fetch_status =0
begin
insertinto @results(logdate, processinfo, text)
execsp_readerrorlog@logno,1, @searchstring1,@searchstring2
update@resultsset logfileno =@lognowhere logfileno isnull
fetchclogsinto @logno
end
deallocate clogs
select * from @results
---循环所有的defaulttrace文件
declare @logfile varchar(max)
set @logfile =(select path from sys.traces where is_default=1)
set @logfile = left(@logfile,len(@logfile) - charindex('_',reverse(@logfile))) + '.trc'
--将日志文件和trace文件关联,这样就可以获得当时修改recovery mode的代码,loginid,hostname 等等。
select starttime,*
from fn_trace_gettable(@logfile,null) t
join @results r on t.starttime between dateadd(ms,-150,r.logdate) and dateadd(ms,150,r.logdate)
andt.spid = substring(r.processinfo,5,10) --required to enable ahash join to be used
where t.eventclass = 164
and eventsubclass = 1