SQL Server Distributed Availability Group-Datenbanken werden nach einem Serverneustart nicht synchronisiert

22

Wir bereiten uns auf ein umfangreiches Upgrade unserer SQL Server vor und stellen ein ungewöhnliches Verhalten bei verteilten Verfügbarkeitsgruppen fest, das ich auflösen möchte, bevor ich fortfahre.

Letzten Monat habe ich einen Remote-Sekundärserver von SQL Server 2016 auf SQL Server 2017 aktualisiert. Dieser Server ist Teil mehrerer Distributed Availability Groups (DAGs) und einer separaten Availability Group (AG) . Als wir diesen Server aufgerüstet haben, war uns nicht bewusst, dass er in einen unlesbaren Zustand übergehen würde. Daher haben wir uns im letzten Monat ausschließlich auf den Primärserver verlassen.

Als Teil des bevorstehenden Upgrades habe ich den CU 4- Patch auf den Server angewendet und neu gestartet. Als der Server wieder online ging, zeigte der gerade gepatchte sekundäre Server, dass alle DAGs / AGs ohne Probleme synchronisiert wurden.

Die primäre zeigte jedoch eine ganz andere Geschichte. Es wurde berichtet, dass

  • Die separate AG wurde ohne Probleme synchronisiert
  • Die DAGs befanden sich jedoch in einem nicht synchronisierenden / nicht fehlerfreien Zustand

Nachdem ich anfänglich in Panik geraten war, habe ich versucht, die folgenden Dinge in den DAGs wieder zu synchronisieren:

  • Von der Grundschule aus habe ich angehalten und die Datenbewegung fortgesetzt. Die Daten wurden nicht synchronisiert.
  • Auf der sekundären (die ich gerade gepatcht habe) lief ich ALTER DATABASE [<database] SET HADR RESUME;- die ohne Fehler ausgeführt, aber keine Synchronisation wieder aufgenommen

Mein letzter Versuch, die Daten erneut zu synchronisieren, bestand darin, mich beim sekundären Server anzumelden und den SQL Server-Dienst manuell neu zu starten. Ein manueller Neustart des Dienstes scheint etwas extrem zu sein, da zu erwarten wäre, dass der neu gestartete Server ausreichen würde.

Ist jemand auf dieses Problem gestoßen, bei dem eine DAG nach einem Neustart nicht mit einer sekundären Synchronisierung beginnt? Wenn ja, wie wurde es gelöst?

Ich habe sowohl das SQL Server-Fehlerprotokoll als auch die Ereignisanzeige auf dem sekundären Server überprüft. Es gab nichts Außergewöhnliches, das ich sehen konnte.

Taryn
quelle
Ich habe SQL 2017 noch nie in der Produktion verwendet, aber unterstützt es AG zwischen niedrigeren SQL-Ebenen? In jeder anderen Version können Sie AlwaysOn zwischen verschiedenen Versionen einrichten. Wenn Sie jedoch die primäre Version neu starten und ein Failover auf eine höhere Version von SQL durchführen, wird der Synchronisierungsvorgang abgebrochen.
Alen

Antworten:

8

Bitte beachte, dass dies keine endgültige Antwort ist, aber es ist die beste Antwort, nachdem du mit Taryn gesprochen hast .

Die primäre zeigte jedoch eine ganz andere Geschichte. Es wurde berichtet, dass die separate AG ohne Probleme synchronisiert wurde, die DAGs sich jedoch in einem nicht synchronisierenden / nicht fehlerfreien Zustand befanden

Wenn die einzelnen Datenbanken und AGs, die der Distributed Ag zugrunde liegen, als fehlerfrei und synchron eingestuft werden, besteht eine gute Chance, dass dies nur ein Problem in den DMVs und / oder SSMS-Dashboards ist. Da im Fehlerprotokoll nichts darauf hindeutet, dass die Replik keine Verbindung hergestellt hat oder nicht verbunden ist.

Da das Problem behoben ist, ist es leider schwierig, genau zu sagen, was es war ... aber in Zukunft, wenn dies für jemanden eintritt:

  • Überprüfen Sie sys.dm_hadr_database_replica_states auf allen Clustern, um nach Fehlern zu suchen. Wenn alles in Ordnung ist, ist es möglich, dass die DMV noch nicht aktualisiert wurde
  • Ist dies nicht der Fall, überprüfen Sie das Fehlerprotokoll / die DMVs auf Konnektivitätsprobleme (z. B. dass keine Verbindung zur Weiterleitung / globalen Primärdatenbank hergestellt werden kann).
  • In der Antwort von Dan werden Probleme erwähnt, die beim Starten der Datenbank auftreten können. In diesem Fall kann die Instanz jedoch nicht gelesen werden, sodass dies höchstwahrscheinlich kein Problem darstellt, sondern in Ihrem Fall der Fall sein kann
  • Wenn die Datenbank lesbar ist, Rauchprobe mit Dummy-Tabelle / Insert oder ...
  • Erweiterte Ereignissitzung unter Verwendung der DEBUG-Kanalelemente sqlserver.hadr_dump_log_blockoder sqlserver.hadr_apply_log_blockum festzustellen, ob die sekundäre Instanz die Protokollblöcke tatsächlich empfängt / anwendet oder ...
  • Perfmon Objekt SQLServer:Database Replica\Log Bytes Received/sec

Wenn Sie Daten auf dieser Sekundärseite empfangen, die verteilte Ag jedoch weiterhin nicht synchronisiert oder nicht fehlerfrei ist, lasse ich sie eine Weile los, um festzustellen, ob sich die DMV-Werte ändern, da sie offensichtlich Protokollblöcke empfangen und verarbeiten.

Wenn dies jedoch nicht der Fall ist, müssen wir weitere Untersuchungen durchführen, die außerhalb des Antwortbereichs liegen.

Sean sagt Entfernen Sie Sara Chipps
quelle
4

Ich werde das alles mit dem Vorbehalt einleiten, dass ich keine DAGs in der Produktion habe. Grundsätzlich sollte dieser Rat sowohl zwischen AGs als auch zwischen DAGs gelten.

Wurde die Synchronisierung nach dem Neustart des Dienstes fortgesetzt? Wenn ja, dann würde meine beste Vermutung für die Ursache das Blockieren der Redo-SPID sein. Wenn es auch nach dem Neustart noch immer nicht synchronisiert wird, überprüfe ich zuerst Folgendes:

Blockierung von AG Redo SPID

Im Allgemeinen wird nur auf einer lesbaren sekundären auftreten. Führen Sie zum Überprüfen Folgendes aus:

select session_id, blocking_session_id, db_name(database_id), wait_type
from sys.dm_exec_requests
where command = 'DB STARTUP'

Wenn blockierende SPIDs angezeigt werden, müssen Sie sie beenden, bevor die sekundäre fortgesetzt werden kann (die DB STARTUPSPID übernimmt die Wiederherstellungsvorgänge). Ich würde vorschlagen, die blockierende SPID vorab zu überprüfen, um die Ursache zu ermitteln (normalerweise ein lang laufender Bericht).

Wenn Sie auf diesem weitere Informationen wünschen, gibt es einen großen Artikel (einschließlich für diese Art von Verhalten Überwachung XEs verwenden) hier .

Überprüfen Sie die DMVs

Wenn das Verschieben von Daten angehalten wird, können Sie sich an DMVs wenden, um weitere Informationen zum Grund für das Anhalten zu erhalten. Führen Sie Folgendes aus:

select db_name(database_id), synchronization_state_desc, database_state_desc, suspend_reason_desc
from sys.dm_hadr_database_replica_states

Der BOL-Artikel beschreibt den suspend_reason etwas weiter.

Dan
quelle
0

Ist Ihre Distributed Availability Group (DAG) auf verschiedene Regionen aufgeteilt? In diesem Fall könnte der Standardwert für SESSION_TIMEOUT (10 Sekunden) zu niedrig sein. Dies bedeutet, dass die Latenz zwischen den beiden Regionen zu hoch ist, um die Synchronisierung zuverlässig abzuschließen.

Für eine normale Verfügbarkeitsgruppe kann der Wert von SESSION_TIMEOUT erhöht werden, um die Synchronisierungssitzungen stabiler zu gestalten. Ich habe Ende letzten Jahres festgestellt, dass der Parameter SESSION_TIMEOUT der DAGs nicht bearbeitet werden konnte. Dies bedeutete, dass DAGs nur für Szenarien mit geringer Latenz geeignet waren. Wir haben ein Ticket bei Microsoft angemeldet und Anfang dieses Jahres wurde ein Hotfix veröffentlicht.

Verbesserung: Konfigurieren Sie den SESSION_TIMEOUT-Wert für ein Replikat einer verteilten Verfügbarkeitsgruppe in SQL Server 2016 und 2017

Nikos Kyriacou
quelle