用过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只维护5个log.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 events、Database event、Serror events、Full text events、Object creation、Object deletion、Object 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)
=====================================================================================
本文只代表本人的见解,可能存在错误,仅用于技术交流。如果你喜欢该文,可以扫下面的二维码打赏我(打赏敬请备注“博客园打赏”五字)。
