SQL Server 默認跟蹤(Default Trace)

一.本文所涉及的內容(Contents)

  1. 本文所涉及的內容(Contents)
  2. 背景(Contexts)
  3. 基礎知識(Rudimentary Knowledge)
  4. 查看默認跟蹤信息(Default Trace)
  5. 補充說明(Addon)
  6. 參考文獻(References)

二.背景(Contexts)

  思考這樣的場景:數據庫的表、存儲過程常常別修改,當這些修改形成BUG的時候,不少開發都不認可是他們乾的,那咱們有沒辦法找出誰幹的呢?html

  SQL Server有Default Trace默認跟蹤,數據庫記錄信息到log.trc文件,能夠查看trace_event_id,46表示Create對象(Object:Created),47表示Drop對象(Object:Deleted),93表示日誌文件自動增加(Log File Auto Grow),164表示Alter對象(Object:Altered),20表示錯誤日誌(Audit Login Failed)。sql

  雖然能夠經過上面的方式找到相關的操做,可是它有兩個缺點:數據庫

    1) log.trc文件是滾動更新文件,全部有可能會被系統刪除,你找不了過久的數據;安全

    2) 有些操做你多是後知後覺,出了問題纔會去找問題,咱們應該主動去監控這些DDL;函數

  咱們可使用DDL觸發器主動監控DDL語句的執行,當有對數據庫執行DDL就會觸發,咱們把這些信息保存到表中,而且把操做用戶的HostName和修改的T-SQL以郵件的形式發送到指定的郵件。本文將講述使用Default Trace默認跟蹤解決上面的問題,DDL觸發器的方式能夠參考:SQL Server DDL觸發器運用SQL Server 數據庫郵件測試

三.基礎知識(Rudimentary Knowledge)

  默認追蹤是在SQL Server 2005中首次出現的新功能,它提供了審計模式修改的功能,例如表建立、存儲過程刪除等相似過程。默認狀況下它是運行的,可是你能夠經過sp_configure來啓用和停用它。this

  默認跟蹤日誌能夠經過 SQL Server Profiler打開並查看,或者經過 Transact-SQL 使用 fn_trace_gettable 系統函數查詢返回一個表,而且能夠對錶數據進行過濾、篩選。spa

  默認跟蹤能幫助咱們跟蹤什麼有用的信息呢?你能夠查看到以下幾個內容:.net

    1) 使用Default Trace查看誰還原了你的數據庫rest

    2) 數據庫中那些對象被created /altered /deleted

    3) 查找日誌文件快速增加的緣由

    4) 查看、過濾Login failed for user 'sa'等錯誤信息

四.查看默認跟蹤信息(Default Trace)

下面主要看看在咱們平常使用DDL的過程當中,默認跟蹤會記錄些什麼東西:

(一) 檢查Default Trace是否已經開啓,若是返回Figure1中value爲1,那就說明已經開啓默認跟蹤了;若是value爲0表示關閉默認跟蹤;

--查詢Default Trace是否開啓
SELECT * FROM sys.configurations WHERE configuration_id = 1568;

wps_clip_image-9845

(Figure1:default trace enabled信息)

 

(二) 若是默認跟蹤是關閉的,能夠經過下面的方式進行開啓和測試:

--開啓Default Trace
sp_configure 'show advanced options' , 1 ;
GO
RECONFIGURE;
GO
sp_configure 'default trace enabled' , 1 ;
GO
RECONFIGURE;
GO

--測試是否開啓
EXEC sp_configure 'default trace enabled';
GO

--關閉Default Trace
sp_configure 'default trace enabled' , 0 ;
GO
RECONFIGURE;
GO
sp_configure 'show advanced options' , 0 ;
GO
RECONFIGURE;
GO

 

(三) 獲取當前正在使用的log.trc滾動更新文件的路徑:

--獲取當前跟蹤文件的路徑
SELECT * FROM ::fn_trace_getinfo(0)

wps_clip_image-29635

(Figure2:log.trc文件路徑)

選項property值表明的意義:

  1:trace options,有2(滾動文件)、四、8(黑盒)三個值,請參考sp_trace_create;

  2:file name,更準確來講是trace文件的路徑;

  3:max file size,設置最大滾動文件大小,當達到這個值就會建立新的滾動文件;

  4:stop time,設置trace中止的時間;

  5:當前狀態(0=stopped, 1=running) ;

SQL Server2000中,使用fn_trace系列系統存儲過程時,須要在存儲過程名前加"::"標識;SQL Server2000中,僅當跟蹤被中止(stop)並關閉(close)後,跟蹤的內容纔會寫入文件中;

 

(四) 下面測試默認跟蹤是如何跟蹤最常使用的DDL腳本的。首先建立一個測試數據庫TraceDB,再建立一個測試表Trace_log,經過下面的腳本,默認跟蹤記錄了Figure3和Figure4的內容,EventName爲Object:Created。

--建立測試數據庫
USE MASTER
GO
CREATE DATABASE TraceDB

--經過建立表產生一個DDL事件
USE TraceDB
GO
CREATE TABLE dbo.Trace_log(
  Id INT IDENTITY(1,1) not null,
  Sometext CHAR(3) null
)

--Script1:返回剛剛Create操做的信息
-- =============================================
-- Author:        <聽風吹雨>
-- Create date:    <2013.05.03>
-- Description:    <讀取、過濾log.trc文件>
-- Blog:        <http://www.cnblogs.com/gaizai/>
-- =============================================
DECLARE @tracefile NVARCHAR(MAX) 
SET @tracefile = (SELECT LEFT([path],LEN([path])-CHARINDEX('\',REVERSE([path])))+ '\log.trc' FROM sys.traces WHERE [is_default] = 1) 
 
SELECT TOP 100
 gt.[HostName] 
,gt.[ServerName] 
,gt.[DatabaseName] 
,gt.[SPID] 
,gt.[ObjectName] 
,gt.[objecttype] [ObjectTypeID] 
,sv.[subclass_name] [ObjectType] 
,e.[category_id] [CategoryID] 
,c.[Name] [Category] 
,gt.[EventClass] [EventID] 
,e.[Name] [EventName] 
,gt.[LoginName] 
,gt.[ApplicationName] 
,gt.[StartTime] 
,gt.[TextData] 
FROM fn_trace_gettable(@tracefile, DEFAULT) gt 
LEFT JOIN sys.trace_subclass_values sv ON gt.[eventclass] = sv.[trace_event_id] AND sv.[subclass_value] = gt.[objecttype] 
INNER JOIN sys.trace_events e ON gt.[eventclass] = e.[trace_event_id] 
INNER JOIN sys.trace_categories c ON e.[category_id] = c.[category_id] 
WHERE gt.[spid] > 50 AND --50之內的spid爲系統使用
    gt.[DatabaseName] = 'TraceDB' AND --根據DatabaseName過濾
    gt.[ObjectName] = 'Trace_log' AND --根據objectname過濾
    e.[category_id]  = 5 AND --category 5表示對象,8表示安全
    e.[trace_event_id] = 46 --trace_event_id 46表示Create對象(Object:Created),47表示Drop對象(Object:Deleted),93表示日誌文件自動增加(Log File Auto Grow),164表示Alter對象(Object:Altered),20表示錯誤日誌(Audit Login Failed)
ORDER BY [StartTime] DESC

wps_clip_image-22331

(Figure3:Create事件前半部分信息)

wps_clip_image-4443

(Figure4:Create事件後半部分信息)

 

(五) 接着測試修改表所產生的事件跟蹤日誌,首先咱們人爲的生成一個修改表的事件,爲Trace_log表添加一列,把上面的Script1腳本Where的e.[trace_event_id] = 46替換爲e.[trace_event_id] = 164,這樣就能夠查看Alter對象的信息,EventName爲Object:Altered。

--經過修改表產生一個DDL事件
USE TraceDB
GO
ALTER TABLE Trace_log
ADD Col INT

--Script2:返回剛剛Alter操做的信息
WHERE gt.[spid] > 50 AND --50y如下的爲系統使用
    gt.[DatabaseName] = 'TraceDB' AND --根據DatabaseName過濾
    gt.[ObjectName] = 'Trace_log' AND --根據objectname過濾
    e.[category_id]  = 5 AND --category 5表示對象,表示安全
    e.[trace_event_id] = 164 --trace_event_id 46表示Create對象(Object:Created),47表示Drop對象(Object:Deleted),93表示日誌文件自動增加(Log File Auto Grow),164表示Alter對象(Object:Altered),20表示錯誤日誌(Audit Login Failed)
ORDER BY [StartTime] DESC

wps_clip_image-8525

(Figure5:Alter事件前半部分信息)

wps_clip_image-12980

(Figure6:Alter事件後半部分信息)

 

(六) 接着測試修改表所產生的事件跟蹤日誌,首先咱們人爲的生成一個刪除表的事件,再把上面的Script1腳本Where的e.[trace_event_id] = 46替換爲e.[trace_event_id] = 47,這樣就能夠查看Drop對象的信息,EventName爲Object: Deleted。

--經過刪除表產生一個DDL事件
USE TraceDB
GO
DROP TABLE Trace_log

wps_clip_image-1593

(Figure7:Drop事件後半部分信息)

五.補充說明(Addon)

1. 對於log.trc文件,好像只保留5個文件,什麼地方能夠設置?文件的大小默認爲20MB,有沒地方能夠設置?SQL Server只會維護5個Trace文件,最大爲20M。當SQL Server從新啓動或者達到最大值以後會生成新的文件,將最先的Trace文件刪除。

wps_clip_image-21031

(Figure8:log*.trc文件)

wps_clip_image-16855

(Figure9:log*.trc設置)

嘗試使用下面SQL對系統表進行更新失敗:exec sp_configure 'allow updates',1

此選項仍然存在於 sp_configure 存儲過程當中,可是其功能在 SQL Server 中不可用。 其設置不起做用。 從 SQL Server 2005 開始,不支持直接更新系統表。

 

2. 雙擊log.trc文件會以SQL Server Profiler方式打開,看到這裏是否是有熟悉的感受了?對的只不過咱們平時使用Profiler是自定義跟蹤事件,而保存在Log文件夾中的這些是系統默認進行跟蹤的。

 

3. 除了使用SQL Server Profiler自定義跟蹤以外,還可使用系統存儲過程:sp_trace_create、sp_trace_setevent等的T-SQL來建立跟蹤,詳情請參考:SQL 跟蹤簡介

 

4. 關於fn_trace_gettable系統函數的參數,有必要在這裏講講,爲了看到不一樣參數對讀取文件的影響,這裏使用下面的SQL腳本進行測試,返回COUNT(1) 查看讀取文件的差別性。

1) 以@tracefile文件做爲起始,日後讀取1個滾動更新文件,1爲這個文件自己;

2) 以@tracefile文件做爲起始,日後讀取2個滾動更新文件;

3) 以@tracefile文件做爲起始,0、-一、default都是表示日後讀取全部文件;

--定義文件路徑變量
DECLARE @tracefile NVARCHAR(MAX) 
SET @tracefile = (SELECT LEFT([path],LEN([path])-CHARINDEX('\',REVERSE([path])))+ '\log.trc' FROM sys.traces WHERE [is_default] = 1) 

--以@tracefile文件做爲起始,日後讀取1個滾動更新文件,1爲這個文件自己
SELECT COUNT(1) FROM ::fn_trace_gettable(@tracefile,1)
--以@tracefile文件做爲起始,日後讀取2個滾動更新文件
SELECT COUNT(1) FROM ::fn_trace_gettable(@tracefile,2)
--以@tracefile文件做爲起始,0、-一、default都是表示日後讀取全部文件
SELECT COUNT(1) FROM ::fn_trace_gettable(@tracefile,0)
SELECT COUNT(1) FROM ::fn_trace_gettable(@tracefile,-1)
SELECT COUNT(1) FROM ::fn_trace_gettable(@tracefile,default)

 

5. Default Trace不能代替DDL trigger的功能(參考:SQL Server 使用DDL Trigger防止數據庫修改)。默認跟蹤應被用做SQL實例的監視器,或用來快速得到SQL問題事件的詳細信息。

 

6. Default Trace不會跟蹤全部的事件,它撲捉一些關鍵性信息,包括auditing events,database events,error events,full text events,object creation,object deletion,object alteration。

 

7. 在Read Default Trace中描述了關於trace_event_id的信息:If you are interested in what the default trace has been setup to capture you can run this (Note you cannot edit the default trace!)。

--Script5:trace_event
SELECT *  
FROM fn_trace_geteventinfo(1) tg   
INNER JOIN sys.trace_events te ON tg.[eventid] = te.[trace_event_id]  
INNER JOIN sys.trace_columns tc ON tg.[columnid] = tc.[trace_column_id]
WHERE te.name like '%login%'

wps_clip_image-17291

(Figure10:trace_event_id信息)

另外查看Event類型的方式還能夠經過:sp_trace_setevent

 

8. 關於Script1腳本:FROM fn_trace_gettable(@tracefile, DEFAULT) gt中@tracefile變量表示跟蹤日誌文件路徑的寫法,還可使用下面的方式,可是有點須要注意,下面的方式返回的是當前正在使用的滾動更新文件開始查找,而Script1的是以歷史滾動第一個文件開始查找。

--當前滾動更新文件
FROM sys.fn_trace_gettable(CONVERT(VARCHAR(150),(SELECT TOP 1 f.[value]
    FROM sys.fn_trace_getinfo(NULL)f WHERE f.property= 2
    )), DEFAULT) gt

 

9. 如何獲取某個Trace跟蹤了哪些Event和column呢?

--獲取某個Trace跟蹤了哪些Event和column
DECLARE @traceid INT
SET @traceid = 1
SELECT TCA.category_id,TCA.name AS category_name
    ,TE.trace_event_id,TE.name AS trace_event_name
    ,TCO.trace_column_id,TCO.name AS trace_column_name
FROM fn_trace_geteventinfo(@traceid) AS EI
LEFT JOIN sys.trace_events AS TE
ON EI.eventid = TE.trace_event_id
LEFT JOIN sys.trace_categories AS TCA
ON TE.category_id = TCA.category_id
LEFT JOIN sys.trace_columns AS TCO
ON EI.columnid = TCO.trace_column_id
GO

wps_clip_image-10897

(Figure11:某Trace信息)

 

10. DBCC TRACEON (xxx);這種跟蹤標記和Default Trace有什麼關係嘛?

六.參考文獻(References)

SQL Server 2005 - Default Trace (默認跟蹤)

使用Default Trace查看誰還原了你的數據庫?

The Default Trace

default trace enabled (Option)

SQL SERVER跟蹤功能

Trace 的一些另類的應用

Read Default Trace

fn_trace_gettable

fn_trace_gettable (Transact-SQL)

sp_trace_setevent

ObjectType Trace Event Column

SQL 跟蹤簡介

如何使用存儲的過程來監視 SQL Server 2005 中的跟蹤

sp_trace_create (Transact-SQL)

相關文章
相關標籤/搜索