Ознаки
Якщо ви використовуєте дзеркальне відображення бази даних у Microsoft SQL Server 2012 або Microsoft SQL Server 2014, ви можете вразити умову, що відповідають умовам, і віддзеркалення бази даних, що входить до стану призупинено.
Причина
Ця проблема виникає через те, що під час виділення нової сторінки SQL Server отримує код X на новій сторінці. На сервері SQL Server буде поставлено hobt_id ("купа або B-Tree ID"), до якої нова сторінка належить до запиту на блокування. Але SQL Server не може поставити hobt_id в журналі віддзеркалення, а результати в різних режимах блокування між основним і дзеркалом. Цю інформацію можна докладно пояснити таким чином:
-
На сторінці P1 Тримайте IX Lock.
-
T2. виконайте розділення сторінки на P1, виділіть нову сторінку P2, а системна транзакція TX використовується тут, вона містить блокування X у P2. Тут SQL Server не ставив hobt_id в журналі віддзеркалення.
-
TX робить блокування перенесення для T1 для переміщення IX Lock з P1 до P2.
-
TX скоєно, тепер T2 може використовувати сторінку P2 і T2 отримати інший IX Lock на сторінці P2.
-
T1 скоєно, тепер T2 – це єдиний, хто проводить IX Lock у P2.
-
Після того, як ви вставляєте один із цих версій, після цього в головному, T2, що випускає x у P2, але на дзеркалі, під час блокування ескалація, T2 не випустили IX Lock.
-
Після багатьох видалення сторінка P2 стала порожньою та девиділена.
-
T3 потрібна нова сторінка, і це відбувається для виділення P2, для цього потрібно, щоб X LOCK, але на дзеркалі цей крок не вдалася через крок 6.
На дзеркалі крок 6 не Вивільніть IX LOCK, оскільки hobt_id в блоці блокування неправильний. Ця неправильна hobt_id виникає під час кроку 2, а через SQL Server не вдається поставити hobt_id в журналі віддзеркалення. зазвичай немає жодних проблем, тому що TX на кроці 2 дуже коротка, а блок блокування з неправильним hobt_id буде випущено, коли вона виконує. Однак через блокування перенесення в step3 і наступних кроків (4 та 5) цей блок блокує неправильний hobt_id і, нарешті, спричиняє проблему. У основному немає цієї проблеми, оскільки він використовує правильне hobt_id на кроці 2. Але запис журналу не має правильного hobt_id.
Спосіб вирішення
Ця проблема була спочатку зафіксоване в цьому сукупному оновленні сервера SQL Server.
Сукупне оновлення 1 для SQL Server 2014 /en-us/help/2931693
Сукупне оновлення 9 для SQL Server 2012 SP1 /en-us/help/2931078
Кожне нове Сукупне оновлення для SQL Server містить усі поточні виправлення та всі виправлення системи безпеки, які були включені до попереднього сукупного оновлення. Ознайомтеся з найновішими сукупними оновленнями для сервера SQL Server:
Інші способи вирішення
Щоб вирішити цю проблему, повторно Ініціалізуйте дзеркало, щоб завершити стан призупиненого стану.
Стан
Корпорація Майкрософт підтвердила, що це проблема в продуктах Microsoft, перелічених у розділі "застосовується до".