В настоящее время мне интересно, может ли кто-нибудь пролить свет на проблему, с которой я сталкиваюсь.
В настоящее время я пытаюсь использовать этот учебник, чтобы найти заблокированные процессы и взаимоблокировки.
https://www.brentozar.com/archive/2014/03/extended-events-doesnt-hard/#comment-3481472
Я выполнил шаги, как написано в учебнике, поэтому не уверен, что я сделал неправильно.
После сбора событий я запускаю этот запрос:
С events_cte КАК (
ВЫБРАТЬ
xevents.event_data,
DATEADD(ми,
DATEDIFF(ми, GETUTCDATE(), CURRENT_TIMESTAMP),
xevents.event_data.value(
'(event/@timestamp)[1]', 'datetime2')) AS [время события] ,
xevents.event_data.value(
'(событие/действие[@name="client_app_name"]/значение)[1]', 'nvarchar(128)')
AS [имя клиентского приложения],
xevents.event_data.value(
'(событие/действие[@name="client_hostname"]/значение)[1]', 'nvarchar(max)')
AS [имя хоста клиента],
xevents.event_data.value(
'(событие[@name="blocked_process_report"]/данные[@name="database_name"]/значение)[1]', 'nvarchar(max)')
AS [имя базы данных],
xevents.event_data.value(
'(событие[@name="blocked_process_report"]/данные[@name="database_id"]/значение)[1]', 'int')
AS [идентификатор_базы_данных],
xevents.event_data.value(
'(событие[@name="blocked_process_report"]/данные[@name="object_id"]/значение)[1]', 'int')
КАК [идентификатор_объекта],
xevents.event_data.value(
'(событие[@name="blocked_process_report"]/данные[@name="index_id"]/значение)[1]', 'int')
AS [идентификатор_индекса],
xevents.event_data.value(
'(событие[@name="blocked_process_report"]/данные[@name="длительность"]/значение)[1]', 'bigint') / 1000
AS [длительность (мс)],
xevents.event_data.value(
'(событие[@name="blocked_process_report"]/данные[@name="lock_mode"]/текст)[1]', 'varchar')
AS [режим_блокировки],
xevents.event_data.value(
'(событие[@name="blocked_process_report"]/данные[@name="login_sid"]/значение)[1]', 'int')
AS [логин_сид],
xevents.event_data.query(
'(событие[@name="отчет_о_заблокированном_процессе"]/данные[@name="отчет_о_заблокированном_процессе"]/значение/отчет о заблокированном_процессе)[1]')
КАК блокируемый_процесс_отчет,
xevents.event_data.query(
'(событие/данные[@name="xml_report"]/значение/тупик)[1]')
AS deadlock_graph
ИЗ sys.fn_xe_file_target_read_file
('C:\temp\XEventSessions\blocked_process*.xel',
'C:\temp\XEventSessions\blocked_process*.xem',
ноль ноль)
ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ (ВЫБРАТЬ CAST(event_data AS XML) AS event_data) как xevents
)
ВЫБРАТЬ
СЛУЧАЙ, КОГДА block_process_report.value('(blocked-process-report[@monitorLoop])[1]', 'nvarchar(max)') IS NULL
ТОГДА «Тупик»
ИНАЧЕ 'Заблокированный процесс'
КОНЕЦ КАК Тип отчета,
[время события],
CASE [имя клиентского приложения] WHEN '' THEN ' -- Н/Д -- '
ELSE [имя клиентского приложения]
ЗАВЕРШИТЬ КАК [имя клиентского приложения _],
CASE [имя хоста клиента] WHEN '' THEN ' -- N/A -- '
ELSE [имя хоста клиента]
END AS [имя хоста клиента],
[имя базы данных],
COALESCE(OBJECT_SCHEMA_NAME(object_id, database_id), ' -- N/A -- ') AS [схема],
COALESCE(OBJECT_NAME(object_id, database_id), ' -- N/A -- ') AS [table],
индекс_идентификатор,
[длительность (мс)],
режим блокировки,
COALESCE(SUSER_NAME(login_sid), ' -- N/A -- ') КАК имя пользователя,
СЛУЧАЙ, КОГДА block_process_report.value('(blocked-process-report[@monitorLoop])[1]', 'nvarchar(max)') IS NULL
ТОГДА deadlock_graph
ИНАЧЕ блокируемый_процесс_отчет
КОНЕЦ КАК Отчет
ОТ events_cte
ORDER BY [время события] DESC ;
Но я получаю такой результат:
Сообщение 9415, уровень 16, состояние 1, строка 1
Разбор XML: строка 39, символ 109, правильность проверки: отсутствие '<' в значении атрибута
Любые идеи?