KB2938828 - IZLABOTS: Datu bāzes spoguļošanas trāpījumi apstiprina, un spoguļošanas sesija parāda aizturēto stāvokli SQL Server 2012 vai SQL Server 2014

Attiecas uz
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

Pazīmes

Izmantojot datu bāzes spoguļošanu programmā Microsoft SQL Server 2012 vai Microsoft SQL Server 2014, var rasties apgalvojuma nosacījums un datu bāzes spoguļošana pāriet aizturētā stāvoklī.

Iemesls

Problēma rodas, jo, piešķirot jaunu lapu, SQL Server iegūst X bloķēšanu jaunajā lapā. SQL Server bloķēšanas pieprasījumā ievietos hobt_id (kaudzes vai B koka ID), kam pieder jaunā lapa. Tomēr SQL Server nevar ievietot hobt_id spoguļošanas žurnālā, kā rezultātā primārā un spoguļa bloķēšanas darbība atšķiras.

To var detalizēti izskaidrot šādi:

  1. T1 turiet IX slēdzeni P1 lappusē.
  2. T2 veiciet lapas sadalīšanu uz P1, piešķiriet jaunu lapu P2, šeit tiek izmantots sistēmas darījums TX, tas tur X slēdzeni uz P2. Šeit SQL Server neievietoju hobt_id spoguļošanas žurnālā.
  3. TX veic slēdzenes migrāciju T1, lai pārvietotu IX slēdzeni no P1 uz P2.
  4. TX apņēmās, tagad T2 var izmantot P2 lapu, un T2 iegūst vēl vienu IX slēdzeni P2 lappusē.
  5. T1 apņēmās, tagad T2 ir vienīgais, kuram ir IX slēdzene uz P2.
  6. Pēc daudzām ievietošanas notiek slēdzenes eskalācija, primārajā T2 atbrīvo IX uz P2, bet uz spoguļa bloķēšanas eskalācijas laikā T2 neatlaida IX slēdzeni.
  7. Pēc ilgas dzēšanas P2 lapa kļuva tukša un tiek izmainīta.
  8. T3 ir nepieciešama jauna lapa, un tas notiek, lai piešķirtu P2, tam ir nepieciešama X bloķēšana, bet spogulī šis solis neizdevās 6. darbības dēļ.

Uz spoguļa 6. darbība neatlaiž IX slēdzeni, jo bloķēšanas bloka hobt_id ir nepareizs. Šis nepareizais hobt_id rodas 2. darbības laikā un SQL Server dēļ hobt_id netiek ievietots spoguļošanas žurnālā.
Parasti jūs neredzat nekādu problēmu, jo 2. darbības TX ir ļoti īss, un bloķēšanas bloks ar nepareizu hobt_id tiks atbrīvots, kad tas izdarīs. Tomēr, ņemot vērā bloķēšanas migrāciju 3. darbībā un nākamajās darbībās (4 un 5), šis bloķēšanas bloks ar nepareizu hobt_id tiek saglabāts un visbeidzot rada problēmu.
Primārajam nav šīs problēmas, jo tas izmanto pareizu hobt_id 2. darbībā. Bet žurnāla ierakstam nav pareizo hobt_id.

Risinājums

Šī problēma pirmo reizi tika novērsta nākamajā SQL Server kumulatīvajā atjauninājumā.

1. kumulatīvais atjauninājums sistēmai SQL Server 2014 /en-us/help/2931693

9. kumulatīvais atjauninājums operētājsistēmai SQL Server 2012 SP1 /en-us/help/2931078

Par SQL Server kumulatīvajiem atjauninājumiem

Katrā jaunajā SQL Server kumulatīvajā atjauninājumā ir visi labojumfaili un visi drošības labojumi, kas bija iekļauti iepriekšējā kumulatīvajā atjauninājumā. Skatiet jaunākos SQL Server kumulatīvos atjauninājumus:

      

Risinājums

Lai novērstu šo problēmu, atkārtoti inicializējiet spoguli, lai izbeigtu aizturētā statusa beigas.

Statuss

Microsoft apstiprināja, ka šī ir problēma Microsoft produktos, kas norādīti sadaļā "attiecas uz".