數(shù)據(jù)庫恢復(fù)模式自動(dòng)被修改了,但是沒有JOB也沒有人修改,是否查出到底發(fā)生了什么。其實(shí)在SQL Server Error Log里面會(huì)記錄數(shù)據(jù)庫恢復(fù)模式被更改的信息。比如我運(yùn)行下面的腳本:
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獲得的信息比較少無法確切知道當(dāng)時(shí)是誰執(zhí)行的,命令代碼,應(yīng)用程序是什么。但是在Default Trace中會(huì)記錄對(duì)象的變更,事件類為 164,修改數(shù)據(jù)庫的恢復(fù)模式也會(huì)被記錄到這個(gè)事件。如果將Default Trace和Error Log的信息結(jié)合起來,就可以獲得更為詳細(xì)的資料,從而找到當(dāng)時(shí)運(yùn)行的腳本,用戶名,應(yīng)用程序名稱。
托福答案 這里面有一個(gè)問題,默認(rèn)情況下sp_readerrorlog只獲得當(dāng)前的錯(cuò)誤日志,但是可能錯(cuò)誤信息不在這個(gè)日志里面。所以下面的腳本使用存儲(chǔ)過程sp_enumerrorlogs循環(huán)所有的日志文件。
腳本如下:
--查詢所有的錯(cuò)誤日志文件找到修改Recovery Mode的信息,由于Error Log肯能被Recycle,
--所以我們用Undocomented存儲(chǔ)過程mastersp_enumerrorlogs循環(huán)所有的錯(cuò)誤日志文件
托福答案 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
---循環(huán)所有的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文件關(guān)聯(lián),這樣就可以獲得當(dāng)時(shí)修改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