Проблемы
При использовании зеркального отображения базы данных в Microsoft SQL Server 2012 или Microsoft SQL Server 2014 может быть достигнуто условие утверждения и зеркальное отображение базы данных переходит в состояние SUSPENDED.
Причина
Эта проблема возникает из-за того, что при распределении новой страницы SQL Server получает на новой странице блокировку X. SQL Server поместит hobt_id (идентификатор кучи или B-Tree), к которому Новая страница будет находиться в запросе на блокировку. Тем не менее, SQL Server не может поместить hobt_id в журнал зеркального отображения и приводит к разным режимам блокировки между основной и зеркальной. Подробнее об этом можно получить, как описано ниже.
-
T1 удерживает блокировку IX на странице P1.
-
T2 выполнение разбиения страницы на транзакции P1, выделение новой страницы P2, используется системная транзакция TX, которая удерживает блокировку X в P2. Здесь SQL Server не поместил hobt_id в журнал зеркального отображения.
-
TX блокирует миграцию для T1 для перемещения блокировки IX с P1 на P2.
-
TX зафиксирован, после T2 можно использовать страницу P2, а T2 получить другую блокировку IX на странице P2.
-
Выделено T1, то T2 — это единственный пользователь, который удерживает блокировку IX для P2.
-
После большого количества вставленных данных произойдет эскалация блокировки, на основном этапе T2 освобождается IX для P2, но на зеркале во время укрупнения блокировок T2 не освободило блокировку IX.
-
После большого количества удалений страница P2 становится пустой и размещается.
-
Для T3 требуется новая страница, поэтому для выделения P2 требуется блокировка X, но на зеркальной копии этот шаг не удался, так как на этапе 6.
На зеркальном сервере шаг 6 не освобождает блокировку IX, так как hobt_id в блоке блокировки является неправильным. Это неправильное hobt_id поступает на этапе 2, так как SQL Server не помещает hobt_id в журнал зеркального отображения. Обычно проблема не возникает из-за того, что передача на этапе 2 очень коротка, а блок блокировки с неправильным hobt_id будет освобожден при фиксации. Однако из-за миграции блокировок в step3 и описанных ниже действий (4 и 5) этот блок блокировки с неверным hobt_id сохраняется и, наконец, вызывает проблему. У основного компьютера нет этой ошибки, так как в действии 2 используется правильный hobt_id. Но запись журнала не имеет правильной hobt_id.
Решение
Эта проблема впервые устранена в следующем накопительном обновлении SQL Server.
Накопительное обновление 1 для SQL Server 2014 /en-us/help/2931693
Накопительное обновление 9 для SQL Server 2012 с пакетом обновления 1 (SP1) /en-us/help/2931078
Все новые накопительные обновления для SQL Server содержат все исправления и все исправления для системы безопасности, которые были включены в предыдущий накопительный пакет обновления. Ознакомьтесь с самыми последними накопительными обновлениями для SQL Server.
Обходное решение
Чтобы обойти эту ошибку, повторно инициализируйте зеркало, чтобы завершить состояние SUSPENDED.
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".