ExtractXEData.sql 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. -- Extract the data from the AlwaysOn extended event trace and store the extracted data in a tempdb table
  2. -- This tempdb table would be used by the PowerBI Desktop report to pull data
  3. USE TEMPDB
  4. GO
  5. IF OBJECT_ID('DMReplicaEvents') IS NOT NULL
  6. BEGIN
  7. DROP TABLE DMReplicaEvents;
  8. END
  9. GO
  10. SET NOCOUNT ON
  11. SELECT
  12. @@SERVERNAME as server_name,
  13. event_name,
  14. xe.event_data.value('(/event/data[@name="log_block_id"]/value)[1]','bigint') AS log_block_id,
  15. xe.event_data.value('(/event/data[@name="database_id"]/value)[1]','int') AS database_id,
  16. CASE event_name
  17. WHEN 'hadr_db_commit_mgr_harden' THEN xe.event_data.value('(/event/data[@name="time_to_commit"]/value)[1]','bigint')
  18. WHEN 'hadr_apply_log_block' THEN xe.event_data.value('(/event/data[@name="total_processing_time"]/value)[1]','bigint')
  19. WHEN 'hadr_log_block_send_complete' THEN xe.event_data.value('(/event/data[@name="total_processing_time"]/value)[1]','bigint')
  20. WHEN 'hadr_lsn_send_complete' THEN xe.event_data.value('(/event/data[@name="total_processing_time"]/value)[1]','bigint')
  21. ELSE xe.event_data.value('(/event/data[@name="processing_time"]/value)[1]','bigint')
  22. END AS processing_time,
  23. xe.event_data.value('(/event/data[@name="start_timestamp"]/value)[1]','bigint') AS start_timestamp,
  24. xe.event_data.value('(/event/@timestamp)[1]','DATETIMEOFFSET') AS publish_timestamp,
  25. CASE event_name
  26. WHEN 'hadr_log_block_compression' THEN xe.event_data.value('(/event/data[@name="uncompressed_size"]/value)[1]','int')
  27. WHEN 'hadr_log_block_decompression' THEN xe.event_data.value('(/event/data[@name="uncompressed_size"]/value)[1]','int')
  28. WHEN 'hadr_capture_log_block' THEN xe.event_data.value('(/event/data[@name="log_block_size"]/value)[1]','int')
  29. ELSE NULL
  30. END AS log_block_size,
  31. CASE event_name
  32. WHEN 'hadr_db_commit_mgr_harden' THEN xe.event_data.value('(/event/data[@name="replica_id"]/value)[1]','uniqueidentifier')
  33. WHEN 'hadr_log_block_compression' THEN xe.event_data.value('(/event/data[@name="availability_replica_id"]/value)[1]','uniqueidentifier')
  34. WHEN 'hadr_log_block_decompression' THEN xe.event_data.value('(/event/data[@name="availability_replica_id"]/value)[1]','uniqueidentifier')
  35. WHEN 'hadr_capture_log_block' THEN xe.event_data.value('(/event/data[@name="availability_replica_id"]/value)[1]','uniqueidentifier')
  36. WHEN 'hadr_capture_filestream_wait' THEN xe.event_data.value('(/event/data[@name="availability_replica_id"]/value)[1]','uniqueidentifier')
  37. WHEN 'hadr_receive_harden_lsn_message' THEN xe.event_data.value('(/event/data[@name="target_availability_replica_id"]/value)[1]','uniqueidentifier')
  38. WHEN 'hadr_transport_receive_log_block_message' THEN xe.event_data.value('(/event/data[@name="target_availability_replica_id"]/value)[1]','uniqueidentifier')
  39. WHEN 'hadr_capture_vlfheader' THEN xe.event_data.value('(/event/data[@name="availability_replica_id"]/value)[1]','uniqueidentifier')
  40. WHEN 'hadr_send_harden_lsn_message' THEN xe.event_data.value('(/event/data[@name="availability_replica_id"]/value)[1]','uniqueidentifier')
  41. ELSE NULL
  42. END AS target_availability_replica_id,
  43. CASE event_name
  44. WHEN 'hadr_receive_harden_lsn_message' THEN xe.event_data.value('(/event/data[@name="local_availability_replica_id"]/value)[1]','uniqueidentifier')
  45. WHEN 'hadr_transport_receive_log_block_message' THEN xe.event_data.value('(/event/data[@name="local_availability_replica_id"]/value)[1]','uniqueidentifier')
  46. ELSE drs.replica_id
  47. END AS local_availability_replica_id,
  48. CASE event_name
  49. WHEN 'hadr_db_commit_mgr_harden' THEN xe.event_data.value('(/event/data[@name="ag_database_id"]/value)[1]','uniqueidentifier')
  50. WHEN 'log_flush_start' THEN drs.group_database_id
  51. WHEN 'log_flush_complete' THEN drs.group_database_id
  52. WHEN 'log_block_pushed_to_logpool' THEN drs.group_database_id
  53. WHEN 'hadr_log_block_group_commit' THEN drs.group_database_id
  54. WHEN 'hadr_log_block_compression' THEN drs.group_database_id
  55. WHEN 'hadr_log_block_decompression' THEN drs.group_database_id
  56. WHEN 'recovery_unit_harden_log_timestamps' THEN drs.group_database_id
  57. WHEN 'hadr_capture_log_block' THEN xe.event_data.value('(/event/data[@name="database_replica_id"]/value)[1]','uniqueidentifier')
  58. WHEN 'hadr_capture_filestream_wait' THEN xe.event_data.value('(/event/data[@name="database_replica_id"]/value)[1]','uniqueidentifier')
  59. WHEN 'hadr_receive_harden_lsn_message' THEN xe.event_data.value('(/event/data[@name="database_replica_id"]/value)[1]','uniqueidentifier')
  60. WHEN 'hadr_capture_vlfheader' THEN xe.event_data.value('(/event/data[@name="database_replica_id"]/value)[1]','uniqueidentifier')
  61. WHEN 'hadr_apply_log_block' THEN xe.event_data.value('(/event/data[@name="database_replica_id"]/value)[1]','uniqueidentifier')
  62. WHEN 'hadr_send_harden_lsn_message' THEN xe.event_data.value('(/event/data[@name="hadr_database_id"]/value)[1]','uniqueidentifier')
  63. WHEN 'hadr_transport_receive_log_block_message' THEN xe.event_data.value('(/event/data[@name="database_replica_id"]/value)[1]','uniqueidentifier')
  64. ELSE NULL
  65. END AS database_replica_id,
  66. xe.event_data.value('(/event/data[@name="mode"]/value)[1]','bigint') AS mode
  67. INTO DMReplicaEvents
  68. FROM
  69. (
  70. SELECT
  71. object_name as event_name,
  72. CONVERT(XML,Event_data) AS event_data
  73. FROM sys.fn_xe_file_target_read_file(
  74. 'C:\Program Files\Microsoft SQL Server\MSSQL11.TigerAG1\MSSQL\Log\AlwaysOn_Data_Movement_Tracing*.xel',
  75. null, null, null) as xe
  76. where object_name in ('hadr_log_block_group_commit',
  77. 'log_block_pushed_to_logpool',
  78. 'log_flush_start',
  79. 'log_flush_complete',
  80. 'hadr_log_block_compression',
  81. 'hadr_capture_log_block',
  82. 'hadr_capture_filestream_wait',
  83. 'hadr_log_block_send_complete',
  84. 'hadr_receive_harden_lsn_message',
  85. 'hadr_db_commit_mgr_harden',
  86. 'recovery_unit_harden_log_timestamps',
  87. 'hadr_capture_vlfheader',
  88. 'hadr_log_block_decompression',
  89. 'hadr_apply_log_block',
  90. 'hadr_send_harden_lsn_message',
  91. 'hadr_log_block_decompression',
  92. 'hadr_lsn_send_complete',
  93. 'hadr_transport_receive_log_block_message')
  94. ) xe
  95. LEFT OUTER JOIN sys.dm_hadr_database_replica_states drs
  96. ON drs.database_id = xe.event_data.value('(/event/data[@name="database_id"]/value)[1]','int') AND is_local = 1
  97. -- Extract and store the replica information in tempdb as this is needed for providing the names of the databases and the replica instance in the visualizations
  98. USE TEMPDB
  99. GO
  100. IF OBJECT_ID('DMReplicaDBs') IS NOT NULL
  101. BEGIN
  102. DROP TABLE DMReplicaDBs;
  103. END
  104. GO
  105. SELECT d.database_id, drs.group_database_id,d.name
  106. INTO DMReplicaDBs
  107. FROM sys.databases d
  108. inner join sys.dm_hadr_database_replica_states drs
  109. on drs.database_id = d.database_id
  110. WHERE is_local = 1