Simptomi
Kada koristite preslikavanje baze podataka u sistemu Microsoft SQL Server 2012 ili Microsoft SQL Server 2014, možete da pogodite uslov potvrde i preslikavanje baze podataka prelazi u suspendovano stanje.
Uzrok
Do problema dolazi zato što prilikom dodeljivanja nove stranice SQL Server dobija X katanac na novoj stranici. SQL Server će staviti hobt_id (Heap ili B-Tree ID) kojoj pripada nova stranica u zahtevu za zaključavanje. Međutim, SQL Server ne možete da stavite hobt_id u evidenciju preslikavanja, što dovodi do različitog ponašanja zaključavanja između primarne i zrcalne oblasti.
Ovo se može detaljno objasniti na sledeći način:
- T1 drži IX bravu na stranici P1.
- T2 uradi podelu stranice na P1, dodeli novu stranicu P2, sistemska transakcija TKS se koristi ovde, drži Ks bravu na P2. Ovde SQL Server nije stavio hobt_id u evidenciju preslikavanja.
- TKS radi migraciju zaključavanja za T1 da premesti IKS bravu sa P1 na P2.
- TKS izvršen, sada T2 može da koristi stranicu P2, a T2 dobija još jednu IX bravu na stranici P2.
- T1 počinio, sada T2 je jedini koji ima IKS bravu na P2.
- Nakon mnogo umetanja, dolazi do eskalacije zaključavanja, na primarnom, T2 oslobađa IKS na P2, ali na ogledalu, tokom eskalacije zaključavanja, T2 nije oslobodio IKS bravu.
- Nakon mnogo brisanja, stranica P2 je postala prazna i raspoređena.
- T3 treba novu stranicu, i dešava se da dodeli P2, to zahteva X lock, ali u ogledalu, ovaj korak nije uspeo zbog koraka 6.
Na ogledalu, korak 6 ne otpušta IX bravu jer je hobt_id u bloku zaključavanja neispravna. Ova netačna hobt_id dolazi tokom 2. koraka i zbog SQL Server ne stavlja hobt_id u evidenciju preslikavanja.
Obično ne vidite nikakav problem jer je TX u koraku 2 veoma kratak, a blok za zaključavanje sa netačnim hobt_id će biti oslobođen kada se izvrši. Međutim, zbog migracije zaključavanja u 3. koraku i sledećim koracima (4 i 5), blok zaključavanja sa netačnim hobt_id se čuva i na kraju dovodi do problema.
Primarni nema ovaj problem jer koristi ispravnu hobt_id u 2. koraku. Međutim, zapis evidencije nema ispravne hobt_id.
Rešenje
Problem je prvi put rešen u sledećoj kumulativnoj ispravci sistema SQL Server.
Kumulativna ispravka 1 za SQL Server 2014 /en-us/help/2931693
Kumulativna ispravka 9 za SQL Server 2012 SP1 /en-us/help/2931078
Osnovni podaci o kumulativnim ispravkama za SQL Server
Svaka nova kumulativna ispravka za SQL Server sadrži sve hitne ispravke i sve bezbednosne ispravke koje su uključene u prethodnu kumulativnu ispravku. Pogledajte najnovije kumulativne ispravke za SQL Server:
- Najnovija kumulativna ispravka za SQL Server 2014
- Najnovija kumulativna ispravka za SQL Server 2012 SP1
Privremeno rešenje
Da biste rešili problem, ponovo pokrenete preslikano da biste okončali status obustavljanja.
Status
Microsoft je potvrdio da je ovo problem u Microsoft proizvodima koji su navedeni u odeljku „Odnosi se na“.