前言 一提到跟蹤倆字,很多人想到警匪片中的場景,同樣在我們的SQL Server資料庫中“跟蹤”也是無處不在的,如果我們利用好了跟蹤技巧,就可以針對某些特定的場景做定向分析,找出充足的證據來破案。 簡單的舉幾個應用場景: 線上生產庫為何突然宕機?數百張數據表為何不翼而飛?剛打好補丁的系統為何屢遭黑手 ...
前言
一提到跟蹤倆字,很多人想到警匪片中的場景,同樣在我們的SQL Server資料庫中“跟蹤”也是無處不在的,如果我們利用好了跟蹤技巧,就可以針對某些特定的場景做定向分析,找出充足的證據來破案。
簡單的舉幾個應用場景:
線上生產庫為何突然宕機?數百張數據表為何不翼而飛?剛打好補丁的系統為何屢遭黑手?新添加的信息表為何頻頻丟失?某張表欄位的突然更改,究竟為何人所為?這些個匿名的訪問背後,究竟是人是鬼?突然增加的增量數據,究竟是對是錯?數百兆的日誌爆炸式的增長背後又隱藏著什麼?這一且的背後,是應用程式的BUG還是用戶品質的缺失?
請關註本篇文章,讓我們一起利用資料庫的“跟蹤”(Trace)走進資料庫背後,查看其內部原理。
我相信如用過SQL Server資料庫的人,都會或多或少的利用過SQL Profiler工具。這個玩意就是利用SQL Trace形成的一個圖形化操作工具,我們直接進入本篇的正題。
一.查看系統預設跟蹤信息(Default Trace)
Trace作為一個很好的資料庫追蹤工具,在SQL Server 2005中便集成到系統功能中去,並且預設是開啟的,當然我們也可以手動的關掉它,它位於sp_config配置參數中,我們可以通過以下語句查看:
select * from sys.configurations where configuration_id = 1568
我們也可以通過下麵的語句找到這個跟蹤的記錄
select * from sys.traces
如果沒有開啟,我們也可以利用如下語句進行開啟,或者關閉等操作

--開啟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

通過以下命令找到預設跟蹤的文件路徑
select * from ::fn_trace_getinfo(0)
以上命令返回的結果值,各個值(property)代表的含義如下:
第一個:2表示滾動文件;
第二個:表示當前使用的trace文件路徑,根據它我們可以找到其它的跟蹤文件,預設是同一目錄下
第三個:表示滾動文件的大小(單位MB),當到達這個值就會創建新的滾動文件
第四個:跟蹤的停止時間,這裡為Null,表示沒有固定的停止時間
第五個:當前跟蹤的狀態:0 停止;1 運行
找到該目錄,我們查看下該文件:
、
系統預設提供5個跟蹤文件,並且每一個文件預設大小都是20MB,SQL Server會自己維護這5個文件,當實例重啟的時候或者到達最大值的時候,之後會重新生成新的文件,將最早的跟蹤文件刪除,依次滾動更新。
我們通過以下命令來查看跟蹤文件中的內容:
預設的跟蹤文件,提供的跟蹤信息還是很全的,從中我們可以找到登錄人,操作信息等,上面的截圖只是包含的部分信息。我們可以利用該語句進行自己的加工,然後獲得更有用的信息。

--獲取跟蹤文件中前100行執行內容 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('E:\dataDefaultFileManger\MSSQL10.MSSQLSERVER\MSSQL\Log\log_1267.trc', 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] = 'master' AND --根據DatabaseName過濾 gt.[ObjectName] = 'fn_trace_getinfo' 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

我創建了一張表,通過上面的跟蹤,可以跟蹤到該記錄的信息,根據不同的過濾信息,我們可以查詢出到跟蹤的某個庫的某個表的更改信息,包括:46創建(Created)、47刪除(Deleted)、93文件自動增長信息(Log File Auto Grow)、146修改(Alter)、20表示錯誤日誌(Login Failed)
在生產環境中,以上幾個分類都是比較常用的,對定位部分問題的定位能夠在找到充分的證據可循,比如某廝將資料庫數據刪除掉了還不承認等,這裡面的Login Failed信息,能夠追蹤出有那麼用戶嘗試登陸過資料庫,並且失敗,如果大面積的出現這種情況,那就要謹防黑客襲擊了。
當然,這裡我還可以利用SQL Server自帶的Profile工具,打開查看跟蹤文件中的內容。
這個圖像化的工具就比較熟悉了,直接打開進行篩選就可以了。
這種方式看似不錯,但是它也有本身的缺點,我們來看:
1、這5個文件是滾動更新的,而且每個文件預設最大都為20MB,並且沒有提供更改的介面,所以當文件填充完之後就會刪除掉,所以會找不到太久以前的內容;
2、本身預設的跟蹤,只是提供一些關鍵信息的追蹤,其中包括:auditing events,database events,error events,full text events,object creation,object deletion,object alteration,想要找到其它更詳細的內容,此方式可能無能為力;
3、在SQL Server2012後續版本的 Microsoft SQL Server 將刪除該功能,改用擴展事件。
二.自定義跟蹤信息(Default Trace)
根據上面SQL Server自帶的跟蹤信息有一些局限性,SQL Server為我們提供了自定義跟蹤的介面,我們可以自己定義跟蹤,充分擴展方法。
利用如下系統存儲過程,我們可以創建自定義的Trace
sp_trace_create [ @traceid = ] trace_id OUTPUT , [ @options = ] option_value , [ @tracefile = ] 'trace_file' [ , [ @maxfilesize = ] max_file_size ] [ , [ @stoptime = ] 'stop_time' ] [ , [ @filecount = ] 'max_rollover_files' ]
@traceid 系統預設分配跟蹤的ID號
@options 指定為跟蹤設置的選項,系統預設提供的幾個選項:
2表示當文件寫滿的時候,關閉當前跟蹤並創建新文件。
4表示如果不能將跟蹤寫入文件,不管什麼原因導致,SQL Server則會關閉。這個可以利用此選項,追蹤問題
8制定伺服器產生的最後5MB的跟蹤信息記錄由伺服器保存。
@tracefile 跟蹤文件的路徑,這裡可以是share的路徑
@maxfilesize 跟蹤文件的大小,單位是MB,預設不設置為5MB
@stoptime 跟蹤停止的時間,利用它我們可以定時跟蹤結束的日期
@filecount 預設生產的跟蹤文件的數量,比如預設的為5個,那就在第5個文件寫完的時候進行覆蓋第1個文件滾動
比如我們可以利用如下腳本進行創建

--創建跟蹤文件返回值 declare @rc int --創建一個跟蹤句柄 declare @TraceID int --創建跟蹤文件路徑 declare @TraceFilePath nvarchar(500) set @TraceFilePath=N'F:\SQLTest\' --跟蹤文件的大小 declare @maxfilesize bigint set @maxfilesize=5 --設置停止的時間 declare @EndTime datetime set @EndTime=null --設置系統預設的操作 declare @options int set @options=2 --設置預設滾動文件的數目 declare @filecount int set @filecount=5 exec @rc=sp_trace_Create @TraceID output, @options, @TraceFilePath, @maxfilesize, @EndTime, @filecount if(@rc=0) select @TraceID

我們通過上面的跟蹤創建的過程,可以在系統自帶的預設的sys.traces中找到該跟蹤的明細
select * from sys.traces where id=2
通過上面的腳本,我們已經創建了一個新的跟蹤(trace),但是這個跟蹤狀態為0,也就是說還沒有運行,下麵我們的步驟就是要為這個跟蹤添加事件(event)
這個也是利用SQL Server為我們提供的操作函數
sp_trace_setevent [ @traceid = ] trace_id , [ @eventid = ] event_id , [ @columnid = ] column_id , [ @on = ] on
@traceid 要修改的跟蹤的 ID號
@eventid 要打開的事件的 ID
@columnid 要為該事件添加的列的 ID
@on 表示事件狀態
其中最主要的就是時間ID,這個是SQL Server為我們提供的一些列的碼表時間值,具體值可以參考聯機叢書 sp_trace_setevent (Transact-SQL)
這裡面最常用的就是:
事件號 |
事件名稱 |
說明 |
---|---|---|
10 |
RPC:Completed |
在完成了遠程過程調用 (RPC) 時發生。 |
11 |
RPC:Starting |
在啟動了 RPC 時發生。 |
12 |
SQL:BatchCompleted |
在完成了 Transact-SQL 批處理時發生。 |
13 |
SQL:BatchStarting |
在啟動了 Transact-SQL 批處理時發生。 |
14 |
Audit Login |
在用戶成功登錄到 SQL Server 時發生。 |
15 |
Audit Logout |
在用戶從 SQL Server 註銷時發生。 |
16 |
Attention |
在發生需要關註的事件(如客戶端中斷請求或客戶端連接中斷)時發生。 |
17 |
ExistingConnection |
檢測在啟動跟蹤前連接到 SQL Server 的用戶的所有活動。 |
18 |
Audit Server Starts and Stops |
在修改 SQL Server 服務狀態時發生。 |
20 |
Audit Login Failed |
指示試圖從客戶端登錄到 SQL Server 失敗。 |
21 |
EventLog |
指示已將事件記錄到 Windows 應用程式日誌中。 |
22 |
ErrorLog |
指示已將錯誤事件記錄到 SQL Server 錯誤日誌中。 |
23 |
Lock:Released |
指示已釋放某個資源(如頁)的鎖。 |
24 |
Lock:Acquired |
指示獲取了某個資源(如數據頁)的鎖。 |
25 |
Lock:Deadlock |
指示兩個併發事務由於試圖獲得對方事務擁有的資源的不相容鎖而發生了相互死鎖。 |
26 |
Lock:Cancel |
指示已取消獲取資源鎖(例如,由於死鎖)。 |
27 |
Lock:Timeout |
指示由於其他事務持有所需資源的阻塞鎖而使對資源(例如頁)鎖的請求超時。 超時由 @@LOCK_TIMEOUT 函數確定,並可用 SET LOCK_TIMEOUT 語句設置。 |
28 |
Degree of Parallelism Event(7.0 插入) |
在執行 SELECT、INSERT 或 UPDATE 語句之前發生。 |
33 |
Exception |
指示 SQL Server 中出現了異常。 |
34 |
SP:CacheMiss |
指示未在過程緩存中找到某個存儲過程。 |
35 |
SP:CacheInsert |
指示某個項被插入到過程緩存中。 |
36 |
SP:CacheRemove |
指示從過程緩存中刪除了某個項。 |
37 |
SP:Recompile |
指示已重新編譯存儲過程。 |
38 |
SP:CacheHit |
指示在過程緩存中找到了存儲過程。 |
40 |
SQL:StmtStarting |
在啟動了 Transact-SQL 語句時發生。 |
41 |
SQL:StmtCompleted |
在完成了 Transact-SQL 語句時發生。 |
42 |
SP:Starting |
指示啟動了存儲過程。 |
43 |
SP:Completed |
指示完成了存儲過程。 |
44 |
SP:StmtStarting |
指示已開始執行存儲過程中的 Transact-SQL 語句。 |
45 |
SP:StmtCompleted |
指示存儲過程中的 Transact-SQL 語句已執行完畢。 |
46 |
Object:Created |
指示 CREATE INDEX、CREATE TABLE 和 CREATE DATABASE 這樣的語句已創建了一個對象。 |
47 |
Object:Deleted |
指示已在 DROP INDEX 和 DROP TABLE 這樣的語句中刪除了對象。 |
50 |
SQL Transaction |
跟蹤 Transact-SQL BEGIN、COMMIT、SAVE 和 ROLLBACK TRANSACTION 語句。 |
51 |
Scan:Started |
指示啟動了表或索引掃描 |
52 |
Scan:Stopped |
指示停止了表或索引掃描。 |
53 |
CursorOpen |
指示 ODBC、OLE DB 或 DB-Library 在 Transact-SQL 語句中打開了一個游標。 |
54 |
TransactionLog |
將事務寫入事務日誌時進行跟蹤。 |
55 |
Hash Warning |
指示未在緩衝分區進行的某一哈希操作(例如,哈希聯接、哈希聚合、哈希 union 運算、哈希非重覆)已恢復為替換計劃。 發生此事件的原因可能是遞歸深度、數據扭曲、跟蹤標記或位計數。 |
58 |
Auto Stats |
指示發生了自動更新索引統計信息。 |
59 |
Lock:Deadlock Chain |
為導致死鎖的每個事件而生成。 |
60 |
Lock:Escalation |
指示較細粒度的鎖轉換成了較粗粒度的鎖(例如,頁鎖升級或轉換為 TABLE 或 HoBT 鎖)。 |
61 |
OLE DB Errors |
指示發生了 OLE DB 錯誤。 |
67 |
Execution Warnings |
指示在執行 SQL Server 語句或存儲過程期間發生的任何警告。 |
68 |
Showplan Text (Unencoded) |
顯示所執行 Transact-SQL 語句的計劃樹。 |
69 |
Sort Warnings |
指示不適合記憶體的排序操作。 不包括與創建索引有關的排序操作;只包括某查詢內的排序操作(如 SELECT 語句中使用的 ORDER BY 子句)。 |
70 |
CursorPrepare |
指示已準備了 ODBC、OLE DB 或 DB-Library 用於 Transact-SQL 語句的游標。 |
71 |
Prepare SQL |
ODBC、OLE DB 或 DB-Library 已準備好了一個或多個要使用的 Transact-SQL 語句。 |
72 |
Exec Prepared SQL |
ODBC、OLE DB 或 DB-Library 已執行了一個或多個準備好的 Transact-SQL 語句。 |
73 |
Unprepare SQL |
ODBC、OLE DB 或 DB-Library 已撤消(刪除)了一個或多個準備好的 Transact-SQL 語句。 |
74 |
CursorExecute |
執行了先前由 ODBC、OLE DB 或 DB-Library 為 Transact-SQL 語句準備的游標。 |
75 |
CursorRecompile |
由 ODBC 或 DB-Library 為 Transact-SQL 語句打開的游標已直接重新編譯或由於架構更改而重新編譯。 為 ANSI 和非 ANSI 游標觸發。 |
76 |
CursorImplicitConversion |
SQL Server 將 Transact-SQL 語句的游標從一種類型轉換為另一種類型。 為 ANSI 和非 ANSI 游標觸發。 |
77 |
CursorUnprepare |
ODBC、OLE DB 或 DB-Library 撤消(刪除)了準備好的 Transact-SQL 語句的游標。 |
78 |
CursorClose |
關閉了先前由 ODBC、OLE DB 或 DB-Library 為 Transact-SQL 語句打開的游標。 |
79 |
Missing Column Statistics |
可能曾經對優化器有用的列統計信息不可用。 |
80 |
Missing Join Predicate |
正在執行沒有聯接謂詞的查詢。 這可能導致長時間運行查詢。 |
81 |
Server Memory Change |
SQL Server 記憶體的使用量已增加或減少了 1 MB 或最大伺服器記憶體的 5%(兩者中較大者)。 |
82-91 |
User Configurable (0-9) |
用戶定義的事件數據。 |
92 |
Data File Auto Grow |
指示伺服器已自動擴展了數據文件。 |
93 |
Log File Auto Grow |
指示伺服器已自動擴展了日誌文件。 |
94 |
Data File Auto Shrink |
指示伺服器已自動收縮了數據文件。 |
95 |
Log File Auto Shrink |
指示伺服器已自動收縮了日誌文件。 |
96 |
Showplan Text |
顯示來自查詢優化器的 SQL 語句的查詢計劃樹。 請註意,TextData 列不包含此事件的顯示計劃。 |
97 |
Showplan All |
顯示查詢計劃,並顯示已執行的 SQL 語句的完整編譯時詳細信息。 請註意,TextData 列不包含此事件的顯示計劃。 |
98 |
Showplan Statistics Profile |
顯示查詢計劃,並顯示已執行的 SQL 語句的完整運行時詳細信息。 請註意,TextData 列不包含此事件的顯示計劃。 |
100 |
RPC Output Parameter |
生成每個 RPC 的參數的輸出值。 |
108 |
Audit Add Login to Server Role Event |
在從固定伺服器角色添加或刪除登錄時發生;針對 sp_addsrvrolemember 和 sp_dropsrvrolemember。 |
112 |
Audit App Role Change Password Event |
在更改應用程式角色的密碼時發生。 |
113 |
Audit Statement Permission Event |
在使用語句許可權(如 CREATE TABLE)時發生。 |
114 |
Audit Schema Object Access Event |
在成功或未成功使用了對象許可權(如 SELECT)時發生。 |
115 |
Audit Backup/Restore Event |
在發出 BACKUP 或 RESTORE 命令時發生。 |
116 |
Audit DBCC Event |
在發出 DBCC 命令時發生。 |
117 |
Audit Change Audit Event |
在修改審核跟蹤時發生。 |
118 |
Audit Object Derived Permission Event |
在發出 CREATE、ALTER 和 DROP 對象命令時發生。 |
119 |
OLEDB Call Event |
為分散式查詢和遠程存儲過程調用 OLE DB 訪問介面時發生。 |
120 |
OLEDB QueryInterface Event |
為分散式查詢和遠程存儲過程調用 OLE DB QueryInterface 時發生。 |
121 |
OLEDB DataRead Event |
對 OLE DB 訪問介面調用數據請求時發生。 |
122 |
Showplan XML |
在執行 SQL 語句時發生。 包括該事件可以標識 Showplan 運算符。 每個事件都存儲在格式正確的 XML 文檔中。 請註意,此事件的 Binary 列包含已編碼的顯示計劃。 使用 SQL Server Profiler 可打開跟蹤並查看顯示計劃。 |
123 |
SQL:FullTextQuery |
執行全文查詢時發生。 |
124 |
Broker:Conversation |
報告 Service Broker 會話的進度。 |
125 |
Deprecation Announcement |
使用將從 SQL Server 的未來版本中刪除的功能時發生。 |
126 |
Deprecation Final Support |
使用將從 SQL Server 的下一個主版本中刪除的功能時發生。 |
127 |
Exchange Spill Event |
在 tempdb 資料庫臨時寫入並行查詢計劃中的通信緩衝區時發生。 |
128 |
Audit Database Management Event |
創建、更改或刪除資料庫時發生。 |
129 |
Audit Database Object Management Event |
對資料庫對象(如架構)執行 CREATE、ALTER 或 DROP 語句時發生。 |
130 |
Audit Database Principal Management Event |
創建、更改或刪除資料庫的主體(如用戶)時發生。 |
131 |
Audit Schema Object Management Event |
創建、更改或刪除伺服器對象時發生。 |
132 |
Audit Server Principal Impersonation Event |
伺服器範圍中發生模擬(如 EXECUTE AS LOGIN)時發生。 |
133 |
Audit Database Principal Impersonation Event |
資料庫範圍中發生模擬(如 EXECUTE AS USER 或 SETUSER)時發生。 |
134 |
Audit Server Object Take Ownership Event |
伺服器範圍中的對象的所有者發生更改時發生。 |
135 |
Audit Database Object Take Ownership Event |
資料庫範圍中的對象的所有者發生更改時發生。 |
136 |
Broker:Conversation Group |
Service Broker 創建新的會話組或刪除現有會話組時發生。 |
137 |
Blocked Process Report |
進程被阻塞的時間超過了指定的時間時發生。 不包括系統進程或正在等待未發現死鎖的資源的進程。 請使用 sp_configure 來配置生成報表時的閾值和頻率。 |
138 |
Broker:Connection |
報告 Service Broker 管理的傳輸連接的狀態。 |
139 |
Broker:Forwarded Message Sent |
Service Broker 轉發消息時發生。 |
140 |
Broker:Forwarded Message Dropped |
Service Broker 刪除用於轉發的消息時發生。 |
141 |
Broker:Message Classify |
Service Broker 確定消息的路由時發生。 |
142 |
Broker:Transmission |
指示在 Service Broker 傳輸層中發生了錯誤。 錯誤號和狀態值指示了錯誤源。 |
143 |
Broker:Queue Disabled |
指示檢測到有害消息,這是由於在 Service Broker 隊列中有五個連續的事務回滾。 該事件包含資料庫 ID 和包含有害消息的隊列的隊列 ID。 |
146 |
Showplan XML Statistics Profile |
在執行 SQL 語句時發生。 標識 Showplan 運算符,並顯示完整的編譯時數據。 請註意,此事件的 Binary 列包含已編碼的顯示計劃。 使用 SQL Server Profiler 可打開跟蹤並查看顯示計劃。 |
148 |
Deadlock Graph |
取消獲取鎖的嘗試時發生,這是因為該嘗試是死鎖的一部分,並且被選為死鎖犧牲品。 提供死鎖的 XML 說明。 |
149 |
Broker:Remote Message Acknowledgement |
Service Broker 發送或收到消息確認時發生。 |
150 |
Trace File Close |
跟蹤文件在回滾期間關閉時發生。 |
152 |
Audit Change Database Owner |
使用 ALTER AUTHORIZATION 更改資料庫的所有者,並且檢查執行該操作的許可權時發生。 |
153 |
Audit Schema Object Take Ownership Event |
使用 ALTER AUTHORIZATION 來將所有者分配給對象,並且檢查執行該操作的許可權時發生。 |
155 |
FT:Crawl Started |
全文爬網(填充)開始時發生。 用於檢查工作線程任務是否拾取了爬網請求。 |
156 |
FT:Crawl Stopped |
全文爬網(填充)停止時發生。 爬網成功完成或發生錯誤時停止。 |
157 |
FT:Crawl Aborted |
在全文爬網過程中遇到異常時發生。 通常導致全文爬網停止。 |
158 |
Audit Broker Conversation |
報告與 Service Broker 對話安全性相關的審核消息。 |
159 |
Audit Broker Login |
報告與 Service Broker 傳輸安全性相關的審核消息。 |
160 |
Broker:Message Undeliverable |
Service Broker 無法保留收到的消息時發生,該消息應當已傳遞給某個服務。 |
161 |
Broker:Corrupted Message |
Service Broker 收到損壞的消息時發生。 |
162 |
User Error Message |
顯示出現錯誤或異常時用戶看到的錯誤消息。 |
163 |
Broker:Activation |
隊列監視器啟動激活存儲過程時,發送 QUEUE_ACTIVATION 通知時,或者隊列監視器啟動的激活存儲過程退出時發生。 |
164 |
Object:Altered |
資料庫對象更改時發生。 |
165 |
Performance statistics |
將經過編譯的查詢計劃第一次緩存、重新編譯或從計劃緩存中刪除時發生。 |
166 |
SQL:StmtRecompile |
發生語句級別的重新編譯時發生。 |
167 |
Database Mirroring State Change |
鏡像資料庫的狀態更改時發生。 |
168 |
Showplan XML For Query Compile |
編譯 SQL 語句時發生。 顯示完整的編譯時數據。 請註意,此事件的 Binary 列包含已編碼的顯示計劃。 使用 SQL Server Profiler 可打開跟蹤並查看顯示計劃。 |
169 |
Showplan All For Query Compile |
編譯 SQL 語句時發生。 顯示完整的編譯時數據。 用於標識 Showplan 運算符。 |
170 |
Audit Server Scope GDR Event |
指示在伺服器範圍中發生了許可權的授予、拒絕或撤消事件(如創建登錄)。 |
171 |
Audit Server Object GDR Event |
指示發生了對架構對象(如表或函數)的授予、拒絕或撤消事件。 |
172 |
Audit Database Object GDR Event |
指示發生了對資料庫對象(如程式集和架構)的授予、拒絕或撤消事件。 |
173 |
Audit Server Operation Event |
使用了安全審核操作(如使用了更改設置、資源、外部訪問或授權)時發生。 |
175 |
Audit Server Alter Trace Event |
檢查語句的 ALTER TRACE 許可權時發生。 |
176 |
Audit Server Object Management Event |
創建、更改或刪除伺服器對象時發生。 |
177 |
Audit Server Principal Management Event |
創建、更改或刪除了伺服器主體時發生。 |
178 |
Audit Database Operation Event |
發生資料庫操作(如檢查或訂閱查詢通知)時發生。 |
180 |
Audit Database Object Access Event |
訪問資料庫對象(如架構)時發生。 |
181 |
TM: Begin Tran starting |
BEGIN TRANSACTION 請求開始時發生。 |
182 |
TM: Begin Tran completed |
BEGIN TRANSACTION 請求完成時發生。 |
183 |
TM: Promote Tran starting |
PROMOTE TRANSACTION 請求開始時發生。 |
184 |
TM: Promote Tran completed |
PROMOTE TRANSACTION 請求完成時發生。 |
185 |
TM: Commit Tran starting |
COMMIT TRANSACTION 請求開始時發生。 |
186 |
TM: Commit Tran completed |
COMMIT TRANSACTION 請求完成時發生。 |
187 |
TM: Rollback Tran starting |
ROLLBACK TRANSACTION 請求開始時發生。 |
188 |
TM: Rollback Tran completed |
ROLLBACK TRANSACTION 請求完成時發生。 |
189 |
Lock:Timeout (timeout > 0) |
對資源(如頁)的鎖請求超時時發生。 |
190 |
Progress Report: Online Index Operation |
報告生成進程正在運行時,聯機索引生成操作的進度。 |
191 |
TM: Save Tran starting |
SAVE TRANSACTION 請求開始時發生。 |
192 |
TM: Save Tran completed |
SAVE TRANSACTION 請求完成時發生。 |
193 |
Background Job Error |
後臺作業不正常終止時發生。 |
194 |
OLEDB Provider Information |
分散式查詢運行並收集對應於提供程式連接的信息時發生。 |
195 |
Mount Tape |
收到磁帶裝入請求時發生。 |
196 |
Assembly Load |
發生載入 CLR 程式集的請求時發生。 |
198 |
XQuery Static Type |
執行 XQuery 表達式時發生。 此事件類提供靜態類型的 XQuery 表達式。 |
199 |
QN: subscription |
無法訂閱查詢註冊時發生。 TextData 列包含事件的有關信息。 |
200 |
QN: parameter table |
有關活動訂閱的信息存儲在內部參數表中。 在創建或刪除參數表時發生該事件類。 通常,重新啟動資料庫時將創建或刪除這些表。 TextData 列包含事件的有關信息。 |
201 |
QN: template |
查詢模板代表訂閱查詢的類。 通常,除參數值以外,相同類中的查詢是相同的。 當新的訂閱請求針對已存在的類 (Match)、新類 (Create) 或 Drop 類(指示清除沒有活動訂閱的查詢類的模板)時,發生此事件類。 TextData 列包含事件的有關信息。 |
202 |
QN: dynamics |
跟蹤查詢通知的內部活動。 TextData 列包含事件的有關信息。 |
213 |
Database Suspect Data Page |
指示何時將某頁添加到 msdb 的 suspect_pages 表。 |
214 |
CPU threshold exceeded |
指示資源調控器檢測到查詢超過 CPU 閾值 (REQUEST_MAX_CPU_TIME_SEC) 的時間。 |
215 |
指示 LOGON 觸發器或資源調控器分類器函數開始執行的時間。 |
指示 LOGON 觸發器或資源調控器分類器函數開始執行的時間。 |
216 |
PreConnect:Completed |
指示 LOGON 觸發器或資源調控器分類器函數完成執行的時間。 |
217 |
Plan Guide Successful |
指示 SQL Server 已成功為計劃指南中包含的查詢或批處理生成執行計劃。 |
218 |
Plan Guide Unsuccessful |
指示 SQL Server 無法為包含計劃指南的查詢或批處理生成執行計劃。 SQL Server 嘗試在不應用計劃指南的情況下為此查詢或批處理生成執行計劃。 無效的計劃指南可能是導致此問題的原因。 您可以通過使用 sys.fn_validate_plan_guide 系統函數驗證該計劃指南。 |
上述的跟蹤事件中,基本包含了SQL Server中所能做的任何操作,我們可以根據自己需要進行定義,當我們可以針對日常經常遇到的一些問題進行定位,比如:死鎖、等待、登錄失敗等等吧...當然也可以追蹤某個人的所有行為,這裡我們來定義幾個來看看
我們定義追蹤所有語句批量操作的追蹤,從上面表我們可以查找到為12,13
exec sp_trace_setevent 2,12,1,1 exec sp_trace_setevent 2,13,1,1
通過如下存儲過程,將我們自定的追蹤啟動
--設置跟蹤狀態以啟動 exec sp_trace_setstatus @TraceID,1
至此,我們新建的追蹤已經開始運行了,我們可以利用上面的方法,來查看我們生成的追蹤文件了,其實大部分時候,我們都是利用此種方法設置好”圈套“,等待魚兒上網
比如死鎖查找,CPU消耗高,IO值高的那些語句....
我們可以利用如下語句,查找跟蹤文件的信息
--查看跟蹤文件以表顯示 select * from ::fn_trace_gettable('F:\SQLTest\.trc',1)
將我們剛纔的所有操作,已經追蹤出來了。
通過如下命令進行跟蹤的關閉
--設置跟蹤狀態以停止 exec sp_trace_setstatus @TraceID,0
通過如下命令進行跟蹤的刪除
--從系統中移除跟蹤 exec sp_trace_setstatus @TraceID,2
我們知道在SQL Server預設的跟蹤文件在實例重啟時候,都會消失,所以我們可以通過如下方法解決,保證在每次實例重新啟動的時候都會執行該追蹤

--新建追蹤的存儲過程 use master go create proc StartBlackBoxTrace as begin --預設開啟追蹤所有的SQL 執行語句,文件文件路徑為預設 DECLARE @TraceID int DECLARE @MaxFileSize bigint SET @MaxFileSize=25 EXEC SP_TRACE_CREATE @TraceID OUTPUT, 8, NULL, @MaxFileSize EXEC SP_TRACE_SETSTATUS @TraceID,1 END --將該存儲過程設置為SQL Server服務啟動時自動啟動 EXEC sp_procoption 'StartBlackBoxTrace','STARTUP','ON' GO