闽公网安备 35020302035485号
--窗口1 --建表 USE testdb GO CREATE TABLE Account(id INT, name NVARCHAR(200)) INSERT INTO [dbo].[Account] SELECT 1,'Lucy' UNION ALL SELECT 2,'Tom' UNION ALL SELECT 3,'Marry' --堆代码 duidaima.com --查询 SELECT * FROM [dbo].[Account]2.创建扩展事件


4.不要使用模版






CREATE EVENT SESSION [slowquerylog]
ON SERVER
ADD EVENT sqlserver.blocked_process_report
(ACTION
(
sqlserver.client_app_name,
sqlserver.client_hostname,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.plan_handle,
sqlserver.query_hash,
sqlserver.request_id,
sqlserver.session_id,
sqlserver.sql_text
)
)
ADD TARGET package0.event_file
(SET filename = N'E:\DBExtentEvent\slowquerylog.xel')
WITH
(
STARTUP_STATE = ON
);
GO
完成。

--窗口2 --locked process threshold是SQL Server2005推出的一个选项 --设置阻塞进程阈值 sp_configure 'show advanced options', 1 ; GO RECONFIGURE ; GO sp_configure 'blocked process threshold', 10 ; --10秒 GO RECONFIGURE ; GO执行一个update语句,不要commit
--窗口3 USE testdb; GO BEGIN tran update Account set name ='Test' where ID = 2 --commit 复制代码 查询数据 复制代码 -- 窗口4 USE testdb; GO -- 这个查询会被窗口3中的事务阻塞 SELECT * FROM Account WHERE ID = 2执行完毕之后,你可以看到扩展事件已经记录下来了




-- 查询扩展事件 XEL 文件内容
SELECT
event_data.value('(event/@name)[1]', 'VARCHAR(50)') AS event_name,
event_data.value('(event/@timestamp)[1]', 'DATETIME2') AS event_timestamp,
event_data.value('(event/data[@name="duration"]/value)[1]', 'INT') AS duration,
event_data.value('(event/action[@name="client_app_name"]/value)[1]', 'VARCHAR(255)') AS client_app_name,
event_data.value('(event/action[@name="client_hostname"]/value)[1]', 'VARCHAR(255)') AS client_hostname,
event_data.value('(event/action[@name="database_name"]/value)[1]', 'VARCHAR(255)') AS database_name,
event_data.value('(event/action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS sql_text
FROM
sys.fn_xe_file_target_read_file('E:\DBExtentEvent\slowquerylog*.xel', NULL, NULL, NULL) AS t
CROSS APPLY
t.event_data.nodes('event') AS XEvent(event_data);
2.使用 Python 读取 XEL 文件内容import pyodbc
import pandas as pd
# 设置数据库连接
conn = pyodbc.connect(
'DRIVER={SQL Server};'
'SERVER=your_server_name;'
'DATABASE=your_database_name;'
'UID=your_username;'
'PWD=your_password'
)
# 查询 XEL 文件内容
query = """
SELECT
event_data.value('(event/@name)[1]', 'VARCHAR(50)') AS event_name,
event_data.value('(event/@timestamp)[1]', 'DATETIME2') AS event_timestamp,
event_data.value('(event/data[@name="duration"]/value)[1]', 'INT') AS duration,
event_data.value('(event/action[@name="client_app_name"]/value)[1]', 'VARCHAR(255)') AS client_app_name,
event_data.value('(event/action[@name="client_hostname"]/value)[1]', 'VARCHAR(255)') AS client_hostname,
event_data.value('(event/action[@name="database_name"]/value)[1]', 'VARCHAR(255)') AS database_name,
event_data.value('(event/action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS sql_text
FROM
sys.fn_xe_file_target_read_file('E:\DBExtentEvent\slowquerylog*.xel', NULL, NULL, NULL) AS t
CROSS APPLY
t.event_data.nodes('event') AS XEvent(event_data);
"""
# 使用 pandas 读取数据
df = pd.read_sql(query, conn)
# 关闭数据库连接
conn.close()
# 显示数据
print(df)
# 将数据保存为 CSV 文件
df.to_csv('slowquerylog.csv', index=False)
这里的一个问题是,你不能直接读取XEL文件,本身XEL文件是一个二进制文件,必须挂接到在线SQL Server实例(任何SQL Server实例都可以,不一定是生产库的那一台SQL Server实例)。另外一个方法是使用 PowerShell 中的 Microsoft.SqlServer.XEvent.Linq.QueryableXEventData 类直接解析 XEL 文件,不用挂接到SQL Server实例。读取 XEL 文件的内容,然后导出CSV文件,让其他编程语言读取。# 加载所需的程序集
Add-Type -Path "C:\Program Files\Microsoft SQL Server\140\SDK\Assemblies\Microsoft.SqlServer.XEvent.Linq.dll"
# 定义XEL文件路径
$xelFilePath = "E:\DBExtentEvent\slowquerylog*.xel"
# 创建XEventData对象
$events = New-Object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData($xelFilePath)
# 初始化一个空数组来存储事件数据
$eventDataList = @()
# 遍历每个事件并提取所需的字段
foreach ($event in $events) {
$eventData = New-Object PSObject -Property @{
EventName = $event.Name
Timestamp = $event.Timestamp
Duration = $event.Fields["duration"].Value
ClientAppName = $event.Actions["client_app_name"].Value
ClientHostname = $event.Actions["client_hostname"].Value
DatabaseName = $event.Actions["database_name"].Value
SqlText = $event.Actions["sql_text"].Value
}
$eventDataList += $eventData
}
# 堆代码 duidaima.com
# 将事件数据导出为CSV文件
$eventDataList | Export-Csv -Path "E:\DBExtentEvent\slowquerylog.csv" -NoTypeInformation
Step 2: Python 脚本 ReadCSVFile.py读取导出的 CSV 文件import pandas as pd # 定义CSV文件路径 csv_file_path = "E:\\DBExtentEvent\\slowquerylog.csv" # 使用pandas读取CSV文件 df = pd.read_csv(csv_file_path) # 显示数据 print(df)这个方法需要使用powershell,对于powershell不熟悉的朋友也是一个问题。