欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL Server基础之默认跟踪

程序员文章站 2022-03-18 14:57:29
用过SQL Server Profiler的都知道,它可以跟踪SQL Server,并将SQL Server执行过的SQL显示在界面。默认跟踪(Default Trace)便是集成在SQL Server中,和SQL Server Profiler功能类似的一项服务,它的结果记录在log.trc文件中 ......

    用过sql server profiler的都知道,它可以跟踪sql server,并将sql server执行过的sql显示在界面。默认跟踪(default trace)便是集成在sql server中,和sql server profiler功能类似的一项服务,它的结果记录在log.trc文件中。顾名思义,默认跟踪(default trace)默认开启,若不想使用需要手动关闭。

--查看默认跟踪是否开启,value=1表示开启。
select value 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
--关闭默认跟踪
sp_configure 'default trace enabled' , 0 ;
go
reconfigure;
go
sp_configure 'show advanced options' , 0 ;
go
reconfigure;
go

    sql server只维护5log.trc文件,每个最大20m,实行滚动更新机制,即在5个文件都达到20m或者sql server实例重启时,删除最早建立的,重新生成一个新的log.trc文件。因为这个规则,导致只能查询到最近一段时间的跟踪记录,并且sql server越忙碌,可查询时间越短。这当然成为默认跟踪的一个缺点。不过,可以通过使用代理定时读取log.trc文件或者在服务器上使用小软件定时将log.trc文件复制到其他目录的方式进行弥补

--获取正在使用的log.trc文件路径
--:: 是必须的。
select value from ::fn_trace_getinfo(0) where property=2
--读取正在被sql server使用的log.trc跟踪文件
--此段sql将返回一个行集
declare @logtrcwenjianlujing nvarchar(4000) select @logtrcwenjianlujing=convert(nvarchar(4000),value) from ::fn_trace_getinfo(0) where property=2 select * from ::fn_trace_gettable(@logtrcwenjianlujing,default)
--此段sql读取最早一个trc文件

--获取正在使用的trc文件路径
declare @zhengzaishiyongdetrcwenjianlujing nvarchar(4000)
select @zhengzaishiyongdetrcwenjianlujing=convert(nvarchar(4000),value) from ::fn_trace_getinfo(0) where property=2

/*默认跟踪结果文件都是类似"log_87.trc"这样的文件名,log_+数字,其后数字滚动加一,即创建新文件时,它的命名是"log_88.trc"
根据这个特性,可以逆推取得最早一个trc文件*/
declare @weizhi int
declare @bianliangchangdu int
set @bianliangchangdu=len(@zhengzaishiyongdetrcwenjianlujing)
set @weizhi= @bianliangchangdu-charindex('\',reverse(@zhengzaishiyongdetrcwenjianlujing))+1

--获取的除去.trc后缀的文件名
declare @zhengzaishiyongdetrcwenjianming nvarchar(250)
select @zhengzaishiyongdetrcwenjianming=replace(lower(right(@zhengzaishiyongdetrcwenjianlujing,@bianliangchangdu-@weizhi)),'.trc','')

--获取正在使用的文件名中的数字并减去4组合log_获得最早一个trc文件名
declare @zuizaotrcwenjianming nvarchar(250)
set @zuizaotrcwenjianming='log_'+convert(nvarchar(250), convert(int,right(@zhengzaishiyongdetrcwenjianming,len(@zhengzaishiyongdetrcwenjianming)-charindex('_',@zhengzaishiyongdetrcwenjianming))-4))

--获取最早文件路径
declare @zuizaotrcwenjianlujing nvarchar(4000)
select @zuizaotrcwenjianlujing=replace (@zhengzaishiyongdetrcwenjianlujing,@zhengzaishiyongdetrcwenjianming,@zuizaotrcwenjianming)

--读取最早一个trc文件
select * from ::fn_trace_gettable(@zuizaotrcwenjianlujing,default)

    默认跟踪较sql server profile轻量许多,自然也没有sql server profile功能强大。它不会跟踪所有事件,但比较关键的信息,如:auditing eventsdatabase eventserror eventsfull text eventsobject creationobject deletionobject alteration,都有跟踪,足以满足基本需求

 

参考文献:

https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ms173875%28v%3dsql.105%29

https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ms188425(v%3dsql.105)

 

=====================================================================================
本文只代表本人的见解,可能存在错误,仅用于技术交流。如果你喜欢该文,可以扫下面的二维码打赏我(打赏敬请备注“博客园打赏”五字)。

SQL Server基础之默认跟踪