SQL 追蹤

SQL追蹤(SQL Trace)是一個輕量級的追蹤工具,按照事件(Events)記錄數據庫發生的消息,幾乎對數據庫性能沒有什麼影響。SQL Server內置一個Trace,稱做默認追蹤(Default Trace),默認追蹤的ID是1,你們常常使用的SQL Server Profiler,就是利用SQL Trace記錄數據庫活動的一個工具。SQL Trace在SQL Server數據庫引擎種出現的比較早,能夠被性能和功能更卓越的擴展事件(Extended Events)取代。html

一,查看默認追蹤是否啓用sql

默認追蹤是系統內置的,TraceID是1,默認是開啓的,能夠經過系統配置表 sys.configurations 進行查看,配置項ID(configuration_id)是1568:數據庫

字段 value=1,表示Default Trace是開啓的。ide

二,禁用或啓用默認追蹤函數

若是默認追蹤被禁用,須要從新配置啓用默認追蹤:工具

exec sp_configure 'show advanced options' , 1 ;
go
reconfigure;
go

exec sp_configure 'default trace enabled' , 1 ;
go
reconfigure;
go

若是默認追蹤已經啓用,能夠從新配置禁用默認追蹤:post

exec sp_configure 'default trace enabled' , 0 ;
go
reconfigure;
go

exec sp_configure 'show advanced options' , 0 ;
go
reconfigure;
go

三,查看默認追蹤的信息性能

默認追蹤記錄的數據存儲在文件中,能夠從系統視圖 sys.traces查看文件的路徑,文件的大小(Size)和文件的更新方式等信息,追蹤文件默認的擴展名是 .trc。url

select id
    ,iif(status=1,'running','stopped') as status
    ,path
    ,max_size
    ,start_time
    ,stop_time
    ,event_count
    ,max_files
    ,is_rowset
    ,is_rollover
    ,is_shutdown
    ,is_default
    ,buffer_count
    ,buffer_size as each_buffer_size
from sys.traces
where id=1

默認追蹤有5個跟蹤文件,每個文件的最大size默認是20MB,SQL Server負責維護這5個文件,當實例重啓的時候或者到達文件Size最大值的時候,SQL Server建立新的文件,將最先建立的跟蹤文件刪除,依次滾動(Rollover)更新。spa

四,查看追蹤文件的內容

函數sys.fn_trace_gettable,用於從追蹤文件中讀取數據,以關係表的格式顯式:

sys.fn_trace_gettable ( 'filename' , number_files )

參數filename:用於指定追蹤文件的名稱,其值能夠從系統視圖sys.traces 中的path獲取;

參數number_files:若是number_files 被指定爲default,函數讀取全部的滾動文件。

函數返回的是關係表,有效字段是:追蹤關聯的事件綁定的字段,

select * 
from sys.fn_trace_gettable(N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Log\log_4.trc',default)

五,查看默認追蹤記錄的事件列表

函數fn_trace_geteventinfo(trace_id)返回追蹤關聯的事件列表,使用該函數能夠查看默認追蹤記錄的事件和事件的特定字段:

select categ.name as category,
    te.trace_event_id as event_id, 
    te.name as event_name,
    tc.trace_column_id as event_column_id,
    tc.name as column_name,
    tc.type_name as column_type
from sys.fn_trace_geteventinfo(1) as gei
inner join sys.trace_columns tc 
    on gei.columnid=tc.trace_column_id
inner join sys.trace_events te 
    on gei.eventid=te.trace_event_id
inner join sys.trace_categories categ
    on te.category_id=categ.category_id
order by category,event_id,event_column_id

六,查看事件和Category

Category用於組織事件(Event),是事件的分組,在SQL Server 2012中,共有21個Category,180個Event,每一個Event屬於惟一的一個Category。

select tc.name as category,
    te.trace_event_id as event_id,
    te.name as event_name
from sys.trace_categories tc 
inner join sys.trace_events te 
    on tc.category_id=te.category_id
order by category,event_id

七,查看事件綁定的字段

在SQL Server 2012中,事件共有66個字段,但不是每一個Event都能綁定全部的66個字段,每一個Event可以綁定的字段是固定的,系統預先設置,用戶不能修改,視圖 sys.trace_event_bindings 用於顯示每一個事件綁定的字段。

select te.trace_event_id as event_id, 
    te.name as event_name,
    tc.trace_column_id as column_id,
    tc.name as column_name,
    tc.type_name as column_type
from sys.trace_event_bindings teb 
inner join sys.trace_columns tc 
    on teb.trace_column_id=tc.trace_column_id
inner join sys.trace_events te 
    on teb.trace_event_id=te.trace_event_id
order by event_id,column_id

八,使用SQL Server Profiler建立SQL Trace

若是用戶須要建立自定義的追蹤,那麼可使用系統提供的存儲過程來實現,可是,使用TSQL代碼建立追蹤的過程十分繁瑣,代碼量龐大,整個過程不直觀。你們知道,SQL Server Profiler是一個可視化用於查看數據庫活動的工具,同時,它也是一個用於建立SQL Trace的工具。使用SQL Server Profiler建立SQL Trace的過程十分簡單:選擇相應的事件和事件的字段以後,導出SQL Trace  的定義便可。

在建立SQL Trace以後,點擊File->Export->Scipt Trace Definition,把SQL Server Profiler用於建立SQL Trace的腳本代碼導出:

導出的腳本以下,不能直接使用,必須修改一處代碼:在建立Trace時,指定存儲追蹤數據的文件(File) 或 關係表(Table),僅此而已。

-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
set @maxfilesize = 5

-- Client side File and Table cannot be scripted
exec @rc = sp_trace_create @TraceID output, 0, N'InsertFileNameHere', @maxfilesize, NULL 
if (@rc != 0) goto error

-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 14, 1, @on
exec sp_trace_setevent @TraceID, 14, 9, @on

--delete many commands here ---

-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint
exec sp_trace_setfilter @TraceID, 1, 0, 6, N'%drop%'

-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1

-- display trace id for future references
select TraceID=@TraceID
goto finish

error: 
select ErrorCode=@rc

finish: 
go
View Code

 

注:SQL Trace是被擴展事件取代的功能,在後續的版本中將會被移除,建議在之後的開發中使用擴展事件。

 

參考文檔:

SQL Trace

Server-wide Configuration Catalog Views (Transact-SQL)

System Trace Functions

SQL Server 默認跟蹤(Default Trace)

SQL Server中關於跟蹤(Trace)那點事

相關文章
相關標籤/搜索