Problembehandlung bei einer Verfügbarkeitsgruppendatenbank im wiederherstellenden Zustand

In diesem Artikel erfahren Sie, wie Sie Probleme mit einer Verfügbarkeitsgruppendatenbank im wiederherstellenden Zustand beheben.

Was ist der Wiederherstellenzustand?

Der Zustand wird wiederhergestellt, wenn der sekundäre Server änderungen rückgängig machen muss, die er bereits angewendet hat, um wieder mit dem primären Server synchronisiert zu werden.

Primäre und sekundäre Replikate der Verfügbarkeitsgruppe bleiben während des normalen Betriebs in einem verbundenen Zustand, sodass Änderungen am primären Replikat aktiv mit den sekundären Replikaten synchronisiert werden.

Während eines Failovers wird dieser Verbindungsstatus getrennt. Sobald das neue primäre Replikat online geschaltet ist, wird die Konnektivität zwischen dem primären Replikat und den sekundären Replikaten wiederhergestellt. Während dieses anfänglichen Verbindungszustands wird ein gemeinsamer Wiederherstellungspunkt ausgehandelt, in dem die neue sekundäre Instanz die Wiederherstellung starten sollte, damit sie mit dem primären Server synchronisiert wird.

Wenn zum Zeitpunkt des Failovers eine große Transaktion ausgeführt wird, liegt das protokoll der neuen sekundären Datenbank vor der primären Replikatdatenbank. Der neue gemeinsame Wiederherstellungspunkt, der ausgehandelt wird, erfordert, dass das sekundäre Replikat Seiten vom primären Replikat empfängt, damit es sich in einem Zustand befindet, in dem die Synchronisierung fortgesetzt werden kann. Der Wiederherstellenprozess wird auch als "Rückgängig des Wiederholens" bezeichnet.

Der Wiederherstellenprozess ist inhärent langsam, tritt häufig auf, und in der Regel werden kleine Transaktionen, die den Wiederherstellen des Zustands auslösen, kaum bemerkt. Die Wiederherstellung des Zustands wird häufig bemerkt, wenn ein Failover eine große Transaktion unterbricht, wodurch viele Seiten vom primären zum sekundären Replikat gesendet werden, um die sekundäre Replikatdatenbank in einen wiederherstellbaren Zustand zu rückgängig machen.

Symptome und Auswirkungen einer Verfügbarkeitsgruppendatenbank im wiederherstellenden Zustand

Wenn sich eine Datenbank im wiederhergestellten Zustand auf dem sekundären Replikat befindet, wird die Datenbank nicht synchronisiert und empfängt daher keine Änderungen vom primären Replikat. Ein plötzlicher Verlust der Datenbank auf dem primären Replikat kann zu Datenverlusten führen.

Always On Dashboard berichte nicht synchronisiert auf dem primären Server

Nach dem Ausführen eines Failovers für eine Verfügbarkeitsgruppe stellen Sie möglicherweise fest, dass die sekundäre Gruppe nicht synchronisiert wird, während das Failover erfolgreich war. Die Always On Dashboard meldet Nicht synchronisiert auf dem primären und Wiederherstellen auf dem sekundären.

Always On Dashboard berichte nicht synchronisiert auf dem primären Server Always On Dashboard meldet Wiederherstellen auf dem sekundären
Screenshot der Always On Dashboard, die nicht synchronisiert auf dem primären Server meldet. Screenshot: Always On Dashboard, der die Wiederherstellung auf der sekundären Seite meldet.

Always On DMVs-Berichte WERDEN NICHT AUF dem primären Computer synchronisiert

Wenn Sie die folgenden Always On Dynamische Verwaltungssichten (Dynamic Management Views, DMVs) für Verfügbarkeitsgruppen (AGs) für das primäre Replikat abfragen, befindet sich die Datenbank im Zustand NOT SYNCHRONIZING.

SELECT DISTINCT ar.replica_server_name, drcs.database_name, drs.database_id, drs.synchronization_state_desc, drs.database_state_desc
FROM sys.availability_replicas ar 
JOIN sys.dm_hadr_database_replica_states drs 
ON ar.replica_id=drs.replica_id 
JOIN sys.dm_hadr_database_replica_cluster_states drcs
ON drs.group_database_id=drcs.group_database_id

Screenshot: Always On DMVs, die nicht synchronisiert auf dem primären Server melden.

Wenn Sie die DMVs auf der sekundären Datenbank abfragen, befindet sich die Verfügbarkeitsgruppendatenbank im Zustand WIEDERHERSTELLEN .

Screenshot: Always On DMVs, die REVERTING auf der sekundären Datenbank melden.

Schreibgeschützte Workloads und Berichtsworkloads können nicht auf die sekundäre Datenbank zugreifen

Während die sekundäre Datenbank wiederhergestellt wird, kann nicht darauf zugegriffen oder abgefragt werden. Diese schreibgeschützten Workloads sind offline und unterbrochen. Je nachdem, wie lange sich die Datenbank im wiederhergestellten Zustand befindet, kann es erforderlich sein, diese Workloads an ein anderes sekundäres Replikat oder das primäre Replikat umzuleiten, wenn diese Workloads unternehmenskritisch sind.

Wenn Sie über eine schreibgeschützte Workload verfügen, z. B. eine Berichtsworkload, die an das sekundäre Replikat weitergeleitet wird, können diese Batches mit der Meldung 922 fehlschlagen:

Msg 922, Ebene 14, Status 1, Zeile 2 Die Datenbank "agdb" wird wiederhergestellt. Warten, bis die Wiederherstellung abgeschlossen ist.

Screenshot: Schreibgeschützte Workloads und Berichtsworkloads können nicht auf die sekundäre Datenbank mit Dem Fehler 922 zugreifen.

Eine Anwendung, die versucht, sich bei der sekundären Replikatdatenbank im wiederhergestellten Zustand anzumelden, kann keine Verbindung herstellen und löst den Fehler 18456 aus:

2023-01-26 13:01:13.100 Anmeldefehler: 18456, Schweregrad: 14, Status: 38. 2023-01-26 13:01:13.100 Anmeldefehler für Benutzer "UserName>"<. Ursache: Fehler beim Öffnen der explizit angegebenen Datenbank "agdb". [CLIENT: <lokaler Computer>]

Dieser Fehler kann auch im SQL Server Fehlerprotokoll gemeldet werden, wenn fehlgeschlagene Anmeldungen überwacht werden.

Schätzen der verbleibenden Zeit im Wiederherstellungszustand

Verwenden Sie eine der folgenden Methoden, um die verbleibende Zeit im Wiederherstellungszustand zu schätzen:

Verwenden der AlwaysOn_health XEvent-Sitzung

Das AlwaysOn_health erweiterte Ereignisdiagnoseprotokoll verfügt über ein hadr_trace_message-Ereignis , das alle fünf Minuten den Statusstatus wiederhergestellt.

Stellen Sie eine Verbindung mit dem sekundären Replikat her, indem Sie SQL Server Management Studio (SSMS) Objekt-Explorer und einen Drilldown zu Verwaltung, erweiterten Ereignissen und dann Sitzungen ausführen. Klicken Sie mit der rechten Maustaste auf das ereignis AlwaysOn_health , und wählen Sie Livedaten überwachen aus. Sie sollten ein neues Fenster im Registerkartenformat erhalten, das den aktuellen Status des Wiederherstellens des Vorgangs meldet. Der Zustand wird alle fünf Minuten über das hadr_trace_message -Ereignis gemeldet, und der abgeschlossene Prozentsatz des Wiederherstellungsvorgangs wird gemeldet.

Hinweis

Das erweiterte Ereignis hadr_trace_message wurde den neuesten kumulativen Updates in SQL Server 2019 und höher hinzugefügt. Sie müssen die neuesten kumulativen Updates ausführen, um dieses erweiterte Ereignis in der AlwaysOn_health erweiterten Ereignissitzung zu beobachten.

Screenshot des AlwaysOn_health erweiterten Ereignisdiagnoseprotokolls.

Das SQL Server Fehlerprotokolls auf dem sekundären Replikat ist bei der Schätzung des Wiederherstellens des Abschlusses nicht sehr hilfreich. In der folgenden Abbildung können Sie von 10:08 bis 11:03 Uhr beobachten, während im wiederherstellenden Zustand wenig gemeldet wird. Nachdem das sekundäre Replikat alle Seiten vom primären Replikat empfangen hat, kann es nun ein Rollback für die Transaktion ausführen, die auf dem ursprünglichen primären Replikat ausgeführt wurde, das den Wiederherstellen des Zustands ausgelöst hat. Die Wiederherstellung wird von 11:03 bis 11:05 Uhr ausgeführt. Kurz nach Abschluss der Wiederherstellung sollte die Datenbank mit der Synchronisierung mit dem primären Replikat beginnen und alle Änderungen auf dem primären Replikat aufholen, während sich die sekundäre Datenbank im wiederherstellenden Zustand befand.

Screenshot des SQL Server Fehlerprotokolls für die Wiederherstellungs- und Wiederherstellungsphase.

Überwachen des Wiederherstellens der Abschlusszeit mithilfe von Leistungsmonitor

Überwachen Sie den Status der Wiederherstellung mithilfe der Leistungsindikatoren SQL Server:D atabase Replica:Total Log Requiring Undo and SQL Server:D atabase Replica:Log Remaining for Undo, und wählen Sie die Verfügbarkeitsgruppendatenbank für die Instanz aus. Im Beispiel im folgenden Screenshot wird " Total Log Requiring Undo " als 56,3 mb gemeldet, und "Log Remaining for Undo " wird langsam auf 0 ( 0 ) zurückgesetzt, der den Status der Wiederherstellung meldet.

Screenshot der Leistungsindikatoren für

Was sind Ihre anderen Optionen als warten?

Microsoft empfiehlt, die Zeit für den Abschluss des Wiederherstellens des Zustands zu schätzen.

Hinzufügen eines sekundären Replikats zu einer Verfügbarkeitsgruppe

Wenn nur zwei Replikate in der Verfügbarkeitsgruppe vorhanden sind, fügen Sie nach Möglichkeit ein weiteres sekundäres Replikat hinzu, das Hochverfügbarkeit und Redundanz bieten kann, und eine aktive Synchronisierung mit dem primären Replikat durchführen, während das andere sekundäre Replikat die Wiederherstellung abgeschlossen hat.

Wichtig

Führen Sie kein Failover auf ein Replikat durch, dessen Datenbanken sich im zustand "wiederherstellen" befinden. Dies kann zu einer nicht verwendbaren Datenbank führen, die eine Wiederherstellung aus einer Sicherung erfordert. Starten Sie das sekundäre Replikat nicht neu, instance. Dadurch wird dieser Prozess nicht beschleunigt und kann den Zustand der sekundären Replikatdatenbank beeinträchtigen, die sich im wiederhergestellten Zustand befindet.

Behandeln fehlerhafter schreibgeschützter Workloads

Da auf die sekundären Replikatdatenbanken bei der Wiederherstellung nicht zugegriffen werden kann, tritt bei schreibgeschützten Workloads ein Fehler auf. Aktualisieren Sie die Routingtabelle für die Leseabsicht, um Datenverkehr zurück an das primäre Replikat oder an ein anderes sekundäres Replikat weiterzuleiten, bis die betroffene sekundäre Replikatdatenbank den Wiederherstellungsvorgang abgeschlossen hat.

Vermeiden des Wiederherstellens des Zustands – Überwachen auf große Transaktionen

Wenn Sie diesen Zustand häufig während geplanter Failover beobachten, implementieren Sie eine Prozedur, die vor Failovern auf große Transaktionen überprüft. Die folgende Abfrage meldet den Transaktionsbeginn und die aktuelle Uhrzeit aller geöffneten Transaktionen im System und stellt den Eingabepuffer der Transaktionen bereit.

SELECT tat.transaction_begin_time, getdate() AS 'current time', es.program_name, es.login_time, es.session_id, tst.open_transaction_count, eib.event_info
FROM sys.dm_tran_active_transactions tat
JOIN sys.dm_tran_session_transactions tst ON tat.transaction_id=tst.transaction_id
JOIN sys.dm_exec_sessions es ON tst.session_id=es.session_id 
CROSS APPLY sys.dm_exec_input_buffer(es.session_id, NULL) eib WHERE es.is_user_process = 1
ORDER BY tat.transaction_begin_time ASC

Screenshot: Startzeit und aktuelle Uhrzeit aller geöffneten Transaktionen