Ich habe solche Datenbanksysteme geerbt. Derzeit habe ich eine Publisher-Datenbank im SQL Server 2005-Kompatibilitätsmodus unter Windows Server 2008 R2 mit SQL Server 2008R2 SP2. Der Verteiler befindet sich auf demselben Computer. Der Abonnent ist 2008R2 SP2 und die Datenbank befindet sich im SQL Server 2008-Kompatibilitätsmodus. Wir verwenden die Transaktionsreplikation. Die Isolationsstufe ist Read Committed. Der Distributor befindet sich auf dem Publisher. Auch wenn ich mit der rechten Maustaste auf Veröffentlichung klicke und das Abonnement als Pull-Abonnement angezeigt wird, spielt es meiner Meinung nach keine Rolle, da der Distributor beim Herausgeber selbst liegt. Bitte korrigieren Sie mich, wenn ich falsch liege. Das Speichersystem ist IBM Flex, das von fünf Servern einschließlich Herausgeber und Abonnent gemeinsam genutzt wird.
Seit ein paar Tagen sehe ich eine Latenz von wenigen Stunden, sie holt morgens auf und steigt nachmittags wieder an. Ich folgte https://www.mssqltips.com/sqlservertip/3598/troubleshooter-transactional-replication-latency-issues-in-sql-server/ , um genau zu sehen, was geschah. Ich habe folgende Abfrage ausgeführt.
USE distribution
go
EXEC Sp_browsereplcmds
@xact_seqno_start = '<seq#>' -- seq# is same for start and end
,@xact_seqno_end = '<seq#>'
,@publisher_database_id = <publisher database id --this is different than database_id
Ich sehe, dass an einigen Tabellen, die an der Replikation beteiligt sind, angeblich massive Aktualisierungen durchgeführt werden und der Protokollleser nur das Transaktionsprotokoll scannt und erst nach Abschluss der Transaktion etwas replizieren kann. Interessanterweise kann ich weder beim Herausgeber noch beim Abonnenten eine Blockierung feststellen. Hilft es hier, die Isolationsstufe auf RCSI (Read Committed Snapshot Isolation) zu ändern? Hilft es, das Abfrageintervall auf 1 und die Lesestapelgröße auf 1000 oder 5000 zu ändern? Wie lautet der Befehl zum Ändern dieser Einstellung?
Ich habe das Standardprofil des Log Reader Agent wie folgt geändert. Abfrageintervall von 5 bis 1 und ReadBatchSize bis 5000. Dies führte fast sofort zu einer Latenz von 13 Stunden auf Null. Aber ich sehe, dass es wieder 13 Stunden waren.
Die Replikation ist synchron und ich habe keinen einzigen Hinweis auf die eigentliche Grundursache, die die Latenz verursacht hat, und jetzt ist sie verschwunden.
Dies ist keine einfache Änderung und bringt eine zusätzliche Tempdb-Strafe mit sich. Ich würde Ihnen nicht empfehlen , nur die Isolationsstufe auf RCSI zu ändern, ohne die Vorteile in Ihrer Umgebung ordnungsgemäß zu testen und zu sehen. Vertrauen Sie mir, dies ist ein Vorschlaghammer-Ansatz.
Wir sind kürzlich auf dasselbe Problem gestoßen
Im Folgenden habe ich das Problem behoben:
Artikel als BATCHED replizieren lassen (Diese Änderung ist dynamisch und erfordert keine Neuinitialisierung ) :
@status
Werts erfolgen. Jeder Wert unter 16 gibt an, dass die Replikation mit TSQL ==> NOT Batched erfolgt!Selbst wenn 1 Artikel nicht auf BATCH eingestellt ist, wird keiner der Artikel BATCHED, wenn Änderungen am Abonnenten vorgenommen werden.
Verwenden Sie unter TSQL
Erstellt einen nicht clusted Index für die Verteilungsdatenbank:
Weitere Informationen zur Optimierung finden Sie unter Verbessern der Transaktionsreplikationsleistung, insbesondere unter Parameter des Verteilungsagenten und des Protokollleseragenten.
Unten ist das Skript, mit dem ich den T-Rep-Replikationsstatus finde:
quelle