SQLServer死锁监测方案:如何使用XE.Core解析xel文件里包含死锁扩展事件的死锁xml
1.处理流程
对于SQLServer死锁监测的方式,最终选用的方案是自定义的死锁扩展事件在生成本地xel文件,直接对xel文件解析。SQLServer自带两个dll可用于解析xel文件,编程语言选用C#,死锁扩展事件的名为 xml_deadlock_report。解析时需考虑版本问题,SQLServer2008版本需要xel,xem文件。
两个DLL: Microsoft.SqlServer.XE.Core.dll, Microsoft.SqlServer.XEvent.Linq.dll
- 抛弃SQLServer自带的system_health,完全自定义新的死锁扩展事件,system_health包含扩展事件太多,解析耗费时间长,且文件很大。
- 抛弃使用sys.fn_xe_file_target_read_file查询死锁xml的方式,当有xel文件,却仍旧依赖数据库查询获取xml不值得,希望与数据库查询隔离。
2.两种SQLServer版本代码解析示例
2008版本的处理代码,需要xel和xem文件一起解析,xem也是需要指定生成的
try{using (QueryableXEventData events = new QueryableXEventData(new string[]{ @"D:\xxxx_0_134010006262980000.xel"},new string[]{ @"D:\xxxx_0_134010006262980000.xem"})){int count = 0 ;foreach (PublishedEvent evt in events){if (evt.Name == "xml_deadlock_report"){string timeStamp = evt.Timestamp.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss");string deadlockXml = evt.Fields["xml_report"].Value.ToString();}}}}catch (Exception ex){}
2008版本以上的,直接解析xel
try{using (QueryableXEventData events = new QueryableXEventData(@"D:\xxxx_0_134010006262980000.xel")){int count = 0 ;foreach (PublishedEvent evt in events){if (evt.Name == "xml_deadlock_report"){string timeStamp = evt.Timestamp.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss");string deadlockXml = evt.Fields["xml_report"].Value.ToString();}}}}catch (Exception ex){}