--窗口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.不要使用模版
5.事件库搜索block,选择blocked_process_report
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" -NoTypeInformationStep 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不熟悉的朋友也是一个问题。