KB978629 - ИСПРАВЛЕНО: сообщение об ошибке при использовании сеанса расширенного события system_health для захвата графа взаимоблокировок в SQL Server 2008: "MSG 9436: синтаксический анализ XML: строка 54, символ 12, закрывающий тег не совпадает с начальным тегом"

Применяется к
SQL Server 2008 R2 Standard SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Developer SQL Server 2008 R2 Workgroup SQL Server 2008 Standard SQL Server 2008 Enterprise SQL Server 2008 Developer SQL Server 2008 Workgroup

Корпорация Майкрософт распространяет исправления Microsoft SQL Server 2008 в виде одного загружаемого файла. Поскольку исправления являются накопительными, каждый новый выпуск содержит все исправления и исправления для системы безопасности, которые были включены в предыдущий выпуск исправления SQL Server 2008.

Проблема

Рассмотрим следующий сценарий. Возникает взаимоблокировка в базе данных Microsoft SQL Server 2008. Затем с помощью сеанса расширенного события system_health можно зафиксировать граф взаимоблокировок. В этом случае появляется следующее сообщение об ошибке:

Примечание

MSG 9436, уровень 16, состояние 1, строка 1

Анализ XML: строка 54, символ 12, закрывающий тег не совпадает с начальным тегом

Например, вы выполните следующий запрос для экспорта целевого объекта buffer_ring из сеанса system_health при возникновении взаимоблокировки:

select XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') as DeadlockGraph
FROM
(select CAST(target_data as xml) as TargetData
from sys.dm_xe_session_targets st
join sys.dm_xe_sessions s on s.address = st.event_session_address
where name = 'system_health') AS Data
CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)
where XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report'

В этом примере запрос возвращает правильный результат.

Однако вы также можете выполнить следующий запрос, чтобы перевести этот граф взаимоблокировок в формат XML:

select cast(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') as xml) as DeadlockGraph
FROM
(select CAST(target_data as xml) as TargetData
from sys.dm_xe_session_targets st
join sys.dm_xe_sessions s on s.address = st.event_session_address
where name = 'system_health') AS Data
CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)
where XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report'

В этой ситуации вы ожидаете увидеть граф взаимоблокировки в формате XML. Даже если граф взаимоблокировок отображается неправильно, вы все равно ожидаете увидеть допустимое содержимое XML из отчета xml_deadlock_report. Однако появляется следующее сообщение об ошибке:

Примечание

MSG 9436, уровень 16, состояние 1, строка 1
Анализ XML: строка 54, символ 12, закрывающий тег не совпадает с начальным тегом

Причина

Эта проблема возникает из-за того, что путь кода, который генерирует XML-схему для графа взаимоблокировок, пропускает закрывающий тег элемента списка жертв. Кроме того, путь к коду добавляет ненужный тег для элемента взаимоблокировки.

Решение

Исправление для этой проблемы было впервые выпущено в накопительном пакете обновления 6 для SQL Server 2008 с пакетом обновления 1. Дополнительные сведения об этом накопительном пакете обновления см. в следующей статье базы знаний Майкрософт:

977443 Накопительный пакет обновления 6 для SQL Server 2008 с пакетом обновления 1 Примечание Поскольку сборки являются накопительными, каждый новый выпуск исправления содержит все исправления и исправления для системы безопасности, которые входили в предыдущий выпуск исправления SQL Server 2008 г. Рекомендуется рассмотреть возможность применения последнего выпуска исправления, содержащего это исправление. Для просмотра статьи в базе знаний Майкрософт щелкните следующий номер статьи:

970365 Сборки SQL Server 2008 г., выпущенные после выпуска SQL Server 2008 с пакетом обновления 1 (SP1)
Исправления для Microsoft SQL Server 2008 предназначены для определенных пакетов обновления для SQL Server. Необходимо установить исправление для SQL Server 2008 с пакетом обновления 1 (SP1) для установки SQL Server 2008 с пакетом обновления 1. По умолчанию все исправления, предоставляемые в пакете обновления для SQL Server, входят в следующий пакет обновления для SQL Server.

SQL Server 2008 R2

Важно! Это исправление необходимо установить, если вы используете SQL Server 2008 R2.

Исправление для этой проблемы впервые выпущено в накопительном пакете обновления 1. Для получения дополнительной информации о том, как получить этот накопительный пакет обновления для SQL Server 2008 R2, откройте статью со следующим номером в базе знаний Майкрософт:

Накопительный пакет обновления 1 981355 для SQL Server 2008 R2Note Поскольку сборки являются накопительными, каждый новый выпуск исправления содержит все исправления и исправления для системы безопасности, которые были включены в предыдущий выпуск исправления SQL Server 2008 R2. Рекомендуется рассмотреть возможность применения последнего выпуска исправления, содержащего это исправление. Для просмотра статьи в базе знаний Майкрософт щелкните следующий номер статьи:

981356 Сборки SQL Server 2008 R2, выпущенные после выпуска SQL Server 2008 R2

Состояние

Корпорация Майкрософт подтвердила, что это проблема продуктов Microsoft, перечисленных в разделе «Относится к».

Ссылки

Для получения сведений о модели добавочного обслуживания для SQL Server щелкните номер статьи со следующим номером в базе знаний Майкрософт:

935897 Команда SQL Server предоставляет модель добавочного обслуживания для предоставления исправлений для обнаруженных проблем

Дополнительные сведения о схеме именования для обновлений SQL Server см. в следующей статье базы знаний Майкрософт:

822499 Новая схема именования пакетов обновления программного обеспечения Microsoft SQL Server
Дополнительные сведения о терминологии обновления программного обеспечения см. в следующей статье базы знаний Майкрософт:

824684 Стандартные термины, используемые при описании обновлений программного обеспечения Майкрософт