Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Automatisk sidreparation stöds av databasspegling och av Always On-tillgänglighetsgrupper. Efter vissa typer av fel som korrupterar en sida och gör den oläslig, försöker en databasspegelpartner (principal eller mirror) eller en tillgänglighetsreplik (primär eller sekundär) automatiskt återställa sidan. Partnern eller repliken som inte kan läsa sidan begär en ny kopia av sidan från sin partner eller från en annan replika. Om denna begäran lyckas ersätts den oläsbara sidan med den läsbara kopian, och detta löser vanligtvis felet.
Generellt hanterar databasspegling och Always On-tillgänglighetsgrupper I/O-fel på likvärdiga sätt. De få skillnaderna nämns uttryckligen här.
Anmärkning
Automatisk sidreparation skiljer sig från DBCC-reparation. All data bevaras genom en automatisk reparation av sidan. Däremot kan korrigering av fel med alternativet DBCC REPAIR_ALLOW_DATA_LOSS kräva att vissa sidor, och därmed data, raderas.
Feltyper som orsakar ett automatiskt Page-Repair försök
Automatisk sidreparation med databasspegling försöker endast reparera sidor i en datafil där en operation har misslyckats för något av felen som listas i följande tabell.
| Felnummer | Beskrivning | Förekomster som leder till försök till automatisk sidreparation |
|---|---|---|
| 823 | Åtgärder vidtas endast om operativsystemet utförde en cyklisk redundanskontroll (CRC) som misslyckades med datan. | ERROR_CRC. Operativsystemets värde för detta fel är 23. |
| 824 | Logiska fel. | Logiska datafel, som avbruten skrivning eller felaktig sidkontrollsumma. |
| 829 | En sida har markerats för återställning. | Alla. |
Om du vill visa de senaste 823 CRC-felen och 824-felen finns informationen i tabellen suspect_pages i databasen msdb.
Sidtyper som inte kan repareras automatiskt
Automatisk sidreparation kan inte reparera följande kontrollsidtyper:
Filhuvudsida (sid-ID 0).
Sida 9 (databasens startsida).
Allokeringssidor: SIDOR med global allokeringskarta (GAM), SGAM-sidor (Delad global allokeringskarta) och PFS-sidor (Sidfritt utrymme).
Hantering av I/O-fel i huvud-/primärdatabasen
På huvuddatabasen utförs automatisk sidreparation endast när databasen är i tillståndet SYNCHRONIZED och huvuddatabasen fortfarande skickar loggposter för databasen till sekundären. Den grundläggande sekvensen av åtgärder i ett automatiskt sidreparationsförsök är följande:
När ett läsfel uppstår på en datasida i principal/primärdatabasen, infogar principal/primary en rad i suspect_pages tabellen med lämplig felstatus. För databasspegling begär principalen sedan en kopia av sidan från spegeln. För Always On-tillgänglighetsgrupper sänder primären förfrågan till alla sekundära och får sidan från den första som svarar. Förfrågan specificerar sid-ID och LSN som för närvarande finns i slutet av den rensade loggen. Sidan är markerad som återställning väntar. Detta gör den otillgänglig under det automatiska försöket att reparera sidan. Försök att komma åt denna sida under reparationsförsöket kommer att misslyckas med fel 829 (återställning väntar).
Efter att ha mottagit sidförfrågan väntar spegeln/sekundären tills loggen har återställts till det LSN som anges i förfrågan. Sedan försöker spegeln/sekundärservern få åtkomst till sidan i sin kopia av databasen. Om sidan kan nås skickar spegeln/sekundären kopian av sidan till huvudpersonen/primären. Annars returnerar spegeln/sekundären ett felmeddelande till huvudservern/primären och försöket till automatisk sidreparation misslyckas.
Huvudpersonen/primären bearbetar svaret som innehåller den färska kopian av sidan.
Efter att det automatiska sidreparationsförsöket har åtgärdat en misstänkt sida markeras sidan i tabellen suspect_pages som återställd (event_type = 5).
Om I/O-felet på sidan orsakade några uppskjutna transaktioner, försöker huvudservern/den primära servern lösa dessa transaktioner efter att du har reparerat sidan.
Hantering av I/O-fel i spegel-/sekundärdatabasen
I/O-fel på datasidor som uppstår i spegel-/sekundärdatabasen hanteras i stort sett på samma sätt av databasspegling och av Always On-tillgänglighetsgrupper.
Med databasspegeln, om spegeln stöter på ett eller flera sid-I/O-fel när den gör om en loggpost, går speglingssessionen in i SUSPENDED-tillståndet. Med Always On-tillgänglighetsgrupper, om en sekundär replika stöter på ett eller flera sid-I/O-fel när den gör om en loggpost, går den sekundära databasen in i SUSPENDED-tillståndet. Vid den punkten infogar spegeln/sekundären en rad i suspect_pages tabellen med rätt felstatus. Spegeln/sekundärenheten begär sedan en kopia av sidan från primärenheten.
Huvudservern/primärservern försöker få åtkomst till sidan i sin kopia av databasen. Om sidan kan nås skickar huvudservern/primären en kopia av sidan till spegeln/sekundären.
Om spegeln/sekundärnoden får kopior av alla sidor som den har begärt försöker den återuppta speglingen. Om ett automatiskt sidreparationsförsök åtgärdar en misstänkt sida markeras sidan i suspect_pages tabellen som återställd (event_type = 4).
Om en spegelserver/sekundär inte får en sida som den har begärt från primären, misslyckas det automatiska försöket att reparera sidan. Med databasspegling förblir speglingssessionen avstängd. Med Always On-tillgänglighetsgrupper förblir den sekundära databasen avstängd. Om speglingssessionen eller den sekundära databasen återupptas manuellt, kommer de korrupta sidorna att träffas igen under synkroniseringsfasen.
Utvecklares bästa praxis
En automatisk sidreparation är en asynkron process som körs i bakgrunden. Därför misslyckas en databasoperation som begär en oläsbar sida och returnerar felkoden för det tillstånd som orsakade felet. När du utvecklar en applikation för en speglad databas eller en tillgänglighetsdatabas bör du avlyssna undantag för misslyckade operationer. Om SQL Server-felkoden är 823, 824 eller 829 bör du försöka igen senare.
Så här visar du försök till automatisk sidreparation
Följande dynamiska hanteringsvyer returnerar rader för de senaste automatiska sidreparationsförsöken på en given tillgänglighetsdatabas eller speglad databas, med maximalt 100 rader per databas.
Alltid tillgängliga grupper:
sys.dm_hadr_auto_page_repair (Transact-SQL)
Returnerar en rad för varje automatiskt försök till sidreparation i varje tillgänglighetsdatabas på en tillgänglighetsreplika som finns för varje tillgänglighetsgrupp av serverinstansen.
Databasspegling:
sys.dm_db_mirroring_auto_page_repair (Transact-SQL)
Returnerar en rad för varje försök till automatisk sidreparation på någon speglad databas på serverinstansen.