Příznaky
Pokud používáte zrcadlení databáze v Microsoft SQL serveru 2012 nebo Microsoft SQL serveru 2014, může dojít k zavolání podmínky Assert a zrcadlení databáze do stavu pozastaveno.
Příčina
K tomuto problému dochází, protože při přidělení nové stránky obdrží SQL Server na nové stránce zámek X. SQL Server vloží hobt_id (halda nebo B-stromové ID), do kterého nová stránka patří do žádosti o zámek. SQL Server ale nemůže hobt_id do protokolu zrcadlení a výsledky se můžou lišit mezi primárním a zrcadlovým chováním. Popis se dá podrobně vysvětlit takto:
-
T1 Držte zámek IX na stránce P1.
-
T2: stránka se dělí na P1, přidělí novou stránku P2, použije se zde systémová transakce TX. Do protokolu zrcadlení SQL Server neuvedl hobt_id.
-
Pomocí zámku uzamkne migrace pro T1 přesunutí zámku z P1 na P2.
-
TX potvrzeno: T2 může použít stránku P2 a T2 získá další zámek IX na stránce P2.
-
T1 potvrzeno: T2 je jediný, kdo má zámek IX v P2.
-
Po šarži vložení dojde na primárním T2 k eskalaci zámku, ale na zrcadlu během Eskalace zámku, T2 neuvolnil zámek IX.
-
Po odstranění šarží se stránka P2 vyprázdní a je navrácena.
-
T3 potřebuje novou stránku a stane se mu přidělit hodnota P2, vyžaduje proto zámek X, ale na zrcadle se tento krok nezdařil kvůli kroku 6.
V důsledku toho krok 6 neuvolní zámek IX, protože hobt_id v bloku zámku je nesprávný. Tento nesprávný hobt_id v kroku 2 spadá a z toho důvodu SQL Server neumísťuje hobt_id do protokolu zrcadlení. obvykle se vám nezobrazuje žádný problém, protože v kroku 2 TX je velmi krátké a blok zámku s nesprávným hobt_id bude při potvrzení uvolněn. Z důvodu zámku migrace v Step3 a v následujících krocích (4 a 5) se ale tento blok zámku s nesprávným hobt_id zachová a konečně to způsobí problém. Primární nemá tento problém, protože používá správný hobt_id v kroku 2. Ale záznam protokolu nemá správný hobt_id.
Řešení
Tento problém byl poprvé opraven následující kumulativní aktualizací SQL serveru.
Kumulativní aktualizace 1 pro SQL Server 2014 /en-us/help/2931693
Kumulativní aktualizace 9 pro SQL Server 2012 SP1 /en-us/help/2931078
Každá nová kumulativní aktualizace pro SQL Server obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozí kumulativní aktualizace. Podívejte se na nejnovější kumulativní aktualizace SQL serveru:
Alternativní řešení
Problém vyřešíte tak, že znovu inicializujete zrcadlo a ukončíte tak stav pozastaveno.
Stav
Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt.