Anteckning
Å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.
Den här artikeln hjälper dig att lösa 9002-felet som uppstår när transaktionsloggen blir stor eller får slut på utrymme i SQL Server.
Ursprunglig produktversion: SQL Server 2017, SQL Server 2016, SQL Server 2014, SQL Server 2012
Ursprungligt KB-nummer: 2922898
Symptom
Föreställ dig följande scenario:
- Du har Microsoft SQL Server 2012 eller en senare version installerad på en server.
- Instansen av SQL Server är en primär replik i miljön AlwaysOn-tillgänglighetsgrupper.
- Alternativet autogrow för transaktionsloggfiler anges i SQL Server.
I det här scenariot kan transaktionsloggen bli stor och få slut på diskutrymme eller överskrida maxstorleksalternativuppsättningen för transaktionsloggen på den primära repliken och du får ett felmeddelande som liknar följande:
Fel: 9002, Allvarlighetsgrad: 17, Tillstånd: 9. Transaktionsloggen för databasen %.*ls är full på grund av "AVAILABILITY_REPLICA"
Orsak
Detta inträffar när de loggade ändringarna på den primära repliken ännu inte är härdade på den sekundära repliken. Mer information om datasynkroniseringsprocessen i AlwaysOn-miljön finns i Datasynkroniseringsprocess.
Felsökning
Det finns två scenarier som kan leda till loggtillväxt i en tillgänglighetsdatabas och 'AVAILABILITY_REPLICA' log_reuse_wait_desc:
Scenario 1: Svarstid som levererar loggade ändringar till sekundär
När transaktioner ändrar data i den primära repliken kapslas dessa ändringar in i loggpostblock och dessa loggade block levereras och härdas till databasloggfilen på den sekundära repliken. Den primära repliken kan inte skriva över loggblock i sin egen loggfil förrän dessa loggblock har levererats och förstärkts till motsvarande databasloggfil i alla sekundära repliker. Eventuella fördröjningar i leveransen eller härdningen av dessa block till en replik i tillgänglighetsgruppen förhindrar trunkering av de loggade ändringarna i databasen på den primära repliken och gör att loggfilens användning växer.
Mer information finns i Hög nätverkssvarstid eller lågt nätverksdataflöde orsakar logguppbyggnad på den primära repliken.
Scenario 2: Gör om svarstiden
När den härdats till den sekundära databasloggfilen tillämpar en dedikerad omtrådningstråd i den sekundära replikinstansen de inneslutna loggposterna på motsvarande datafiler. Den primära repliken kan inte skriva över loggblock i sin egen loggfil förrän alla omgjorda trådar i alla sekundära repliker har tillämpat de inneslutna loggposterna.
Om åtgärden gör om på en sekundär replik inte kan hålla jämna drag med den hastighet med vilken loggblocken är härdade vid den sekundära repliken, leder det till loggtillväxt på den primära repliken. Den primära repliken kan bara trunkera och återanvända sin egen transaktionslogg upp till den punkt som alla sekundära replikernas omarbetningstrådar har tillämpats. Om det finns mer än en sekundär kan du jämföra
truncation_lsnkolumnen i densys.dm_hadr_database_replica_statesdynamiska hanteringsvyn över flera sekundärfiler för att identifiera vilken sekundär databas som fördröjer loggtrunkeringen mest.Du kan använda alwayson-instrumentpanelen och
sys.dm_hadr_database_replica_statesdynamiska hanteringsvyer för att övervaka loggens sändningskö och göra om kön. Några viktiga fält är:Fält beskrivning log_send_queue_sizeAntal loggposter som inte har kommit till den sekundära repliken log_send_rateHastighet med vilken loggposter skickas till de sekundära databaserna. redo_queue_sizeMängden loggposter i loggfilerna för den sekundära repliken som ännu inte har gjorts om, i kilobyte (KB). redo_rateDen hastighet med vilken loggposterna görs om på en viss sekundär databas, i kilobyte (KB)/sekund. last_redone_lsnVerkligt loggsekvensnummer för den senaste loggposten som gjordes om på den sekundära databasen. last_redone_lsnär alltid mindre änlast_hardened_lsn.last_received_lsnLoggblocks-ID:t som identifierar den punkt som alla loggblock har tagits emot av den sekundära repliken som är värd för den sekundära databasen. Visar ett loggblocks-ID med nollor. Det är inte ett verkligt loggsekvensnummer. Kör till exempel följande fråga mot den primära repliken för att rapportera repliken med den tidigaste
truncation_lsnoch är den övre gränsen som den primära kan frigöra i sin egen transaktionslogg:SELECT ag.name AS [availability_group_name] , d.name AS [database_name] , ar.replica_server_name AS [replica_instance_name] , drs.truncation_lsn , drs.log_send_queue_size , drs.redo_queue_size FROM sys.availability_groups ag INNER JOIN sys.availability_replicas ar ON ar.group_id = ag.group_id INNER JOIN sys.dm_hadr_database_replica_states drs ON drs.replica_id = ar.replica_id INNER JOIN sys.databases d ON d.database_id = drs.database_id WHERE drs.is_local=0 ORDER BY ag.name ASC, d.name ASC, drs.truncation_lsn ASC, ar.replica_server_name ASCKorrigerande åtgärder kan omfatta men är inte begränsade till följande:
- Kontrollera att det inte finns någon resurs- eller prestandaflaskhals på den sekundära.
- Kontrollera att Gör om-tråden inte är blockerad på den sekundära. Använd den
lock_redo_blockedutökade händelsen för att identifiera när detta inträffar och vilka objekt som omgjorda tråden blockeras.
Lösning
När du har identifierat den sekundära databas som gör detta kan du prova en eller flera av följande metoder för att tillfälligt lösa problemet:
Ta bort databasen från tillgänglighetsgruppen för den felaktiga sekundära.
Kommentar
Den här metoden resulterar i förlust av scenariot hög tillgänglighet/haveriberedskap för den sekundära. Du kan behöva konfigurera tillgänglighetsgruppen igen i framtiden.
Om om du ofta blockerar omtråden
Readable Secondaryinaktiverar du funktionen genom att ändra parameternSECONDARY_ROLEALLOW_CONNECTIONSför repliken till NEJ.Kommentar
Detta hindrar användare från att läsa data i den sekundära repliken, vilket är rotorsaken till blockeringen. När redo-kön har sjunkit till en acceptabel storlek kan du överväga att aktivera funktionen igen.
Aktivera autogrow-inställningen om den är inaktiverad och det finns tillgängligt diskutrymme.
Öka MaxSize-värdet för transaktionsloggfilen om den har nåtts och det finns tillgängligt diskutrymme.
Lägg till ytterligare en transaktionsloggfil om den aktuella har nått systemets maximalt 2 TB eller om ytterligare utrymme är tillgängligt på en annan tillgänglig volym.
Mer information
Mer information om varför en transaktionslogg växer oväntat eller blir full i SQL Server finns i Felsöka en fullständig transaktionslogg (SQL Server-fel 9002).
Mer information om problemet med blockering av omarbetningsåtgärd finns i AlwaysON – HADRON Learning Series: lock_redo_blocked/gör om arbetaren Blockerad på sekundär replik.
Mer information om AVAILABILITY_REPLICA-baserade log_reuse_wait kolumner finns i Faktorer som kan fördröja loggtrunkering.
Mer information om vyn finns i
sys.dm_hadr_database_replica_statessys.dm_hadr_database_replica_states (Transact-SQL).Mer information om hur du övervakar och felsöker loggade ändringar som inte kommer och som inte tillämpas i tid finns i Övervaka prestanda för AlwaysOn-tillgänglighetsgrupper.
Gäller för
- SQL Server 2012 Enterprise
- SQL Server 2014 Enterprise
- SQL Server 2014 Business Intelligence
- SQL Server 2014 Standard
- SQL Server 2016 Enterprise
- SQL Server 2016 Standard
- SQL Server 2017 Enterprise
- SQL Server 2017 Standard Windows