Symptom
När du använder databas spegling i Microsoft SQL Server 2012 eller Microsoft SQL Server 2014 kan du trycka på ett villkor för att avaktiveras.
Orsak
Problemet beror på att SQL Server får ett X-lås på den nya sidan när du tilldelar en ny sida. SQL Server placerar det hobt_id (heap eller B-träd-ID) som den nya sidan tillhör i låset. Men det går inte att använda hobt_id i spegel loggen i SQL Server och det ger olika lås beteenden mellan primär och spegel. Det kan förklaras i detalj enligt följande:
-
T1 håll a a IX lås på sidan P1.
-
T2 gör en sid delning på P1, tilldela en ny sida P2, en system transaktion TX används här, den har ett X lock på P2. I den här SQL-servern lades inte hobt_id i speglings loggen.
-
TX gör en Lås migrering för T1 för att flytta IX låset från P1 till P2.
-
TX-bekräftat, T2 kan nu använda sid P2 och T2 få en annan IX lås på sidan P2.
-
T1 commit, nu T2 är det enda som innehåller ett IX lås på P2.
-
När det är många att infoga, en låsnings spärr, på den primära, T2 släpper IX på P2, men på spegeln, under låsnings eskaleringen, släppte inte IX låset.
-
När du har tagit bort är sid P2 tomma och har blivit tilldelad.
-
T3 behöver en ny sida och det sker för att tilldela P2, detta kräver ett X-lås, men på spegeln misslyckades det här steget på grund av steg 6.
På spegel sidan släpps inte 9-låset på grund av att hobt_id i låset är fel. Denna felaktiga hobt_id kommer under steg 2 och på grund av att SQL Server inte placerar hobt_id i speglings loggen. vanligt vis ser du inte något problem eftersom TX i steg 2 är väldigt kort och låsnings blocket med felaktig hobt_id släpps när det överförs. Men på grund av lås migrering i steg 3 och följande steg (4 och 5), bevaras det här låset med fel hobt_id bevaras och du får ett problem. Det finns inget sådant problem med primärt eftersom det använder rätt hobt_id i steg 2. Men logg posten har inte rätt hobt_id.
Lösning
Problemet är först åtgärdat i den kumulativa uppdateringen av SQL Server.
Kumulativ uppdatering 1 för SQL Server 2014 /en-us/help/2931693
Kumulativ uppdatering 9 för SQL Server 2012 SP1 /en-us/help/2931078
Varje ny kumulativ uppdatering för SQL Server innehåller alla snabb korrigeringar och alla säkerhets korrigeringar som ingick i den föregående kumulativa uppdateringen. Kolla in de senaste kumulativa uppdateringarna för SQL Server:
Lösning
Lös problemet genom att initiera om spegeln för att avsluta uppskjuten status.
Status
Microsoft har bekräftat att det här är ett problem i Microsoft-produkterna som nämns i "gäller".