Fehler 9002: Das Transaktionsprotokoll für die Datenbank ist aufgrund AVAILABILITY_REPLICA Fehlermeldung in SQL Server voll
In diesem Artikel erfahren Sie, wie Sie den Fehler 9002 beheben, der auftritt, wenn das Transaktionsprotokoll in SQL Server groß wird oder nicht mehr verfügbar ist.
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.
- Das instance von SQL Server ist ein primäres Replikat in Always On Verfügbarkeitsgruppenumgebung.
- 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 der Speicherplatz nicht mehr verfügbar sein oder die für das Transaktionsprotokoll auf dem primären Replikat festgelegte MaxSize-Option überschreiten, und Sie erhalten eine Fehlermeldung, die der folgenden ähnelt:
Fehler: 9002, Schweregrad: 17, Status: 9. Das Transaktionsprotokoll für die '%.*ls'-Datenbank ist aufgrund von 'AVAILABILITY_REPLICA' voll.
Ursache
Dies tritt auf, wenn die protokollierten Änderungen am primären Replikat noch nicht auf dem sekundären Replikat gehärtet sind. Weitere Informationen zum Datensynchronisierungsprozess in Always On-Umgebung finden Sie unter Datensynchronisierungsprozess.
Problembehandlung
Es gibt zwei Szenarien, die zu einer Protokollvergrößerung in einer Verfügbarkeitsdatenbank 'AVAILABILITY_REPLICA' log_reuse_wait_desc
führen können:
Szenario 1: Latenz bei der Übermittlung protokollierter Änderungen an der sekundären Datenbank
Wenn Transaktionen Daten im primären Replikat ändern, werden diese Änderungen in Protokolldatensatzblöcken gekapselt, und diese protokollierten Blöcke werden an die Datenbankprotokolldatei am sekundären Replikat übermittelt und gehärtet. Das primäre Replikat kann Protokollblöcke in seiner eigenen Protokolldatei erst überschreiben, wenn diese Protokollblöcke übermittelt und in der entsprechenden Datenbankprotokolldatei in allen sekundären Replikaten 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 auf dem primären Replikat und führt zu einer Zunahme der Protokolldateinutzung.
Weitere Informationen finden Sie unter Hohe Netzwerklatenz oder geringer Netzwerkdurchsatz verursacht Protokollerstellung auf dem primären Replikat.
Szenario 2: Wiederholungswartezeit
Nach dem Härten in der protokolldatei der sekundären Datenbank wendet ein dedizierter Wiederholungsthread im sekundären Replikat instance die enthaltenen Protokolldatensätze auf die entsprechenden Datendateien an. Das primäre Replikat kann Protokollblöcke erst in seiner eigenen Protokolldatei überschreiben, wenn alle Wiederholungsthreads in allen sekundären Replikaten die enthaltenen Protokolldatensätze angewendet haben.
Wenn der Wiederholungsvorgang auf einem sekundären Replikat nicht mit der Geschwindigkeit Schritt halten kann, mit der Protokollblöcke auf diesem sekundären Replikat gehärtet werden, führt dies zu einer Protokollvergrößerung am primären Replikat. Das primäre Replikat kann sein eigenes Transaktionsprotokoll nur abschneiden und wiederverwenden, bis alle Wiederholungsthreads des sekundären Replikats angewendet wurden. Wenn mehr als ein sekundäres Element vorhanden ist, vergleichen Sie die
truncation_lsn
Spalte dersys.dm_hadr_database_replica_states
dynamischen Verwaltungssicht für mehrere sekundäre Datenbanken, um zu ermitteln, welche sekundäre Datenbank die Protokollkürzung am meisten verzögert.Sie können das Always On-Dashboard und
sys.dm_hadr_database_replica_states
dynamische Verwaltungsansichten verwenden, um die Protokollsende- und Wiederholungswarteschlange zu überwachen. Einige Schlüsselfelder sind:Feld Beschreibung log_send_queue_size
Menge der Protokolldatensätze, die nicht beim sekundären Replikat eingetroffen sind log_send_rate
Rate, mit der Protokolldatensätze an die sekundären Datenbanken gesendet werden. redo_queue_size
Die Menge der Protokolldatensätze in den Protokolldateien des sekundären Replikats, die noch nicht wiederholt wurde, in Kilobyte (KB). redo_rate
Die Rate, mit der die Protokolldatensätze in einer bestimmten sekundären Datenbank in Kilobyte (KB)/Sekunde neu erstellt werden. last_redone_lsn
Die tatsächliche Protokollsequenznummer des letzten Protokolldatensatzes, der für die sekundäre Datenbank neu erstellt wurde. last_redone_lsn
ist immer kleiner alslast_hardened_lsn
.last_received_lsn
Die Protokollblock-ID, die den Punkt angibt, bis zu dem alle Protokollblöcke vom sekundären Replikat empfangen wurden, das diese sekundäre Datenbank hostet. Gibt eine Mit Nullen aufgefüllte Protokollblock-ID an. Es handelt sich nicht um eine tatsächliche Protokollsequenznummer. Führen Sie beispielsweise die folgende Abfrage für das primäre Replikat aus, um das Replikat mit dem frühesten
truncation_lsn
und der Obergrenze zu melden, die das primäre Replikat in seinem eigenen Transaktionsprotokoll freigeben 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 Folgendes umfassen, sind aber nicht auf folgendes beschränkt:
- Stellen Sie sicher, dass es bei der sekundären Instanz keinen Ressourcen- oder Leistungsengpass gibt.
- Stellen Sie sicher, dass der Wiederholungsthread nicht auf der sekundären Ebene blockiert ist. Verwenden Sie das
lock_redo_blocked
erweiterte Ereignis, um zu ermitteln, wann dies geschieht und für welche Objekte der Wiederholungsthread blockiert ist.
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 betreffende sekundäre Instanz.
Hinweis
Diese Methode führt zum Verlust des Hochverfügbarkeits-/Notfallwiederherstellungsszenarios für die sekundäre Datenbank. Möglicherweise müssen Sie die Verfügbarkeitsgruppe in Zukunft erneut einrichten.
Wenn der Wiederholungsthread häufig blockiert wird, deaktivieren Sie das
Readable Secondary
Feature, indem Sie denALLOW_CONNECTIONS
Parameter desSECONDARY_ROLE
für das Replikat in NO ändern.Hinweis
Dadurch wird verhindert, dass Benutzer die Daten im sekundären Replikat lesen, was die Grundursache der Blockierung ist. Sobald die Wiederholungswarteschlange eine akzeptable Größe erreicht hat, sollten Sie das Feature erneut aktivieren.
Aktivieren Sie die Einstellung für die automatische Vergrößerung , wenn sie deaktiviert ist und verfügbarer Speicherplatz verfügbar ist.
Erhöhen Sie den MaxSize-Wert für die Transaktionsprotokolldatei, wenn sie erreicht wurde und verfügbarer Speicherplatz verfügbar ist.
Fügen Sie eine zusätzliche Transaktionsprotokolldatei hinzu, wenn die aktuelle das Systemmaximum von 2 TB erreicht hat oder wenn zusätzlicher 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 des Wiederholungsvorgangs finden Sie unter AlwaysON – HADRON Learning Series: lock_redo_blocked/Redo Worker blockiert auf sekundärem Replikat.
Weitere Informationen zu AVAILABILITY_REPLICA-basierten log_reuse_wait Spalten finden Sie unter Faktoren, die die Protokollkürzung 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 zur Überwachung und Problembehandlung protokollierter Änderungen, die nicht eintreffen und nicht rechtzeitig angewendet werden, finden Sie unter Überwachen der Leistung für Always On 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