如果没有启用 SQL SERVER 的跟踪器来跟踪 SQL SERVER 的 SQL 执行情况,又想查最近的 SQL 执行情况,网上一般说是使用 LogExprorer 这个工具,网上找了这个工具很久也没有找到。
今天找了到了一篇文章,原因 SQL SERVER 现在有个默认跟踪文件,默认情况下,是启用了 SQL 的跟踪:
https://www.cnblogs.com/DBFocus/archive/2010/05/19/1739535.html
首先使用 select * from sys.configurations where configuration_id = 1568 查一下是否默认有打开默认跟踪,我查询了几台服务器,默认都是打开的,说明这个功能默认是打开的。
如果没有打开,就使用:
sp_configure 'show advanced options', 1;
go
reconfigure;
go
sp_configure 'default trace enabled', 1;
go
reconfigure;
go
来打开。
使用 select * from ::fn_trace_getinfo(0) 可以获取跟踪文件保存的路径,默认跟踪的数据保存在文件中。
使用以下语句查询相关的信息:
select * from from ::fn_trace_gettable('C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\log.trc',0)
整理一个:
select
loginname,
loginsid,
spid,
hostname,
applicationname,
servername,
databasename,
objectname,
e.category_id,
cat.name as [CategoryName],
textdata,
starttime,
eventclass,
eventsubclass, --0表示begin,1表示commit
e.name as EventName
from ::fn_trace_gettable('C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\log.trc',0)
inner join sys.trace_events e
on eventclass = trace_event_id
inner join sys.trace_categories as cat
on e.category_id = cat.category_id
where databasename = 'TraceDB' and
objectname is null and --根据objectname来过滤
e.category_id = 5 and --category 5表示对象
e.trace_event_id = 46 --trace_event_id: 46表示Create对象,47表示Drop对象,164表示修改对象
查询修改表的信息:
where databasename = 'TraceDB' and
objectname = 'MyTable' and
e.category_id = 5 and
e.trace_event_id = 164
查义删除表的信息:
where databasename = 'TraceDB' and
objectname = 'MyTable' and
e.category_id = 5 and
e.trace_event_id = 47
Default Trace还能跟踪到其他一些事件。例如你的日志文件快速增长,这时需要知道其原因。Default Trace会捕获日志增长事件,这对于排查问题很有价值。下面的查询会获得Default Trace中所有的log auto growth事件。
select
loginname,
loginsid,
spid,
hostname,
applicationname,
servername,
databasename,
objectname,
e.category_id,
cat.name,
textdata,
starttime,
endtime,
duration,
eventclass,
eventsubclass,
e.name as EventName
from ::fn_trace_gettable('C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\log.trc',0)
inner join sys.trace_events e
on eventclass = trace_event_id
inner join sys.trace_categories as cat
on e.category_id = cat.category_id
where databasename = 'TraceDB' and
e.category_id = 2 and --categroy 2表示database
e.trace_event_id = 93 --93表示日志文件自动增长事件
与跟踪相关的函参考:
https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ff848738(v=sql.105)