前言html
一提到跟蹤倆字,不少人想到警匪片中的場景,一樣在咱們的SQL Server數據庫中「跟蹤」也是無處不在的,若是咱們利用好了跟蹤技巧,就能夠針對某些特定的場景作定向分析,找出充足的證據來破案。sql
簡單的舉幾個應用場景:數據庫
在線生產庫爲什麼忽然宕機?數百張數據表爲什麼不知去向?剛打好補丁的系統爲什麼屢遭黑手?新添加的信息表爲什麼頻頻丟失?某張表字段的忽然更改,究竟爲什麼人所爲?這些個匿名的訪問背後,到底是人是鬼?忽然增長的增量數據,到底是對是錯?數百兆的日誌爆炸式的增加背後又隱藏着什麼?這一且的背後,是應用程序的BUG仍是用戶品質的缺失?express
請關注本篇文章,讓咱們一塊兒利用數據庫的「跟蹤」(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
若是沒有開啓,咱們也能夠利用以下語句進行開啓,或者關閉等操做app
--開啓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工具,打開查看跟蹤文件中的內容。
這個圖像化的工具就比較熟悉了,直接打開進行篩選就能夠了。
這種方式看似不錯,可是它也有自己的缺點,咱們來看:
一、這5個文件是滾動更新的,並且每一個文件默認最大都爲20MB,而且沒有提供更改的接口,因此當文件填充完以後就會刪除掉,因此會找不到過久之前的內容;
二、自己默認的跟蹤,只是提供一些關鍵信息的追蹤,其中包括:auditing events,database events,error events,full text events,object creation,object deletion,object alteration,想要找到其它更詳細的內容,此方式可能無能爲力;
三、在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
經過以下腳本刪除到全部的跟蹤
create proc [dbo].[Performance_Trace_StopAll] AS declare traceCursor cursor for select id from sys.traces where id <> 1 open traceCursor declare @curid int fetch next from traceCursor into @curid while(@@fetch_status=0) begin exec sp_trace_setstatus @curid,0 exec sp_trace_setstatus @curid,2 fetch next from traceCursor into @curid end close traceCursor deallocate traceCursor
三.死鎖案例(2014年11月23日晚補充)
這裏咱們來利用本身新建跟蹤來跟蹤一個死鎖的發生過程,而且將其記錄到咱們的Trace文件中,這裏咱們來製做一個死鎖
以上代碼參照院子裏大牛宋沄劍,這裏咱們利用系統的自帶的profile進行設計追蹤,咱們直接選擇系統自帶的死鎖模板,進行追蹤
而後設置,默認的SPID爲大於等於50,小於50的爲系統自有事件
而後,咱們利用上面的死鎖腳本,運行獲取死鎖的捕捉
能夠看到,咱們已經順利的追蹤到這個死鎖。咱們知道這種追蹤是高成本的,而且咱們有時候不知道死鎖發生的具體時間,因此不能一直開着這個Profile,出於性能考慮也不建議這麼作,因此咱們採用新建的Trace文件,來保存改腳本,而後重定向到咱們本身的文件夾,將死鎖的信息放置到該文件夾下,提供更大靈活性。
SQL Server自己自帶的Profile工具就提供編輯腳本的功能,咱們將上面的設計,導出成Trace腳本,咱們點擊「文件」,導出該設計腳本
將該腳本保存到一個位置,而後咱們打開,我順便將默認的文件路徑添加上
/****************************************************/ /* Created by: SQL Server 2008 Profiler */ /* Date: 2014/11/23 20:28:11 */ /****************************************************/ -- Create a Queue declare @rc int declare @TraceID int declare @maxfilesize bigint --能夠更改文件大小 set @maxfilesize = 5 --默認死鎖文件放置目錄 declare @FilePath nvarchar(max) set @FilePath=N'F:\SQLTest\DeadLock.trc' -- Please replace the text InsertFileNameHere, with an appropriate -- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension -- will be appended to the filename automatically. If you are writing from -- remote server to local drive, please use UNC path and make sure server has -- write access to your network share exec @rc = sp_trace_create @TraceID output, 0, @FilePath, @maxfilesize, NULL if (@rc != 0) goto error -- Client side File and Table cannot be scripted -- Set the events declare @on bit set @on = 1 exec sp_trace_setevent @TraceID, 137, 15, @on exec sp_trace_setevent @TraceID, 137, 32, @on exec sp_trace_setevent @TraceID, 137, 1, @on exec sp_trace_setevent @TraceID, 137, 13, @on exec sp_trace_setevent @TraceID, 137, 22, @on exec sp_trace_setevent @TraceID, 148, 11, @on exec sp_trace_setevent @TraceID, 148, 12, @on exec sp_trace_setevent @TraceID, 148, 14, @on exec sp_trace_setevent @TraceID, 148, 1, @on exec sp_trace_setevent @TraceID, 26, 15, @on exec sp_trace_setevent @TraceID, 26, 32, @on exec sp_trace_setevent @TraceID, 26, 1, @on exec sp_trace_setevent @TraceID, 26, 9, @on exec sp_trace_setevent @TraceID, 26, 57, @on exec sp_trace_setevent @TraceID, 26, 2, @on exec sp_trace_setevent @TraceID, 26, 10, @on exec sp_trace_setevent @TraceID, 26, 11, @on exec sp_trace_setevent @TraceID, 26, 35, @on exec sp_trace_setevent @TraceID, 26, 12, @on exec sp_trace_setevent @TraceID, 26, 13, @on exec sp_trace_setevent @TraceID, 26, 6, @on exec sp_trace_setevent @TraceID, 26, 14, @on exec sp_trace_setevent @TraceID, 26, 22, @on exec sp_trace_setevent @TraceID, 25, 15, @on exec sp_trace_setevent @TraceID, 25, 32, @on exec sp_trace_setevent @TraceID, 25, 1, @on exec sp_trace_setevent @TraceID, 25, 9, @on exec sp_trace_setevent @TraceID, 25, 57, @on exec sp_trace_setevent @TraceID, 25, 2, @on exec sp_trace_setevent @TraceID, 25, 10, @on exec sp_trace_setevent @TraceID, 25, 11, @on exec sp_trace_setevent @TraceID, 25, 35, @on exec sp_trace_setevent @TraceID, 25, 12, @on exec sp_trace_setevent @TraceID, 25, 13, @on exec sp_trace_setevent @TraceID, 25, 6, @on exec sp_trace_setevent @TraceID, 25, 14, @on exec sp_trace_setevent @TraceID, 25, 22, @on exec sp_trace_setevent @TraceID, 59, 32, @on exec sp_trace_setevent @TraceID, 59, 1, @on exec sp_trace_setevent @TraceID, 59, 57, @on exec sp_trace_setevent @TraceID, 59, 2, @on exec sp_trace_setevent @TraceID, 59, 14, @on exec sp_trace_setevent @TraceID, 59, 22, @on exec sp_trace_setevent @TraceID, 59, 35, @on exec sp_trace_setevent @TraceID, 59, 12, @on exec sp_trace_setevent @TraceID, 60, 32, @on exec sp_trace_setevent @TraceID, 60, 9, @on exec sp_trace_setevent @TraceID, 60, 57, @on exec sp_trace_setevent @TraceID, 60, 10, @on exec sp_trace_setevent @TraceID, 60, 11, @on exec sp_trace_setevent @TraceID, 60, 35, @on exec sp_trace_setevent @TraceID, 60, 12, @on exec sp_trace_setevent @TraceID, 60, 6, @on exec sp_trace_setevent @TraceID, 60, 14, @on exec sp_trace_setevent @TraceID, 60, 22, @on exec sp_trace_setevent @TraceID, 189, 15, @on exec sp_trace_setevent @TraceID, 189, 32, @on exec sp_trace_setevent @TraceID, 189, 1, @on exec sp_trace_setevent @TraceID, 189, 9, @on exec sp_trace_setevent @TraceID, 189, 57, @on exec sp_trace_setevent @TraceID, 189, 2, @on exec sp_trace_setevent @TraceID, 189, 10, @on exec sp_trace_setevent @TraceID, 189, 11, @on exec sp_trace_setevent @TraceID, 189, 35, @on exec sp_trace_setevent @TraceID, 189, 12, @on exec sp_trace_setevent @TraceID, 189, 13, @on exec sp_trace_setevent @TraceID, 189, 6, @on exec sp_trace_setevent @TraceID, 189, 14, @on exec sp_trace_setevent @TraceID, 189, 22, @on exec sp_trace_setevent @TraceID, 45, 16, @on exec sp_trace_setevent @TraceID, 45, 1, @on exec sp_trace_setevent @TraceID, 45, 9, @on exec sp_trace_setevent @TraceID, 45, 17, @on exec sp_trace_setevent @TraceID, 45, 10, @on exec sp_trace_setevent @TraceID, 45, 18, @on exec sp_trace_setevent @TraceID, 45, 11, @on exec sp_trace_setevent @TraceID, 45, 35, @on exec sp_trace_setevent @TraceID, 45, 12, @on exec sp_trace_setevent @TraceID, 45, 13, @on exec sp_trace_setevent @TraceID, 45, 6, @on exec sp_trace_setevent @TraceID, 45, 14, @on exec sp_trace_setevent @TraceID, 45, 22, @on exec sp_trace_setevent @TraceID, 45, 15, @on exec sp_trace_setevent @TraceID, 44, 1, @on exec sp_trace_setevent @TraceID, 44, 9, @on exec sp_trace_setevent @TraceID, 44, 10, @on exec sp_trace_setevent @TraceID, 44, 11, @on exec sp_trace_setevent @TraceID, 44, 35, @on exec sp_trace_setevent @TraceID, 44, 12, @on exec sp_trace_setevent @TraceID, 44, 6, @on exec sp_trace_setevent @TraceID, 44, 14, @on exec sp_trace_setevent @TraceID, 44, 22, @on exec sp_trace_setevent @TraceID, 41, 15, @on exec sp_trace_setevent @TraceID, 41, 16, @on exec sp_trace_setevent @TraceID, 41, 1, @on exec sp_trace_setevent @TraceID, 41, 9, @on exec sp_trace_setevent @TraceID, 41, 17, @on exec sp_trace_setevent @TraceID, 41, 10, @on exec sp_trace_setevent @TraceID, 41, 18, @on exec sp_trace_setevent @TraceID, 41, 11, @on exec sp_trace_setevent @TraceID, 41, 35, @on exec sp_trace_setevent @TraceID, 41, 12, @on exec sp_trace_setevent @TraceID, 41, 13, @on exec sp_trace_setevent @TraceID, 41, 6, @on exec sp_trace_setevent @TraceID, 41, 14, @on exec sp_trace_setevent @TraceID, 40, 1, @on exec sp_trace_setevent @TraceID, 40, 9, @on exec sp_trace_setevent @TraceID, 40, 6, @on exec sp_trace_setevent @TraceID, 40, 10, @on exec sp_trace_setevent @TraceID, 40, 14, @on exec sp_trace_setevent @TraceID, 40, 11, @on exec sp_trace_setevent @TraceID, 40, 35, @on exec sp_trace_setevent @TraceID, 40, 12, @on -- Set the Filters declare @intfilter int declare @bigintfilter bigint exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - efbc9d24-69cd-465f-8daf-e38493da0332' -- 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
咱們只須要將這個腳本運行就能夠,固然此段腳本,在實例重啓的時候,全部的trace都會刪除掉,能夠將該段代碼改爲存儲過程,而後設置成實例啓動的時候運行,
方法參考本篇的上半部分。
固然咱們也能夠設置別的參數,好比啓動時間,運行時間,跟蹤文件大小,位置,數量等,刪除沒必要要的trace跟蹤事件...
當運行到一段時間以後,咱們直接拷貝下來,找臺電腦分析就能夠了。
更靈活的方式是採起非業務高峯期,利用SQL Server自帶的郵件提醒功能,直接檢測出問題,而後Send Email....
四.SQL Server中黑匣子(2014年11月28日晚補充)
黑匣子做爲飛機出現事故後的追蹤利器,在微軟的SQL Server這個數據庫中默認也給裝上了此引擎,可是沒有開啓,此功能可能幫助咱們診斷間歇性的服務器崩潰。它比咱們上面介紹的默認開啓的跟蹤跟蹤的信息更全,跟蹤更大一些。其內容包含了:「SP:啓動」、「SQL:批處理啓動」、異常和注意等事件
這個跟蹤經過在sp_trace_create的默認@option參數設置爲8來配置的。代碼以下:
DECLARE @Traced INT EXEC sp_trace_create @Traced OUTPUT, @options=8 EXEC sp_trace_setstatus @Traced,1
經過以上的配置會自動配置成兩個滾動文件,當達到默認的最大文件容量5MB的時候,就在兩個文件中循環滾動依次更新。
固然若是感受生成的文件5MB有點小,能夠手動配置更改大小,或者自定義文件路徑,這些都是容許自定義設置的。
DECLARE @TraceID INT DECLARE @maxfilesize BIGINT SET @maxfilesize=25 DECLARE @tracefile nvarchar(245) SET @tracefile=N'F:\SQLTest\TRACE\MYTRACE.trc' EXEC sp_trace_create @TraceID OUTPUT, @options=8, @tracefile=NULL, @maxfilesize=@maxfilesize EXEC sp_trace_setstatus @TraceID,1
此方法能將數據庫執行的全部SQL滾動記錄下來,以防止SQL Server宕機以後的事故查找。
參考我博文的上面介紹,只須要將這個方法存儲於存儲過程,而後設置成實例啓動後運行,那麼恭喜你的SQL Server已經成功裝上了黑匣子引擎,假若有一天忽然宕機,咱們只須要打開此黑匣子就能夠。
結語
參考文獻有下面