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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

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

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

 

alterdatabase sql2008 setrecovery simple

go

alterdatabase sql2008 setrecovery 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循环所有的错误日志文件

setnocounton

 

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),Textvarchar(max))

 

insertinto @logs EXECmaster..sp_enumerrorlogs

declare cLogs  cursorforselect LogNo from @logs 

 

declare @LogNo  int

 

open cLogs 

 

fetch cLogs  into @LogNo 

 

while @@fetch_status=

 

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  =(selectpathfromsys.traceswhere is_default=1)

 

set @logFile  =left(@logFile,len(@LogFile)-charindex('_',reverse(@LogFile)))+'.trc'

 

--将日志文件和Trace文件关联,这样就可以获得当时修改Recovery Mode的代码,LoginIDHOSTNAME 等等。

select starttime,*

 

fromfn_trace_gettable(@logFile,null) t 

 

join @results r  on  t.StartTime betweendateadd(ms,-150,r.logDate)anddateadd(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 

原始脚本来自于:http://sqlblogcasts.com/blogs/simons/archive/2011/04/27/how-to-find-out-when-a-db-recovery-model-was-changed.aspx

 

 

 本文转自 lzf328 51CTO博客,原文链接:http://blog.51cto.com/lzf328/1296231



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5天前
|
SQL 关系型数据库 MySQL
学成在线笔记+踩坑(3)——【内容模块】课程分类查询、课程增改删、课程计划增删改查,统一异常处理+JSR303校验
课程分类查询、课程新增、统一异常处理、统一封装结果类、JSR303校验、修改课程、查询课程计划、新增/修改课程计划
学成在线笔记+踩坑(3)——【内容模块】课程分类查询、课程增改删、课程计划增删改查,统一异常处理+JSR303校验
|
5天前
|
前端开发 应用服务中间件 API
|
6天前
|
存储 SQL 数据库
数据库模式(Schema)
数据库模式(Schema)
|
4天前
|
存储 SQL 数据库
数据库模式(Schema)
数据库模式(Schema)
|
14天前
|
存储 SQL 数据库
数据库模式(Schema)
数据库模式(Schema)
|
12天前
|
存储 SQL 数据库
数据库模式(Schema)
数据库模式(Schema)
|
10天前
|
存储 SQL 数据库
数据库模式(Schema)
数据库模式(Schema)
|
13天前
|
存储 关系型数据库 MySQL
如何优化数据库查询?
如何优化数据库查询?
32 1
|
18天前
|
存储 SQL 数据库
数据库模式(Schema)
数据库模式(Schema)
|
16天前
|
存储 SQL 数据库
数据库模式(Schema)
数据库模式(Schema)