Fehler 9002: Das Transaktionsprotokoll für die Datenbank ist voll aufgrund der Fehlermeldung AVAILABILITY_REPLICA in SQL Server
Dieser Artikel hilft Ihnen, den 9002-Fehler zu beheben, der auftritt, wenn das Transaktionsprotokoll zu einem großen oder nicht mehr verfügbaren Speicherplatz in SQL Server wird.
Ursprüngliche Produktversion: SQL Server 2017, SQL Server 2016, SQL Server 2014, SQL Server 2012
Ursprüngliche KB-Nummer: 2922898
Problembeschreibung
Stellen Sie sich folgendes Szenario vor:
- Sie haben Microsoft SQL Server 2012 oder eine höhere Version auf einem Server installiert.
- Die Instanz von SQL Server ist ein primäres Replikat in der Umgebung "Always On Availability Groups".
- Die Option für die automatische Vergrößerung für Transaktionsprotokolldateien wird in SQL Server festgelegt.
In diesem Szenario kann das Transaktionsprotokoll groß werden und nicht genügend Speicherplatz vorhanden sein oder die Option "MaxSize " für das Transaktionsprotokoll im primären Replikat überschreiten, und Sie erhalten eine Fehlermeldung, die wie folgt aussieht:
Fehler: 9002, Schweregrad: 17, Status: 9. Das Transaktionsprotokoll für die Datenbank '%.*ls' ist aufgrund von 'AVAILABILITY_REPLICA' voll.
Ursache
Dies tritt auf, wenn die protokollierten Änderungen am primären Replikat noch nicht im sekundären Replikat gehärtet werden. Weitere Informationen zum Datensynchronisierungsprozess in alwaysOn-Umgebung finden Sie unter Datensynchronisierung hronisierungsprozess.
Problembehandlung
Es gibt zwei Szenarien, die zu einem Protokollwachstum in einer Verfügbarkeitsdatenbank und zu folgendem 'AVAILABILITY_REPLICA' log_reuse_wait_desc
führen können:
Szenario 1: Latenz, die protokollierte Änderungen an sekundären Änderungen liefert
Wenn Transaktionen Daten im primären Replikat ändern, werden diese Änderungen in Protokolldatensätze gekapselt, und diese protokollierten Blöcke werden an die Datenbankprotokolldatei im sekundären Replikat übermittelt und gehärtet. Das primäre Replikat kann Protokollblöcke in einer eigenen Protokolldatei erst überschreiben, wenn diese Protokollblöcke in allen sekundären Replikaten bereitgestellt und in die entsprechende Datenbankprotokolldatei gehärtet wurden. Jede Verzögerung bei der Übermittlung oder Härtung dieser Blöcke an ein Replikat in der Verfügbarkeitsgruppe verhindert das Abschneiden dieser protokollierten Änderungen in der Datenbank am primären Replikat und führt dazu, dass die Verwendung der Protokolldatei vergrößert wird.
Weitere Informationen finden Sie unter "Hohe Netzwerklatenz" oder "Geringer Netzwerkdurchsatz", was die Protokollerstellung für das primäre Replikat verursacht.
Szenario 2: Wiederholen der Latenz
Sobald die sekundäre Datenbankprotokolldatei gehärtet wurde, wendet ein dedizierter Wiederholen-Thread in der sekundären Replikatinstanz die enthaltenen Protokolldatensätze auf die entsprechenden Datendateien an. Das primäre Replikat kann Protokollblöcke in seiner eigenen Protokolldatei erst überschreiben, wenn alle Wiederholen-Threads in allen sekundären Replikaten die enthaltenen Protokolldatensätze angewendet haben.
Wenn der Wiederholungsvorgang für ein sekundäres Replikat nicht in der Lage ist, mit der Geschwindigkeit, mit der Protokollblöcke bei diesem sekundären Replikat gehärtet werden, auf dem laufenden zu bleiben, führt es zu protokolliertem Wachstum am primären Replikat. Das primäre Replikat kann nur sein eigenes Transaktionsprotokoll abschneiden und wiederverwenden, bis zu dem Punkt, auf den alle Wiederholungsthreads des sekundären Replikats angewendet wurden. Wenn mehrere sekundäre Elemente vorhanden sind, vergleichen Sie die
truncation_lsn
Spalte dersys.dm_hadr_database_replica_states
dynamischen Verwaltungsansicht über mehrere Secondaries hinweg, um zu ermitteln, welche sekundäre Datenbank das Protokollabschneiden am meisten verzögert.Sie können die Always On Dashboard- und
sys.dm_hadr_database_replica_states
dynamischen Verwaltungsansichten verwenden, um die Warteschlange zum Senden von Protokollen und die Wiederherstellen-Warteschlange zu überwachen. Einige Schlüsselfelder sind:Feld BESCHREIBUNG log_send_queue_size
Anzahl der Protokolldatensätze, die nicht zum sekundären Replikat gelangt sind log_send_rate
Häufigkeit, mit der Protokolldatensätze an die sekundären Datenbanken gesendet werden. redo_queue_size
Die Menge an Protokolldatensätzen in den Protokolldateien des sekundären Replikats, die noch nicht neu erstellt wurde, in Kilobyte (KB). redo_rate
Die Rate, mit der die Protokolldatensätze in einer bestimmten sekundären Datenbank in Kilobyte (KB)/Sekunde erneut bearbeitet werden. last_redone_lsn
Tatsächliche Protokollfolgenummer des letzten Protokolldatensatzes, der zuletzt für die sekundäre Datenbank wiederholt wurde. last_redone_lsn
ist immer kleiner alslast_hardened_lsn
.last_received_lsn
Die Protokollblock-ID, die den Punkt angibt, an dem alle Protokollblöcke vom sekundären Replikat empfangen wurden, das diese sekundäre Datenbank hosten soll. Gibt eine Protokollblock-ID an, die mit Nullen aufgefüllt ist. Es handelt sich nicht um eine tatsächliche Protokollsequenznummer. Führen Sie z. B. die folgende Abfrage für das primäre Replikat aus, um das Replikat mit der frühesten
truncation_lsn
zu melden, und ist die obere Grenze, die das primäre Objekt in seinem eigenen Transaktionsprotokoll zurückgeben kann: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 ASC
Korrekturmaßnahmen können umfassen, sind jedoch nicht auf Folgendes beschränkt:
- Stellen Sie sicher, dass keine Ressourcen- oder Leistungsengpässe an der sekundären Stelle vorhanden sind.
- Stellen Sie sicher, dass der Redo-Thread nicht an der sekundären Stelle blockiert ist. Verwenden Sie das
lock_redo_blocked
erweiterte Ereignis, um zu ermitteln, wann dies geschieht und welche Objekte der Redo-Thread blockiert wird.
Problemumgehung
Nachdem Sie die sekundäre Datenbank identifiziert haben, die dies bewirkt, versuchen Sie eine oder mehrere der folgenden Methoden, um dieses Problem vorübergehend zu umgehen:
Entfernen Sie die Datenbank aus der Verfügbarkeitsgruppe für die problematische sekundäre.
Notiz
Diese Methode führt zum Verlust des Szenarios "Hohe Verfügbarkeit/Notfallwiederherstellung" für die sekundäre Methode. Möglicherweise müssen Sie die Verfügbarkeitsgruppe in Zukunft erneut einrichten.
Wenn der Redo-Thread häufig blockiert wird, deaktivieren Sie das
Readable Secondary
Feature, indem Sie denALLOW_CONNECTIONS
Parameter desSECONDARY_ROLE
Replikats in NO ändern.Notiz
Dadurch wird verhindert, dass Benutzer die Daten im sekundären Replikat lesen, was die Ursache der Blockierung ist. Nachdem die Redo-Warteschlange auf eine akzeptable Größe verworfen wurde, sollten Sie das Feature erneut aktivieren.
Aktivieren Sie die Einstellung für die automatische Vergrößerung , wenn sie deaktiviert ist und speicherplatz verfügbar ist.
Erhöhen Sie den MaxSize-Wert für die Transaktionsprotokolldatei, wenn sie erreicht wurde und speicherplatz verfügbar ist.
Fügen Sie eine zusätzliche Transaktionsprotokolldatei hinzu, wenn die aktuelle datei maximal 2 TB des Systems erreicht hat oder zusätzlichen Speicherplatz auf einem anderen verfügbaren Volume verfügbar ist.
Weitere Informationen
Weitere Informationen dazu, warum ein Transaktionsprotokoll unerwartet wächst oder in SQL Server voll wird, finden Sie unter Problembehandlung für ein vollständiges Transaktionsprotokoll (SQL Server-Fehler 9002).
Weitere Informationen zum Blockierungsproblem beim Wiederholen-Vorgang finden Sie unter AlwaysON – HADRON Learning Series: lock_redo_blocked/redo worker Blocked on Secondary Replica.For more information about the Redo operation blocking problem, see AlwaysON - HADRON Learning Series: lock_redo_blocked/redo worker Blocked on Secondary Replica.
Weitere Informationen zu AVAILABILITY_REPLICA-basierten log_reuse_wait Spalten finden Sie unter Faktoren, die das Abschneiden von Protokollen verzögern können.
Weitere Informationen zur
sys.dm_hadr_database_replica_states
Ansicht finden Sie unter sys.dm_hadr_database_replica_states (Transact-SQL).Weitere Informationen zum Überwachen und Beheben protokollierter Änderungen, die nicht ankommen und nicht rechtzeitig angewendet werden, finden Sie unter Überwachen der Leistung für AlwaysOn-Verfügbarkeitsgruppen.
Gilt 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