Симптоми
Когато използвате дублиране на бази данни в Microsoft SQL Server 2012 или Microsoft SQL Server 2014, е възможно да сте ударили условието за твърдение и огледалото на базата данни да влезе в временно прекратено състояние.
Причина
Проблемът възниква, защото при разпределяне на нова страница SQL Server получава X Lock на новата страница. SQL Server ще сложи hobt_id (ИД на куп или B-Tree), към който принадлежи новата страница, в заявката за заключване. SQL Server обаче не може да изложи hobt_id в регистрационен файл за огледално и води до различно поведение на заключване между основния и огледалния. Това може да се обясни подробно по следния начин:
-
T1 задръжте IX Lock на страница P1.
-
T2 Направете страницата разделена на P1, Разпределете нова страница P2, за да се използва системна транзакция TX тук, той има X Lock на P2. Тук SQL Server не е сложил hobt_id в регистрационен файл за огледално копие.
-
TX извършва заключване на мигрирането за T1, за да мести IX Lock от P1 към P2.
-
TX ангажиран, сега T2 може да използва Page P2 и t2 Получете друг IX Lock на страница P2.
-
T1 е извършено, сега T2 е единственият човек, който държи IX Lock на P2.
-
След много вмъквания се появява заключване, в основния бутон T2 пуска IX на P2, но върху огледалото, при ескалация на ключалката, T2 не освободи IX Lock.
-
След много изтривания страницата P2 става празна и е отчасти.
-
Т3 се нуждае от нова страница и това се случва, за да разпредели P2, това изисква X Lock, но в огледалото тази стъпка е неуспешна, защото е стъпка 6.
В огледалото стъпка 6 не освобождава IX Lock, тъй като hobt_id в блока за заключване е неправилен. Тази неправилна hobt_id е по време на стъпка 2 и поради това, че SQL Server не поставя hobt_id в регистрационен файл за дублиране. обикновено не виждате никакъв проблем, защото TX в стъпка 2 е много къс и заключването с неправилна hobt_id ще бъде издадено при извършване на това. Но поради заключени миграции в стъпка3 и следващите стъпки (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 потвърди, че това е проблем в продуктите на Microsoft, които са посочени в секцията "важи за".