擴展事件提供了一個輕量級的平臺可以用來收集錯誤信息,方便DBA查看最近的數據庫錯誤配合開發人員一起解決問題。
下面的例子我們創建extended event 會話來獲取錯誤208, 2812,and 4121。這三個錯誤分別對應:Invalid object name, Could not find stored procedure, and Cannotfind either column or the user-defined function or aggregate. 可以根據擴展事件sqlserver.error_reported。我們獲取下面的詳細信息:
sqlserver.session_id
sqlserver.sql_text
sqlserver.client_app_name
sqlserver.client_hostname
sqlserver.database_id
sqlserver.username
通過這些信息我們可以瞭解到是哪個應用出現的問題儘快解決,創建擴展事件會話使用下面的腳本:
CREATEEVENTSESSION exErrors ONSERVER -- Session Name
ADDEVENT sqlserver.error_reported -- Event wewant to capture
(
ACTION -- What contents to capture
(
sqlserver.session_id
,sqlserver.sql_text
,sqlserver.client_app_name
,sqlserver.client_hostname
,sqlserver.database_id
,sqlserver.username
)
-- Somepredicate or filter (here it is object not found error number)
WHERE (error = 208
OR error = 2812
OR error = 4121
)
)
ADDTARGET package0.ring_buffer
WITH (max_dispatch_latency = 5seconds); -- Thetarget
GO
ALTEREVENTSESSION exErrors ONSERVERSTATE = START
GO
查詢錯誤信息的腳本:
WITH exErrors
AS (
SELECT CAST(target_data ASxml) AS SessionData
FROMsys.dm_xe_session_targetsst
INNERJOINsys.dm_xe_sessions s ONs.address= st.event_session_address
WHERE name ='exErrors'
)
SELECT
error.value('(@timestamp)[1]','datetime') as event_timestamp
,error.value('(data/value)[5]','varchar(max)') as [error_message]
,error.value('(data/value)[1]','int') as error
,error.value('(action/value)[3]','nvarchar(255)') AS client_app_name
,error.value('(action/value)[4]','nvarchar(255)') as client_hostname
,DB_NAME(error.value('(action/value)[5]','int')) AS database_name
,error.value('(action/value)[6]','nvarchar(128)') AS username
,error.value('(action/value)[2]','varchar(max)') as sql_text
,error.value('(action/value)[1]','int') as session_id
,error.value('(data/value)[4]','bit') as user_defined
FROM exErrors d
CROSSAPPLY SessionData.nodes('//RingBufferTarget/event')AS t(error)
WHERE error.value('@name','nvarchar(128)') ='error_reported';
結果如下: