<a href="http://www.cnblogs.com/gaizai/p/3358998.html#_labelContents">本文所涉及的内容(Contents)</a>
<a href="http://www.cnblogs.com/gaizai/p/3358998.html#_labelContexts">背景(Contexts)</a>
<a href="http://www.cnblogs.com/gaizai/p/3358998.html#_labelRudimentary">基礎知識(Rudimentary Knowledge)</a>
<a href="http://www.cnblogs.com/gaizai/p/3358998.html#_labelDefaultTrace">檢視預設跟蹤資訊(Default Trace)</a>
<a href="http://www.cnblogs.com/gaizai/p/3358998.html#_labelAddon">補充說明(Addon)</a>
<a href="http://www.cnblogs.com/gaizai/p/3358998.html#_labelReferences">參考文獻(References)</a>
思考這樣的場景:資料庫的表、存儲過程經常别修改,當這些修改造成BUG的時候,很多開發都不承認是他們幹的,那我們有沒辦法找出誰幹的呢?
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)。
雖然可以通過上面的方式找到相關的操作,但是它有兩個缺點:
1) log.trc檔案是滾動更新檔案,所有有可能會被系統删除,你找不了太久的資料;
2) 有些操作你可能是後知後覺,出了問題才會去找問題,我們應該主動去監控這些DDL;
預設追蹤是在SQL Server 2005中首次出現的新功能,它提供了審計模式修改的功能,例如表建立、存儲過程删除等類似過程。預設情況下它是運作的,但是你可以通過sp_configure來啟用和停用它。
預設跟蹤日志可以通過 SQL Server Profiler打開并檢視,或者通過 Transact-SQL 使用 fn_trace_gettable 系統函數查詢傳回一個表,并且可以對表資料進行過濾、篩選。
預設跟蹤能幫助我們跟蹤什麼有用的資訊呢?你可以檢視到如下幾個内容:
下面主要看看在我們日常使用DDL的過程中,預設跟蹤會記錄些什麼東西:
(一) 檢查Default Trace是否已經開啟,如果傳回Figure1中value為1,那就說明已經開啟預設跟蹤了;如果value為0表示關閉預設跟蹤;
(Figure1:default trace enabled資訊)
(二) 如果預設跟蹤是關閉的,可以通過下面的方式進行開啟和測試:
(三) 擷取目前正在使用的log.trc滾動更新檔案的路徑:
(Figure2:log.trc檔案路徑)
選項property值代表的意義:
1:trace options,有2(滾動檔案)、4、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。
(Figure3:Create事件前半部分資訊)
(Figure4:Create事件後半部分資訊)
(五) 接着測試修改表所産生的事件跟蹤日志,首先我們人為的生成一個修改表的事件,為Trace_log表添加一列,把上面的Script1腳本Where的e.[trace_event_id] = 46替換為e.[trace_event_id] = 164,這樣就可以檢視Alter對象的資訊,EventName為Object:Altered。
(Figure5:Alter事件前半部分資訊)
(Figure6:Alter事件後半部分資訊)
(六) 接着測試修改表所産生的事件跟蹤日志,首先我們人為的生成一個删除表的事件,再把上面的Script1腳本Where的e.[trace_event_id] = 46替換為e.[trace_event_id] = 47,這樣就可以檢視Drop對象的資訊,EventName為Object: Deleted。
(Figure7:Drop事件後半部分資訊)
1. 對于log.trc檔案,好像隻保留5個檔案,什麼地方可以設定?檔案的大小預設為20MB,有沒地方可以設定?SQL Server隻會維護5個Trace檔案,最大為20M。當SQL Server重新啟動或者達到最大值之後會生成新的檔案,将最早的Trace檔案删除。
(Figure8:log*.trc檔案)
(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檔案夾中的這些是系統預設進行跟蹤的。
4. 關于fn_trace_gettable系統函數的參數,有必要在這裡講講,為了看到不同參數對讀取檔案的影響,這裡使用下面的SQL腳本進行測試,傳回COUNT(1) 檢視讀取檔案的差異性。
1) 以@tracefile檔案作為起始,往後讀取1個滾動更新檔案,1為這個檔案本身;
2) 以@tracefile檔案作為起始,往後讀取2個滾動更新檔案;
3) 以@tracefile檔案作為起始,0、-1、default都是表示往後讀取所有檔案;
6. Default Trace不會跟蹤所有的事件,它撲捉一些關鍵性資訊,包括auditing events,database events,error events,full text events,object creation,object deletion,object alteration。
(Figure10:trace_event_id資訊)
8. 關于Script1腳本:FROM fn_trace_gettable(@tracefile, DEFAULT) gt中@tracefile變量表示跟蹤日志檔案路徑的寫法,還可以使用下面的方式,但是有點需要注意,下面的方式傳回的是目前正在使用的滾動更新檔案開始查找,而Script1的是以曆史滾動第一個檔案開始查找。
9. 如何擷取某個Trace跟蹤了哪些Event和column呢?
(Figure11:某Trace資訊)
10. DBCC TRACEON (xxx);這種跟蹤标記和Default Trace有什麼關系嘛?
<a href="http://www.cnblogs.com/DBFocus/archive/2010/05/19/1739535.html">SQL Server 2005 - Default Trace (預設跟蹤)</a>
<a href="http://blog.csdn.net/smithliu328/article/details/8087458">使用Default Trace檢視誰還原了你的資料庫?</a>
<a href="http://book.51cto.com/art/201103/247459.htm">The Default Trace</a>
<a href="http://technet.microsoft.com/zh-cn/magazine/ms175513(de-de,SQL.90).aspx">default trace enabled (Option)</a>
<a href="http://wenku.baidu.com/view/f89d72f8941ea76e58fa0461.html">SQL SERVER跟蹤功能</a>
<a href="http://hi.baidu.com/luck001221/item/23ada85397e5a59709be17d3">Trace 的一些另類的應用</a>
<a href="http://gallery.technet.microsoft.com/scriptcenter/Read-Default-Trace-ae068150">Read Default Trace</a>
<a href="http://msdn.microsoft.com/en-us/library/aa258856(v=sql.80).aspx">fn_trace_gettable</a>
<a href="http://technet.microsoft.com/zh-cn/library/ms188425(v=sql.105).aspx">fn_trace_gettable (Transact-SQL)</a>
<a href="http://msdn.microsoft.com/en-us/library/aa260314(v=sql.80).aspx">sp_trace_setevent</a>
<a href="http://msdn.microsoft.com/en-us/library/ms180953.aspx">ObjectType Trace Event Column</a>
<a href="http://technet.microsoft.com/zh-cn/library/ms191006(v=sql.105).aspx">SQL 跟蹤簡介</a>
<a href="http://support.microsoft.com/kb/912914/zh-cn">如何使用存儲的過程來監視 SQL Server 2005 中的跟蹤</a>
<a href="http://technet.microsoft.com/zh-cn/library/ms190362(v=SQL.90).aspx">sp_trace_create (Transact-SQL)</a>