立即分享:
目錄 隱藏

1. 介紹

1.1 什麼是 SQL Server 擴展活動?

SQL Server Extended Events 是一個輕量級的效能監控系統,它使管理員和開發人員能夠收集和分析詳細的伺服器活動資料。該系統已整合到… SQL Server 資料庫引擎,並提供對正常操作和故障排除場景的全面見解。

1.2 為什麼要使用擴展事件進行監控?

SQL Server 擴展事件為資料庫監控和故障排除提供了幾個顯著的優勢:

  • 採用輕量級架構,效能影響極小。
  • 對資料收集和事件過濾進行精細控制
  • 可根據特定監測需求客製化資料收集
  • 能夠同時擷取來自多個軟體包的事件
  • 靈活的篩選功能,可專注於相關操作
  • 支援生產系統監控,同時不降低使用者體驗
  • 綜合績效指標追蹤
  • 用於故障排除的進階診斷功能
  • 為滿足合規性要求而進行的審計追蹤維護
  • 即時和歷史數據分析選項

1.3 擴展賽事 SQL Server 輪廓

而 SQL Server 輪廓 傳統的監控工具一直是 MS SQL Extended Events,而 Extended Events 則提供了更有效率的替代方案。 Extended Events 消耗的系統資源較少,並且為生產環境提供了更好的可擴展性。

SQL Server Profiler 現已棄用,微軟建議將所有監控活動移轉到擴充事件。

2. 理解擴展事件架構

2.1 擴展事件引擎組件

擴展事件引擎由多個核心元件構成,這些元件協同工作,用於捕獲、處理和儲存事件資料。了解這些組件有助於您設計有效的監控解決方案。

  • 調度員: 調度器元件負責協調從事件源到擴展事件引擎的事件流。當事件觸發時,調度器會接收通知,並將其路由至已訂閱該特定事件類型的活動會話。
  • 緩衝器: 緩衝區會在寫入目標之前將事件資料暫時儲存在記憶體中。這種緩衝機制透過減少 I/O 操作來提高效能。可以配置緩衝區大小和管理設置,以平衡記憶體使用量和資料擷取需求。
  • 會議: 會話定義了事件監控的範圍。它指定要捕捉哪些事件、要執行哪些操作、要套用哪些謂詞以及結果的儲存位置。會話可以獨立地建立、修改、啟動和停止。
  • 目標實例: 目標實例代表擷取的事件資料的儲存位置。每個會話可以寫入一個或多個目標,例如檔案、環形緩衝區或計數器。目標會處理並持久化事件訊息,以便後續分析。

2.2 活動套餐

SQL Server 擴展事件將功能組織成包。每個包包含相關的事件、操作、類型、謂詞和目標。常見的套件包括 sqlserver、sqlos 和 package0。

  • sqlserver 套件提供資料庫特定的事件,例如查詢和事務。
  • sqlos 包包含作業系統事件。
  • package0 提供所有軟體套件所使用的通用功能。

2.3 事件類型與字段

事件代表事件發生的時間和地點。 SQL Server 您想要監控的事件。每種事件類型都有預先定義的欄位來擷取相關資訊。例如,sql_statement_completed 事件包含持續時間、CPU 時間、讀取次數和寫入次數等欄位。

事件可以是同步的,也可以是異步的。同步事件在操作過程中觸發,而非同步事件在操作完成後觸發。了解事件特徵有助於您根據監控需求選擇合適的事件。

2.4股

操作會為捕獲的事件添加補充資訊。當事件觸發時,關聯的操作會執行以收集其他上下文信息,例如 SQL 文字、會話 ID 或呼叫堆疊資訊。

常用操作包括使用 `sql_text` 擷取查詢語句、使用 `database_name` 識別資料庫,以及使用 `client_hostname` 追蹤來源伺服器。這些操作為故障排除和分析提供了必要的上下文資訊。

2.5 目標

目標決定事件資料的儲存方式和儲存位置。 SQL Server 擴展事件支援多種目標類型,包括:

  • 用於磁碟儲存的 event_file,為詳細分析提供持久性儲存。
  • ring_buffer 用於基於記憶體的保留,以最小的開銷快速存取最近事件。
  • 用於簡單計數的 event_counter
  • 用於分組的直方圖
  • 用於關聯相關事件的配對匹配

2.6 謂詞(過濾器)

謂詞可依指定條件篩選事件,從而減少捕獲的資料量。您可以按資料庫名稱、應用程式名稱、會話 ID、持續時間閾值或任何事件欄位值進行篩選。

有效使用謂詞可以僅捕捉相關事件,從而最大限度地降低效能影響。複雜謂詞使用邏輯運算子組合多個條件,以建立精確的過濾標準。

3. 擴展事件會話狀態與生命週期

3.1 會話狀態:建立、修改和刪除

擴展活動環節會經歷不同的階段:

  • CREATE EVENT SESSION 語句定義了一個新會話,但不會啟動它。此會話處於停止狀態,直到被明確啟動。
  • ALTER EVENT SESSION 語句會修改會話配置或變更其在停止和啟動之間的狀態。
  • DROP EVENT SESSION 語句會從伺服器中完全刪除會話定義。

3.2 課程內容與特點

每個會話包含一系列事件、動作、目標和謂詞。會話具有隱含的邊界,用於定義其範圍和行為。配置選項控制記憶體分配、事件保留和調度延遲。

會話特性包括會話是否在伺服器重新啟動後仍然保持、最大記憶體分配以及如何處理記憶體壓力。這些設定會顯著影響會話行為和資源消耗。

3.3 會話邊界和包

會話邊界定義了事件、目標和套件之間的關係。一個套件中的事件可以觸發另一個套件中的操作,從而為資料收集策略提供了靈活性。

包關係可讓您在單一會話中合併來自多個來源的事件。此功能支援跨不同來源的全面監控場景。 SQL Server 子系統。

4. 使用 SSMS 建立擴充事件會話

4.1 前提條件與設置

創建前 SQL Server 若要使用擴展事件會話,請確保您擁有相應的權限。對於伺服器範圍的會話,您需要 ALTER ANY EVENT SESSION 權限;對於資料庫範圍的會話,您需要對資料庫擁有 CONTROL 權限。

驗證 SQL Server Management Studio 已安裝並連線到目標執行個體。請熟悉監控要求,並確定哪些事件和目標最符合您的需求。

4.2 在物件資源管理器中存取擴充事件

若要在 SSMS 中存取擴充事件介面,請依照下列步驟操作:

  1. 未結案工單 SQL Server 管理工作室並連接到您的 SQL Server 實例。
  2. 在物件資源管理器中,展開 管理 -> 擴展活動.
  3. 擴展事件節點包含 會議 以及 配套 用於管理監控配置的資料夾。

在「存取擴充事件」介面中 SQL Server 管理工作室。

4.3 建立新會話

建立新會話:

    1. 用鼠標右鍵單擊 會議 文件夾下 擴展活動.
    2. 選擇 新會議 開啟配置對話框。以下內容將使用此方法建立新會話。

在「擴展事件」中建立新會話 SQL Server 管理工作室。

注: 新建會話精靈 此外,還提供更具指導性的體驗。

4.3.1 常規頁面配置

上 一般規格 頁面,配置基本會話屬性:

  1. 輸入會話名稱 會話名稱 字段。使用能夠表明監控目的的描述性名稱。
  2. (可選) 伺服器啟動時啟動事件會話 啟用自動會話啟動功能。
  3. 預設會話模板是 空白筆記如果使用預先定義配置,則可以使用其他範本。

擴展活動會議的常規頁面 SQL Server 管理工作室。

4.3.2 活動頁面設置

这 活動 該頁面允許您選擇要監控的事件:

  1. 點擊 活動 從左側翻頁 選擇頁面 面板。
  2. 在 事件庫您可以瀏覽可參加的活動,或使用搜尋功能。
  3. 輸入「sql_statement_completed」等關鍵字篩選事件,以尋找相關事件。
  4. 選擇所需的事件,例如 sql_statement_completed。
  5. 點擊右箭頭按鈕將事件移到 精選事件 名單。

擴展活動會議的「活動」頁面 SQL Server 管理工作室。

4.3.3 資料儲存配置

这 資料存儲 頁面定義了事件資料的儲存位置:

  1. 點擊 資料存儲 從左側翻頁 選擇頁面 面板。
  2. 在 目標 在區域內,從下拉式選單中選擇目標類型。

擴展事件會話的資料儲存頁面 SQL Server 管理工作室。

(1)事件文件目標

event_file 目標將資料儲存到副檔名為 .xel 的磁碟檔案:

  1. 選擇 事件文件 從目標類型下拉式選單中選擇。
  2. 指定檔案路徑,例如 C:\temp\YourSession_Target.xel。
  3. 配置磁碟空間捲動選項,透過設定最大檔案大小和檔案數量來管理磁碟空間。
  4. 目標會持續寫入事件,直到會話停止或達到儲存限制。

在 SSMS 中將會話目標設定為 event_file

(2)環形緩衝區目標

ring_buffer 目標將事件儲存在記憶體中,以便快速訪問,無需磁碟 I/O:

  1. 選擇 環形緩衝區 作為目標類型。
  2. 配置緩衝區的最大記憶體分配。
  3. 請注意,當緩衝區填滿時,較早的事件將被丟棄,因此該功能適用於監控最近的活動。

將擴展事件會話的目標設定為 ring_buffer SQL Server 管理工作室。

(3)事件計數器目標

event_counter 目標僅統計事件發生的次數,而不儲存詳細資料。如果您只需要頻率資訊,這種方式可以最大限度地減少開銷。

在「擴充事件」會話中,將目標設為 event_counter SQL Server 管理工作室。

(4)直方圖目標

直方圖目標依指定欄位值將事件分組,產生分佈統計資料。這有助於識別常見模式或高頻值。

在「擴展事件」會話中,將目標設定為直方圖。 SQL Server 管理工作室。

(5)配對目標

pair_matching 目標關聯相關事件,例如鎖的取得和釋放。這使得我們可以分析成對操作及其時序關係。

在 SSMS 中將會話目標設定為 pair_matching

從未進階設定

这 進階功能 此頁面提供會話層級設定選項:

  1. 點擊 進階功能 從左側翻頁 選擇頁面 面板。
  2. 配置 事件保留模式 控制在記憶體壓力下如何處理事件。
  3. 套裝 最大調度延遲 平衡即時處理與系統效能。
  4. 配置 最大記憶體大小 以及 最大事件大小 根據您的監控需求。
  5. 選擇 記憶體分區模式 針對單CPU或多CPU環境進行最佳化。

會話的高級頁面 SQL Server 管理工作室。

4.4 配置事件過濾器(謂詞)

謂詞透過根據特定條件篩選事件來減少資料量。要配置篩選器:

  1. 上 活動 在頁面上,選擇要篩選的事件,例如「sql_statement_completed」。
  2. 點擊 配置 開啟事件配置對話框。
    配置擴展事件會話的事件 SQL Server 管理工作室。
  3. 點擊 過濾器(謂詞) 標籤。
  4. 在 場 從下拉式選單中選擇要篩選的字段,例如持續時間。
  5. 選擇一個 操作者例如“>”。
  6. 輸入篩選條件 價值例如 1000000(1 秒)。
  7. 如有必要,可新增更多條件。

配置事件的過濾器(謂詞)。

4.5 選擇操作和事件字段

對於每個事件,您可以選擇要收集的資料:

  1. 上 活動 在頁面上,選擇要選擇資料的事件,例如「sql_statement_completed」。
  2. 點擊 配置 開啟事件配置對話框。
  3. 點擊 全域字段(操作) 標籤。
  4. 選擇要新增補充資訊的操作,例如資料庫名稱或用戶端應用程式名稱。
    配置事件的操作。
  5. 回顧一下 事件欄位 此部分用於查看哪些欄位會自動捕獲。
  6. 清除不必要的欄位以減少資料量。
    配置事件的欄位。

4.6 啟動和管理會話

配置好會話後,即可啟動並監控其運作:

  1. 點擊 OK 建立會話。
  2. 在物件資源管理器中,展開 會議 資料夾,用於查看您的新會話。
  3. 右鍵單擊會話名稱並選擇 開始會議 開始記錄事件。
    在「開始擴展活動」中 SQL Server 管理工作室。
  4. 若要查看即時數據,請右鍵單擊會話並選擇 即時數據.
    觀看擴展活動會話的即時數據 SQL Server 管理工作室。
  5. 右鍵單擊並選擇“停止會話”即可停止會話。 停止會話.

5. 使用 T-SQL 建立擴充事件會話

5.1 建立事件會話語法

使用 T-SQL 建立擴展事件會話可精確控制,並支援編寫腳本以實現自動化部署。 CREATE EVENT SESSION 語句遵循特定的語法結構。

基本語法包括會話名稱、每個事件的 ADD EVENT 子句、儲存目標的 ADD TARGET 子句以及用於會話配置的可選 WITH 子句。

5.2 建立基本事件會話

基本會話監控特定事件並將結果寫入目標位置。以下是如何建立基本組件。

5.2.1 定義會話名稱和選項

首先,建立一個會話,並為其取一個描述性名稱:

CREATE EVENT SESSION [SampleSession] ON SERVER

ON SERVER 子句會建立一個伺服器範圍的會話,該會話會在資料庫變更後仍然有效。對於 Azure SQL 資料庫,請使用 ON DATABASE 子句建立資料庫範圍的會話。

5.2.2 使用 ADD EVENT 新增事件

使用 ADD EVENT 子句新增要擷取的事件:

CREATE EVENT SESSION [SampleSession] ON SERVER
ADD EVENT sqlserver.sql_statement_completed

這會擷取所有已完成的 SQL 語句。您可以透過新增額外的 ADD EVENT 子句來新增多個事件。

5.2.3 配置事件操作

操作會收集每個事件的附加上下文資訊。在事件名稱後的括號內新增動作:

CREATE EVENT SESSION [SampleSession] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.sql_text, sqlserver.database_name, sqlserver.username)
)

此範例擷取每個已完成語句的 SQL 文字、資料庫名稱和使用者名稱。

5.2.4 設定事件謂詞(WHERE 子句)

謂詞用於篩選事件以減少資料量。請在事件定義中使用 WHERE 子句:

CREATE EVENT SESSION [SampleSession] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.sql_text)
    WHERE ([package0].[greater_than_uint64]([duration],(5000000)))
)

此功能可篩選持續時間超過 5 秒(5,000,000 微秒)的語句。

5.3 新增事件目標

目標定義了事件資料的儲存位置以及處理方式。

5.3.1 新增目標語法

在所有事件定義完畢後,使用 ADD TARGET 子句新增目標:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\SampleSession.xel'
)

package0 前綴表示目標來自基礎軟體套件。

5.3.2 配置目標參數

每種目標類型都接受特定的參數。對於 event_file,請配置 filename、max_file_size 和 max_rollover_files:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\SampleSession.xel',
        max_file_size=(50),
        max_rollover_files=(5)
)

此配置會建立最大 50 MB 的文件,並透過捲動更新保留最多 5 個文件。

5.4 會話選項和設置

WITH 子句配置會話層級選項,以控制行為和資源使用。

5.4.1 MAX_MEMORY 和 EVENT_RETENTION_MODE

壓力下的記憶體分配與事件處理控制:

WITH (
    MAX_MEMORY=4096 KB,
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS
)

EVENT_RETENTION_MODE 選項包括:ALLOW_SINGLE_EVENT_LOSS(記憶體使用量最小)、ALLOW_MULTIPLE_EVENT_LOSS(開銷適中)和 NO_EVENT_LOSS(完全保留數據,但可能會影響效能)。

5.4.2 最大調度延遲

設定事件在寫入目標之前可以在緩衝區中保留的最長時間:

WITH (
    MAX_DISPATCH_LATENCY=30 SECONDS
)

較低的值可以提供更多的即時數據,但會增加 I/O 操作次數。

5.4.3 記憶體分區模式

針對硬體配置最佳化記憶體分區:

WITH (
    MEMORY_PARTITION_MODE=PER_CPU
)

選項包括:NONE(單一分區)、PER_NODE(NUMA 系統)和 PER_CPU(多 CPU 系統上的最大並發性)。

5.5 開始、停止和更改會話

透過 ALTER EVENT SESSION 語句管理會話狀態和配置。

5.5.1 更改事件會話以啟動/停止

建立會話後啟動會話:

ALTER EVENT SESSION [SampleSession] ON SERVER STATE = START;

停止正在進行的會話:

ALTER EVENT SESSION [SampleSession] ON SERVER STATE = STOP;

5.5.2 修改現有會話

停止運行時修改會話配置。新增事件:

ALTER EVENT SESSION [SampleSession] ON SERVER
ADD EVENT sqlserver.sql_batch_completed;

移除事件:

ALTER EVENT SESSION [SampleSession] ON SERVER
DROP EVENT sqlserver.sql_statement_completed;

5.5.3 取消活動會話

使用 DROP EVENT SESSION 指令完全刪除會話:

DROP EVENT SESSION [SampleSession] ON SERVER;

掉線前必須停止會話。

6. 詳細處理事件目標

6.1 事件文件目標配置

event_file 目標為事件資料提供持久存儲,並提供靈活的配置選項。

6.1.1 檔案路徑和命名規則

請指定事件檔案的完整路徑和檔案名稱:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\MySession.xel'
)

擴充事件日誌檔請使用 .xel 副檔名。確保 SQL Server 服務帳戶對指定目錄具有寫入權限。

6.1.2 文件滾動和大小管理

配置自動檔案輪換機制以管理磁碟空間:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\MySession.xel',
        max_file_size=(50),
        max_rollover_files=(10)
)

當檔案大小達到 50 MB 時, SQL Server 擴充事件會建立一個後綴遞增的新檔案。當文件數量達到 10 個時,最舊的文件將被覆蓋。

6.1.3 讀取事件檔數據

使用sys.fn_xe_file_target_read_file函數查詢事件檔案資料:

SELECT
    event_data,
    file_name,
    file_offset
FROM sys.fn_xe_file_target_read_file(
    'C:\XEvents\MySession*.xel',
    NULL, NULL, NULL
);

通配符模式會讀取與會話關聯的所有檔案。

6.2 環形緩衝區目標用途

ring_buffer 目標將事件儲存在記憶體中,以便快速存取最近的活動。

6.2.1 基於記憶體的事件存儲

配置環形緩衝區以使用記憶體儲存:

ADD TARGET package0.ring_buffer

活動僅在會話期間可用,且 SQL Server 正在運行。會話停止或伺服器重新啟動時,資料將會遺失。

6.2.2 緩衝區大小與配置

控制環形緩衝區記憶體分配:

ADD TARGET package0.ring_buffer(
    SET max_memory=(4096)
)

以 KB 為單位指定記憶體大小。當緩衝區滿時,將採用先進先出 (FIFO) 的方式丟棄較早的事件。

6.2.3 查詢環形緩衝區數據

透過 DMV 存取環形緩衝區資料:

SELECT
    CAST(target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets AS t
JOIN sys.dm_xe_sessions AS s
    ON s.address = t.event_session_address
WHERE s.name = 'YourSessionName'
    AND t.target_name = 'ring_buffer';

target_data 包含 XML 格式的事件資訊。

6.3 事件計數器目標

event_counter 目標提供簡單的計數功能,不提供詳細的資料儲存:

ADD TARGET package0.event_counter

此目標以最小的開銷追蹤事件頻率,適用於只關注計數的大容量監控。

6.4 直方圖目標

直方圖目標按欄位值對事件進行分組:

ADD TARGET package0.histogram(
    SET filtering_event_name=N'sqlserver.sql_statement_completed',
        source_type=0,
        source=N'database_name'
)

此配置會建立一個直方圖,顯示事件在各個資料庫中的分佈。

6.5 配對目標

pair_matching 目標將鎖的獲取與釋放等相關事件關聯起來:

ADD TARGET package0.pair_matching(
    SET begin_event=N'sqlserver.lock_acquired',
        end_event=N'sqlserver.lock_released',
        begin_matching_columns=N'resource_type',
        end_matching_columns=N'resource_type'
)

這樣就可以分析成對操作及其持續時間。

7. 檢視和分析擴展事件數據

7.1 使用 SSMS 查看即時數據

SQL Server Management Studio 提供了一個圖形介面,用於即時查看擴展事件資料:

  1. 在物件資源管理器中,展開 管理 -> 擴展活動 -> 會議.
  2. 右鍵單擊目前會話。
  3. 選擇 即時數據 開啟即時數據檢視器。
    觀看擴展活動會話的即時數據 SQL Server 管理工作室。
  4. 事件發生時會顯示在網格中。
  5. 點選各個事件,即可在詳細資料窗格中查看詳細的欄位值。
    查看賽事即時數據,包括賽事詳情。
  6. 使用工具列篩選器來關注特定事件類型或欄位值。

7.2 使用 T-SQL 查詢事件文件數據

T-SQL 查詢可對擷取的事件資料進行靈活的分析。

7.2.1 sys.fn_xe_file_target_read_file 函數

使用此系統函數讀取事件檔案資料:

SELECT
    object_name AS EventName,
    CAST(event_data AS XML) AS EventData,
    file_name,
    file_offset,
    timestamp_utc
FROM sys.fn_xe_file_target_read_file(
    'C:\XEvents\MySession*.xel',
    NULL, NULL, NULL
);

該函數為每個事件傳回一行,其中包含 XML 格式的詳細資訊。

7.2.2 解析 XML 事件數據

從 XML 事件資料中提取特定值:

SELECT
    event_data.value('(event/@name)[1]', 'VARCHAR(50)') AS EventName,
    event_data.value('(event/@timestamp)[1]', 'DATETIME2') AS Timestamp,
    event_data.value('(event/data[@name="duration"]/value)[1]', 'BIGINT') AS Duration,
    event_data.value('(event/data[@name="statement"]/value)[1]', 'VARCHAR(MAX)') AS Statement
FROM (
    SELECT CAST(event_data AS XML) AS event_data
    FROM sys.fn_xe_file_target_read_file(
        'C:\XEvents\MySession*.xel',
        NULL, NULL, NULL
    )
) AS EventData;

XQuery表達式從XML結構中擷取各個欄位的值。

7.2.3 將事件資料轉換為表格

從事件資料建立結構化結果集:

WITH EventData AS (
    SELECT CAST(event_data AS XML) AS EventXML
    FROM sys.fn_xe_file_target_read_file(
        'C:\XEvents\MySession*.xel',
        NULL, NULL, NULL
    )
)
SELECT
    EventXML.value('(event/@name)[1]', 'VARCHAR(100)') AS EventName,
    EventXML.value('(event/data[@name="cpu_time"]/value)[1]', 'BIGINT') AS CPUTime,
    EventXML.value('(event/data[@name="physical_reads"]/value)[1]', 'BIGINT') AS PhysicalReads,
    EventXML.value('(event/action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS SQLText,
    EventXML.value('(event/action[@name="database_name"]/value)[1]', 'VARCHAR(128)') AS DatabaseName
FROM EventData;

7.3 查詢環形緩衝區數據

從環形緩衝區目標中提取資料:

SELECT
    n.value('(@name)[1]', 'VARCHAR(50)') AS EventName,
    n.value('(@timestamp)[1]', 'DATETIME2') AS Timestamp,
    n.value('(data[@name="duration"]/value)[1]', 'BIGINT') AS Duration,
    n.value('(action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS SQLText
FROM (
    SELECT CAST(target_data AS XML) AS TargetData
    FROM sys.dm_xe_session_targets AS t
    JOIN sys.dm_xe_sessions AS s
        ON s.address = t.event_session_address
    WHERE s.name = 'YourSessionName'
        AND t.target_name = 'ring_buffer'
) AS Data
CROSS APPLY TargetData.nodes('//event') AS q(n);

7.4 擴展事件的系統視圖

SQL Server 提供多個 DMV 和目錄視圖,用於管​​理和監控擴展事件會話。

7.4.1 sys.server_event_sessions

查看伺服器中儲存的會話定義:

SELECT
    name,
    event_retention_mode_desc,
    max_dispatch_latency,
    max_memory,
    max_event_size,
    memory_partition_mode_desc
FROM sys.server_event_sessions;

此目錄視圖顯示所有已定義會話的設定詳細資訊。

7.4.2 sys.dm_xe_sessions

查看目前正在進行的會話:

SELECT
    name,
    create_time,
    total_regular_buffers,
    regular_buffer_size,
    total_large_buffers,
    large_buffer_size
FROM sys.dm_xe_sessions;

此 DMV 提供有關活動擴展事件會話的運行時資訊。

7.4.3 sys.dm_xe_session_targets

查看與目前會話相關的目標:

SELECT
    s.name AS SessionName,
    t.target_name,
    t.execution_count,
    t.execution_duration_ms
FROM sys.dm_xe_session_targets AS t
JOIN sys.dm_xe_sessions AS s
    ON s.address = t.event_session_address;

7.4.4 其他有用的 DMV

其他視圖提供全面的會話資訊:

  • sys.dm_xe_session_events:列出活動會話中的事件
  • sys.dm_xe_session_event_actions:顯示為會話事件配置的動作
  • sys.dm_xe_objects:對所有可用的事件、操作和目標進行編目
  • sys.dm_xe_object_columns:每個事件類型可用的詳細資料字段
  • sys.dm_xe_packages:列出所有擴充事件包

8. 實際應用案例和範例

8.1 監控 SQL 語句執行

追蹤 SQL 語句執行情況可以深入了解查詢模式和效能特徵。

8.1.1 追蹤 sql_statement_completed 事件

建立會話以監控已完成的 SQL 語句:

CREATE EVENT SESSION [QueryMonitoring] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(
        sqlserver.sql_text,
        sqlserver.database_name,
        sqlserver.client_hostname,
        sqlserver.username
    )
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\QueryMonitoring.xel',
        max_file_size=(100),
        max_rollover_files=(5)
)
WITH (
    MAX_MEMORY=4096 KB,
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
    MAX_DISPATCH_LATENCY=30 SECONDS,
    STARTUP_STATE=OFF
);

ALTER EVENT SESSION [QueryMonitoring] ON SERVER STATE = START;

8.1.2 按資料庫或應用程式進行篩選

使用謂詞來關注特定的資料庫或應用程式:

CREATE EVENT SESSION [AppSpecificMonitoring] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.sql_text, sqlserver.client_app_name)
    WHERE (
        [sqlserver].[database_name] = N'YourDatabase'
        AND [sqlserver].[client_app_name] LIKE N'YourApplication%'
    )
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\AppMonitoring.xel'
);

8.2 捕獲死鎖訊息

死鎖分析需要獲取有關衝突交易的詳細資訊。

8.2.1 xml_deadlock_report 事件

建立一個會話以捕捉完整的死鎖圖:

CREATE EVENT SESSION [DeadlockMonitoring] ON SERVER
ADD EVENT sqlserver.xml_deadlock_report(
    ACTION(
        sqlserver.database_name,
        sqlserver.sql_text
    )
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\Deadlocks.xel'
)
WITH (STARTUP_STATE=ON);

ALTER EVENT SESSION [DeadlockMonitoring] ON SERVER STATE = START;

8.2.2 分析死鎖圖

提取並分析死鎖資訊:

SELECT
    EventXML.value('(event/@timestamp)[1]', 'DATETIME2') AS DeadlockTime,
    EventXML.query('.') AS DeadlockGraph
FROM (
    SELECT CAST(event_data AS XML) AS EventXML
    FROM sys.fn_xe_file_target_read_file(
        'C:\XEvents\Deadlocks*.xel',
        NULL, NULL, NULL
    )
) AS EventData
WHERE EventXML.value('(event/@name)[1]', 'VARCHAR(50)') = 'xml_deadlock_report';

死鎖圖包含有關進程、資源和受害者選擇的詳細資訊。

8.3 追蹤查詢效能問題

利用查詢持續時間和資源消耗指標來識別效能不佳的查詢。

8.3.1 長時間運行查詢檢測

捕獲超過特定持續時間閾值的查詢:

CREATE EVENT SESSION [LongRunningQueries] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(
        sqlserver.sql_text,
        sqlserver.database_name,
        sqlserver.plan_handle
    )
    WHERE ([duration] > 5000000)  -- 5 seconds in microseconds
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\LongQueries.xel'
);

8.3.2 執行計劃分析

捕獲查詢計劃以進行效能分析:

CREATE EVENT SESSION [QueryPlans] ON SERVER
ADD EVENT sqlserver.query_post_execution_showplan(
    ACTION(
        sqlserver.sql_text,
        sqlserver.database_name
    )
    WHERE ([duration] > 10000000)  -- 10 seconds
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\QueryPlans.xel',
    max_file_size=(200)
);

8.4 監控登入和安全事件

追蹤身份驗證和授權活動,以進行安全審計。

8.4.1 登入成功與失敗追蹤

監控成功與失敗的登入嘗試:

CREATE EVENT SESSION [LoginMonitoring] ON SERVER
ADD EVENT sqlserver.login(
    ACTION(
        sqlserver.client_hostname,
        sqlserver.client_app_name
    )
),
ADD EVENT sqlserver.login_failed(
    ACTION(
        sqlserver.client_hostname
    )
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\Logins.xel'
)
WITH (STARTUP_STATE=ON);

8.4.2 權限變更

追蹤安全權限變更:

CREATE EVENT SESSION [SecurityChanges] ON SERVER
ADD EVENT sqlserver.server_principal_management_event,
ADD EVENT sqlserver.database_principal_management_event,
ADD EVENT sqlserver.database_permission_change_event
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\SecurityAudit.xel'
);

8.5 資料庫級監控

監控資料庫特定操作和狀態變化。

8.5.1 備份和還原事件

追蹤備份和恢復操作:

CREATE EVENT SESSION [BackupMonitoring] ON SERVER
ADD EVENT sqlserver.backup_restore_progress_trace,
ADD EVENT sqlserver.databases_backup_restore_event
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\BackupRestore.xel'
);

8.5.2 資料庫狀態變更

監控資料庫狀態轉換:

CREATE EVENT SESSION [DatabaseStateChanges] ON SERVER
ADD EVENT sqlserver.database_started,
ADD EVENT sqlserver.database_stopped
ADD TARGET package0.ring_buffer;

8.6 偵測資料庫損壞和完整性問題

SQL Server 擴展事件提供早期預警功能,可偵測潛在的資料庫損壞,從而在問題升級之前進行主動幹預。

8.6.1 腐敗檢測的關鍵事件

多起事件表示可能存在資料損壞或 I/O 問題。

8.6.1.1 嚴重錯誤報告事件

error_reported 事件捕獲所有 SQL Server 錯誤,包括與資料損壞相關的錯誤編號:

ADD EVENT sqlserver.error_reported(
    WHERE (
        [severity] >= (20)
        OR [error_number] IN (823, 824, 825, 832, 855, 856)
    )
)

錯誤 823 表示 I/O 錯誤,824 表示邏輯一致性錯誤,825 表示讀取重試成功,這可能表示硬體問題。

8.6.1.2 database_suspect_data_page 事件

當…時觸發此事件 SQL Server 遇到可疑頁面:

ADD EVENT sqlserver.database_suspect_data_page

可疑頁面表示可能有損壞,並記錄在 msdb.dbo.suspect_pages 表中。

8.6.1.3 errorlog_writing 事件

捕獲寫入到 SQL Server 錯誤日誌:

ADD EVENT sqlserver.errorlog_written(
    WHERE ([severity] >= (16))
)

8.6.2 創建腐敗監測會議

建立一套全面的腐敗檢測和監控機制。

8.6.2.1 過濾損壞錯誤編號(823、824、825)

組織以腐敗指標為重點的專案會議:

CREATE EVENT SESSION [CorruptionDetection] ON SERVER
ADD EVENT sqlserver.error_reported(
    ACTION(
        sqlserver.database_name,
        sqlserver.sql_text
    )
    WHERE (
        [error_number] IN (823, 824, 825, 832, 855, 856)
        OR [severity] >= (20)
    )
),
ADD EVENT sqlserver.database_suspect_data_page(
    ACTION(
        sqlserver.database_name
    )
)
8.6.2.2 設定適當的嚴重程度等級

包括可能表明存在資料損壞的高風險錯誤:

WHERE (
    [severity] >= (20)
    OR [error_number] IN (823, 824, 825)
)

嚴重程度 20 以上表示系統級問題,這些問題通常與腐敗有關。

8.6.2.3 配置警報事件文件目標

儲存腐敗事件以便進行分析和警報:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\CorruptionMonitoring.xel',
        max_file_size=(50),
        max_rollover_files=(10)
)
WITH (
    STARTUP_STATE=ON,
    MAX_DISPATCH_LATENCY=5 SECONDS
);

ALTER EVENT SESSION [CorruptionDetection] ON SERVER STATE = START;

8.6.3 分析貪腐事件數據

從採集的數據中提取並解釋與腐敗相關的事件。

8.6.3.1 識別可疑頁面

查詢 database_suspect_data_page 事件:

SELECT
    EventXML.value('(event/@timestamp)[1]', 'DATETIME2') AS EventTime,
    EventXML.value('(event/data[@name="database_id"]/value)[1]', 'INT') AS DatabaseID,
    EventXML.value('(event/data[@name="file_id"]/value)[1]', 'INT') AS FileID,
    EventXML.value('(event/data[@name="page_id"]/value)[1]', 'BIGINT') AS PageID,
    EventXML.value('(event/action[@name="database_name"]/value)[1]', 'VARCHAR(128)') AS DatabaseName
FROM (
    SELECT CAST(event_data AS XML) AS EventXML
    FROM sys.fn_xe_file_target_read_file(
        'C:\XEvents\CorruptionMonitoring*.xel',
        NULL, NULL, NULL
    )
) AS EventData
WHERE EventXML.value('(event/@name)[1]', 'VARCHAR(50)') = 'database_suspect_data_page';
8.6.3.2 提取錯誤詳情和上下文

分析錯誤報告事件中的損壞模式:

SELECT
    EventXML.value('(event/@timestamp)[1]', 'DATETIME2') AS ErrorTime,
    EventXML.value('(event/data[@name="error_number"]/value)[1]', 'INT') AS ErrorNumber,
    EventXML.value('(event/data[@name="severity"]/value)[1]', 'INT') AS Severity,
    EventXML.value('(event/data[@name="message"]/value)[1]', 'VARCHAR(MAX)') AS ErrorMessage,
    EventXML.value('(event/action[@name="database_name"]/value)[1]', 'VARCHAR(128)') AS DatabaseName,
    EventXML.value('(event/action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS SQLText
FROM (
    SELECT CAST(event_data AS XML) AS EventXML
    FROM sys.fn_xe_file_target_read_file(
        'C:\XEvents\CorruptionMonitoring*.xel',
        NULL, NULL, NULL
    )
) AS EventData
WHERE EventXML.value('(event/@name)[1]', 'VARCHAR(50)') = 'error_reported'
    AND EventXML.value('(event/data[@name="error_number"]/value)[1]', 'INT') IN (823, 824, 825);

8.6.4 與 DBCC CHECKDB 集成

使用擴展事件數據進行指導 DBCC 檢查數據庫 執行。

8.6.4.1 基於事件觸發 DBCC CHECKDB

當偵測到損壞事件時,執行 DBCC CHECKDB 進行全面驗證:

-- After detecting corruption events, run DBCC CHECKDB
DBCC CHECKDB ('YourDatabaseName') WITH NO_INFOMSGS, ALL_ERRORMSGS;

擴充事件提供早期預警,而 DBCC CHECKDB 執行徹底驗證。

8.6.4.2 自動化反腐敗因應工作流程

透過監控事件文件實現自動回應:

  1. 配置 SQL Server 代理任務定期查詢腐敗監控事件文件。
  2. 當發現損壞事件時,對受影響的資料庫執行 DBCC CHECKDB。
  3. 向資料庫管理員發送包含事件詳情和 DBCC CHECKDB 結果的電子郵件提醒。
  4. 將調查結果記錄到集中式監控表中,以便進行趨勢分析。
8.6.4.3 平衡主動監控與績效

與經常執行 DBCC CHECKDB 相比,擴充事件可提供開銷較低的資料損壞偵測:

  • 持續運行擴展事件以進行即時損壞檢測
  • 僅當出現損壞指示符時才執行 DBCC CHECKDB
  • 在維護視窗期間定期執行 DBCC CHECKDB 命令
  • 使用擴展事件來識別哪些資料庫需要立即關注

這種方法可以在不消耗大量資源進行持續完整性檢查的情況下,實現主動監控。

8.6.4.4 修復損壞的資料庫

如果偵測到資料庫損壞,可以使用 DBCC CHECKDB 修復輕微損壞。如果失敗,可以嘗試使用第三方工具。 SQL資料庫復原工具通常情況下,對於嚴重損壞的資料庫,此方法能提供更高的恢復率。

9. 伺服器作用域與資料庫作用域的擴展事件

9.1 伺服器作用域事件會話

伺服器範圍的會話監控整個系統的活動。 SQL Server 例如,這些會話是使用 ON SERVER 子句建立的,並持久保存在主資料庫中。

CREATE EVENT SESSION [ServerWideMonitoring] ON SERVER
ADD EVENT sqlserver.sql_statement_completed
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\ServerWide.xel'
);

伺服器範圍的會話可以擷取所有資料庫的事件,適用於實例級監控。

9.2 資料庫範圍事件會話(Azure SQL 資料庫)

資料庫範圍的會話僅限於單一資料庫,主要用於 Azure SQL 資料庫,其中伺服器層級的存取受到限制:

CREATE EVENT SESSION [DatabaseSpecificMonitoring] ON DATABASE
ADD EVENT sqlserver.sql_statement_completed
ADD TARGET package0.event_file(
    SET filename=N'DatabaseMonitoring.xel'
);

在 Azure SQL 資料庫中,事件檔案儲存在 Azure Blob 儲存體中,而不是本機檔案系統。

9.3 差異與應用案例

伺服器級會話可對所有資料庫進行全面監控,但需要更高的權限。資料庫層級會話提供隔離性,適用於監控特定應用程式或租用戶。

使用伺服器範圍會話可實現集中式監控、跨資料庫效能故障排除和安全性稽核。在 Azure SQL 資料庫、多租用戶環境或將監控職責委派給應用程式團隊時,請使用資料庫範圍工作階段。

10. Azure SQL 資料庫中的擴充事件

10.1 Azure 特有的注意事項

Azure SQL 資料庫實作了擴充事件,但與本機部署的擴充事件存在一些差異。 SQL Server預設情況下,會話範圍限定在資料庫範圍內,事件檔案儲存使用 Azure Blob 儲存體而非本機檔案系統。

對 Azure Blob 儲存體進行驗證需要使用在事件檔案目標中設定的 SAS 令牌。連接字串引用儲存事件檔案的儲存帳戶和容器。

10.2 Azure 中的可用目標

Azure SQL 資料庫支援以下擴充事件目標:

  • event_file:寫入 Azure Blob 存儲
  • ring_buffer:基於記憶體的存儲,其行為與本機儲存相同。
  • event_counter:統計事件發生次數

event_file 目標需要使用 Azure Blob 儲存體憑證進行設定:

ADD TARGET package0.event_file(
    SET filename=N'https://yourstorageaccount.blob.core.windows.net/container/EventFile.xel'
)

10.3 建立資料庫範圍的會話

在 Azure SQL 資料庫中建立會話:

CREATE EVENT SESSION [AzureMonitoring] ON DATABASE
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.sql_text, sqlserver.database_name)
)
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB);

ALTER EVENT SESSION [AzureMonitoring] ON DATABASE STATE = START;

Azure 中的資料庫範圍會話與本機伺服器範圍會話的行為類似,但範圍僅限於目前資料庫。

11. 最佳實踐和效能優化

11.1 最大限度減少對性能的影響

擴展事件旨在最大限度地減少系統開銷,但配置不當可能會影響效能。請遵循以下準則:

  • 使用特定的謂詞來篩選事件,而不是捕捉所有事件。
  • 避免執行不必要的操作,以免增加處理開銷。
  • 根據資料保留需求選擇合適的目標
  • 設定合理的緩衝區大小和調度延遲
  • 使用 DMV 監控會話資源消耗

11.2 選擇適當的事件和篩選條件

選擇能夠直接滿足監控目標的事件。除非必要,否則避免選擇高頻事件,並始終應用謂詞來減少資料量。

例如,與其捕獲所有 sql_statement_completed 事件,不如篩選特定資料庫或持續時間閾值:

WHERE (
    [sqlserver].[database_name] = N'ProductionDB'
    AND [duration] > 1000000
)

11.3 目標選擇指南

根據您的分析需求選擇目標:

  • 使用 event_file 進行詳細的歷史分析和長期保存
  • 使用環形緩衝區進行即時監控,對 I/O 的影響最小。
  • 當僅考慮發生頻率時,請使用 event_counter。
  • 使用直方圖進行分佈分析
  • 使用 pair_matching 進行相關事件分析

11.4 會話配置建議

配置具有適當資源限制的會話:

  • 根據預期事件量和伺服器資源設定 MAX_MEMORY
  • 在大多數情況下,使用 ALLOW_SINGLE_EVENT_LOSS 可以最大限度地減少開銷。
  • 設定 MAX_DISPATCH_LATENCY 以平衡即時性需求和效能。
  • 在多處理器系統上使用 PER_CPU 記憶體分區
  • 除非需要持續監控,否則請避免設定 STARTUP_STATE=ON。

11.5 管理事件檔案大小和保留

設定檔輪換機制以防止磁碟使用量無限制:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\Session.xel',
        max_file_size=(100),
        max_rollover_files=(10)
)

此配置可保存約 1 GB 的事件資料(10 個檔案 × 100 MB)。請根據您的資料保留要求和可用儲存空間進行調整。

12. 擴展事件故障排除

12.1 常見問題及解決方案

常見的擴展事件問題包括會話無法捕獲資料、效能下降、檔案目標問題以及會話行為異常。

12.2 會話未捕獲數據

如果會話未捕獲預期事件:

  1. 使用 sys.dm_xe_sessions 驗證會話是否已啟動。
  2. 檢查謂詞,確保它們不會過濾掉所有事件。
  3. 透過暫時移除篩選器來確認事件是否觸發。
  4. 檢查權限,確保您有權查看會話資料。
  5. 檢查目標配置是否正確且可寫入。
SELECT name, create_time
FROM sys.dm_xe_sessions
WHERE name = 'YourSessionName';

12.3 性能下降

如果擴展事件導致效能問題:

  1. 加入謂詞以減少事件數量。
  2. 刪除收集補充資料的不必要操作。
  3. 增加 MAX_DISPATCH_LATENCY 以降低寫入頻率。
  4. 將 EVENT_RETENTION_MODE 改為 ALLOW_SINGLE_EVENT_LOSS。
  5. 對於高頻事件,請考慮使用 ring_buffer 取代 event_file。

12.4 文件目標問題

檔案目標問題通常與權限或磁碟空間有關:

  1. 驗證 SQL Server 服務帳戶對目標目錄具有寫入權限。
  2. 請確保有足夠的磁碟空間。
  3. 檢查指定的路徑是否存在且可存取。
  4. 如果檔案沒有如預期輪換,請檢查檔案輪換配置。

12.5 使用系統視圖進行調試

使用 DMV 診斷擴展事件問題:

-- Check session status
SELECT s.name, s.create_time, s.total_regular_buffers, s.total_large_buffers
FROM sys.dm_xe_sessions AS s;

-- View session targets and their status
SELECT
    s.name AS SessionName,
    t.target_name,
    t.execution_count,
    CAST(t.target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets AS t
JOIN sys.dm_xe_sessions AS s
    ON s.address = t.event_session_address;

-- Check for dropped events
SELECT s.name, s.dropped_event_count, s.dropped_buffer_count
FROM sys.dm_xe_sessions AS s;

13. 高級主題

13.1 建立自訂活動套餐

高級用戶可以建立自訂事件包來擴展 SQL Server 擴展事件功能。這需要使用 C++ 進行開發並與…整合。 SQL Server 可擴展性框架。

自訂軟體包能夠監控特定應用程式的事件,或將第三方監控系統與擴展事件基礎架構整合。

13.2 活動會議模板

SSMS 為常見的監控場景提供了內建範本。您可以透過精靈建立新會話時存取這些範本:

  1. 在「新會話」對話方塊中,按一下 模板 落下。
  2. 從可用範本中進行選擇,例如查詢詳情追蹤或系統運作狀況。
  3. 根據您的具體需求修改範本。

13.3 與監控解決方案集成

擴展事件資料可為企業監控解決方案提供資料:

  • 將事件資料匯出到集中式日誌系統
  • 解析事件檔案並將資料載入到監控資料庫中
  • 使用 BI 工具建立自訂儀表板
  • 根據特定事件模式觸發警報
  • 相關 SQL Server 包含應用程式和基礎架構指標的事件

13.4 自動化和調度

使用自動化擴展事件管理 SQL Server 代理人:

  • 建立作業,以便在特定時間段內啟動/停止會話。
  • 日程事件文件分析與報告
  • 透過歸檔或刪除舊事件檔案來實施資料保留策略
  • 自動回應偵測到的情況,例如效能問題或安全事件。

14. 從 SQL Server 輪廓

14.1 SQL Server 分析器事件到擴展事件的映射

微軟提供了映射關係 SQL Server 輪廓 事件和擴展事件。常見映射包括:

  • SQL:BatchCompleted -> sql_batch_completed
  • SQL:BatchStarting -> sql_batch_starting
  • SQL:StmtCompleted -> sql_statement_completed
  • SQL:StmtStarting -> sql_statement_starting
  • 死鎖圖 -> xml_deadlock_report
  • 審核登入 -> 登入
  • 審計註銷 -> 註銷

14.2 轉換追蹤定義

轉換現有的 SQL Server Profiler 透過識別等效事件並配置相應的謂詞來追蹤擴展事件會話。 SSMS 為常見轉換提供輔助功能。

檢查追蹤篩選器並將其轉換為擴展事件謂詞。擴展事件中的操作會取代追蹤列。 SQL Server 探查器。

14.3 性能比較

擴展事件的效能明顯優於其他事件。 SQL Server 性能分析器。基準測試研究表明,擴展事件消耗的 CPU 週期更少,對交易吞吐量的影響也更小。

擴展事件使用非同步處理和最佳化的記憶體管理, SQL Server Profiler 依賴同步事件捕獲,該捕獲會阻塞直到追蹤處理完成。

15. 結論

15.1 關鍵概念總結

SQL Server 擴展事件提供了一個強大而輕量級的框架,用於監控和故障排除。 SQL Server該架構由事件、動作、謂詞、目標和會話組成,它們共同協作以捕獲相關的伺服器活動。

可以使用 SSMS 或 T-SQL 建立會話,從而為臨時故障排除和自動化監控提供了靈活性。多種目標類型支援不同的分析方法,從使用 ring_buffer 進行即時監控到使用 event_file 進行歷史分析。

擴展事件相較之下可提供更優異的效能 SQL Server Profiler 提供更全面的監控功能。該系統使資料庫管理員和開發人員能夠診斷問題、優化效能、增強安全性並確保合規性。

15.2 後續步驟和更多資源

繼續發展你的 SQL Server XEvents 專業知識:

  • 在測試環境中實現擴展事件,以獲得實務經驗
  • 查閱 Microsoft 文件以取得完整的事件目錄和詳細的語法參考
  • 加入我們 SQL Server 社群論壇,可以學習他人的經驗
  • 探索高級應用場景,例如自訂軟體包和與監控平台的集成
  • 開發一個用於常見監控場景的會話範本庫

16 常見問題解答

問:什麼是 SQL Server 擴展活動?

A: SQL Server 擴展事件是一個輕量級的效能監控系統,整合到 SQL Server 資料庫引擎,能夠以最小的開銷捕獲有關伺服器操作的詳細資訊。

Q:擴展事件與傳統事件有何不同? SQL Server 分析器?

答:擴展事件相比其他事件,效能更佳、開銷更低、配置更靈活。 SQL Server 探查器。 SQL Server Profiler 已棄用,微軟建議對所有監控任務使用擴充事件。

Q:擴展事件是否會影響 SQL Server 性能?

答:如果配置得當,使用適當的謂詞和資源限制,擴展事件對效能的影響極小。但如果配置不當,沒有進行過濾,可能會影響效能。

Q:建立擴展活動會話需要哪些權限?

答:對於伺服器範圍的會話,您需要 ALTER ANY EVENT SESSION 權限;對於資料庫範圍的會話,您需要對資料庫擁有 CONTROL 權限。

Q:如何查看擴充事件資料?

答:使用 SQL Server Management Studio 的即時資料檢視器,使用 sys.fn_xe_file_target_read_file 查詢事件文件,或透過 DMV 查詢環形緩衝區資料。

Q:擴充事件能否偵測到資料庫損壞?

答:是的,擴充事件可以捕捉與損壞相關的錯誤(823、824、825)和可疑頁面事件,從而為潛在的損壞問題提供早期預警。

Q:事件、動作和謂詞有什麼差別?

答:事件是指您想要監控的發生情形。操作會為捕獲的事件添加補充資訊。謂詞會根據條件篩選事件,以減少資料量。

Q:如何監控來自特定應用程式或資料庫的查詢?

答:在事件配置中使用謂詞,按 database_name、client_app_name 或其他相關欄位進行篩選。

Q:擴展事件應該使用哪些目標?

A:使用 event_file 進行持久存儲和歷史分析,使用 ring_buffer 進行低開銷的即時監控,使用 event_counter 進行簡單的頻率跟踪,使用 histogram 進行分佈分析。

Q:Azure SQL 資料庫中是否提供擴充事件?

答:是的,Azure SQL 資料庫支援資料庫範圍的擴充事件,事件檔案儲存在 Azure Blob 儲存體中。

Q:如何排查擴展事件會話無法擷取資料的問題?

A:驗證會話是否已啟動,檢查謂詞是否過濾了所有事件,確認目標配置,並使用系統 DMV 檢查權限。

Q:我能否實現擴展事件管理的自動化?

答:是的,使用 SQL Server 代理任務用於啟動/停止會話、分析事件文件、實施保留策略以及回應偵測到的情況。

參考


關於作者

元盛 是一位資深資料庫管理員 (DBA),擁有超過 10 年的 SQL Server 環境和企業資料庫管理。他成功解決了金融服務、醫療保健和製造業等行業的數百個資料庫恢復場景。

袁專長於 SQL Server 資料庫復原 高可用性解決方案以及性能優化。他擁有豐富的實務經驗,包括管理數TB資料庫、實施等。 始終在線可用性組並為關鍵業務系統開發自動化備份和復原策略。

透過他的技術專長和實踐方法,袁致力於創建全面的指南,幫助資料庫管理員和 IT 專業人員解決複雜的 SQL Server 高效應對挑戰。他始終掌握最新 SQL Server 版本和微軟不斷發展的資料庫技術,定期測試恢復場景以確保他的建議反映現實世界的最佳實踐。

有關於的問題 SQL Server 恢復或需要額外的資料庫故障排除指導?袁歡迎 回饋和建議 用於改進這些技術資源。

立即分享: