Ознаки
Коли використовується дзеркальне відображення бази даних у Microsoft SQL ServerSQL Server 2012 або Microsoft SQL ServerSQL Server 2014, може виникнути умова твердження, і дзеркальне відображення бази даних перейде до стану призупинення.
Причина
Ця проблема виникає тому, що під час виділення нової сторінки SQL ServerSQL Server отримує блокування X на новій сторінці. SQL Server поставить hobt_id (Heap або B-Tree ID), до якого належить нова сторінка, у запит блокування. Однак SQL Server не може помістити hobt_id у журнал віддзеркалення, що призводить до різної поведінки блокування між основним і дзеркальним відображенням.
Докладно це можна пояснити наступним чином:
- Т1 тримайте замок IX на сторінці Р1.
- Т2 робимо розбиття сторінки на Р1, виділяємо нову сторінку Р2, тут використовується системна транзакція TX, вона тримає X lock на Р2. Тут SQL Server не ставив hobt_id в журнал дзеркального відображення.
- TX виконує перенесення замка для T1, щоб перемістити блокування IX з P1 до P2.
- TX затверджено, тепер T2 може використовувати сторінку P2, а T2 отримує ще одне блокування IX на сторінці P2.
- Т1 скоєно, тепер Т2 єдиний, хто тримає замок IX на Р2.
- Після великої кількості вставок відбувається ескалація замка, на первинній Т2 відпускає IX на Р2, але на дзеркалі під час ескалації блокування Т2 не відпускає замок IX.
- Після багатьох видалень, сторінка P2 стала порожньою і була виділена.
- Т3 потрібна нова сторінка, і вона виділяє P2, для цього потрібен X lock, але на дзеркалі цей крок не вдався через крок 6.
На дзеркалі Крок 6 не відпускає фіксатор IX, оскільки hobt_id у блоці замка неправильне. Цей неправильний hobt_id з'являється на кроці 2 і через SQL Server не поміщає hobt_id в журнал віддзеркалення.
Зазвичай ви не бачите жодних проблем, тому що передавання на кроці 2 дуже коротке, і блокування блокування з неправильним hobt_id буде розблоковано після його фіксації. Однак через перенесення блокування на кроці 3 та наступних кроках (4 і 5) цей блок блокування з неправильним hobt_id зберігається та зрештою призводить до проблеми.
Цієї проблеми немає на основній основі, тому що на кроці 2 використовується правильний hobt_id. Але запис журналу не має правильних hobt_id.
Спосіб усунення проблеми
Вперше виправлено цю проблему в наступному сукупному оновленні SQL ServerSQL Server.
Сукупний пакет оновлень 1 за SQL Server 2014 р. /uk-ua/help/2931693
Сукупний пакет оновлень 9 для SQL Server 2012 р. (SP1) /en-us/help/2931078
Відомості про сукупні оновлення для SQL ServerSQL Server
Кожне нове сукупне оновлення для SQL Server містить усі виправлення та виправлення системи безпеки, які входили до попереднього сукупного пакета оновлень. Перегляньте останні сукупні оновлення для SQL Server.
- Останнє сукупне оновлення для SQL ServerSQL Server 2014
- Останнє сукупне оновлення для SQL Server 2012 із пакетом оновлень 1 (SP1)
Спосіб вирішення
Щоб вирішити цю проблему, повторно ініціалізуйте дзеркало, щоб завершити стан призупинення.
Стан
Корпорація Microsoft підтвердила, що це одна з проблем з продуктами Microsoft, перелічених у розділі "Застосовується до".