Wenn CDC für meine AWS DMS-Aufgabe aktiviert ist, wie gehe ich dann mit T-Log-Fehlern auf meiner RDS for SQL Server-Quelle um?

Letzte Aktualisierung: 30.08.2022

Ich habe eine AWS Database Migration Service (AWS DMS)-Aufgabe, bei der die Change Data Capture (CDC) aktiviert ist. Meine Aufgabe verwendet Amazon Relational Database Service (Amazon RDS) für SQL Server als Quelle. Bei meiner AWS DMS-Aufgabe treten Probleme mit einem vollen T-Protokoll mit SQL Server auf. Wie kann ich diese Probleme beheben, wenn CDC für meine AWS DMS-Aufgabe aktiviert ist?

Kurzbeschreibung

Wenn Sie SQL Server als Quelle für eine AWS-DMS-Aufgabe verwenden, können Sie laufende Änderungen replizieren, indem Sie MS Change Data Capture (CDC) auf Ihren Instances aktivieren. Sie können MS CDC für Amazon RDS für MySQL, On-Premises-SQL und Amazon Elastic Compute Cloud (Amazon EC2)-Instances verwenden.

Nachdem CDC eingeschaltet wurde, verfolgt und liest es mit der Funktion fn_dblog() laufende DML-Änderungen aus der aktiven Protokolldatei. CDC erstellt für jede Quelltabelle eine entsprechende CDC-Änderungstabelle.

Um Änderungen nachzuverfolgen, erstellt CDC zwei Aufträge:

  • Erfassungsauftrag – Liest T-Protokolle, erfasst und zeichnet dann Änderungen in der entsprechenden Änderungsverfolgungstabelle mit der sp_replcmds Speicherprozedur auf.
  • Bereinigungsauftrag – Bereinigt die Änderungsverfolgung basierend auf der Aufbewahrungsrichtlinie.

Führen Sie die folgende Speicherprozedur aus, um den für diese Einstellungen festgelegten Wert anzuzeigen:

EXEC sys.sp_cdc_help_jobs
  • Maxtrans – Die maximale Anzahl von Transaktionen, die in jedem Scanzyklus verarbeitet werden sollen.
  • Maxscans – Die maximale Anzahl von Scanzyklen, die ausgeführt werden, um alle Zeilen aus dem Protokoll zu extrahieren.
  • Pollingintervall – Die Anzahl der Sekunden zwischen den Protokollierungszyklen.

Auf Amazon RDS führt SQL Server alle 5 Minuten Protokollsicherungen durch. Diese Backups werden an Amazon Simple Storage Service (Amazon S3) übertragen. SQL Server schneidet die Protokolle bis zum letzten min. LSN ab. Wenn das aktive Protokoll abgeschnitten wird, während AWS DMS in einem nahen Bereich des aktiven Protokolle liest, werden beim nächsten Aufruf von fn_dblog möglicherweise Änderungen übersehen. Die Aufgabe schlägt fehl, weil mit fn_dump_dblog aus Amazon S3 nicht auf Protokolle zugegriffen werden kann.

Um solche Probleme zu vermeiden, verfügt AWS DMS über die Optionen „Safeguard traction“ und „pollingInterval“:

  • Safeguard traction: AWS DMS erstellt in der Quelldatenbank eine Tabelle mit dem Namen Awsdms_trucatcation safeguard. Awsdms_trucatcation öffnet zwei Safeguard-Transaktionen und führt dann alternativ alle fünf Minuten eine Dummy-Aktualisierungsanweisung aus. Das bedeutet, dass SQL die Protokolle 10 Minuten lang nicht kürzt.

Wenn AWS DMS das Lesen der Protokolle jedoch um mehr als 10 Minuten verzögert, schlägt die Aufgabe erneut fehl. Um dies zu vermeiden, verwenden Sie den pollingInterval-Parameter. Weitere Informationen finden Sie unter Verwenden einer Microsoft SQL Server-Datenbank als AWS-DMS-Quelle.

  • pollingInterval: Der Standardwert des Abfrageintervalls ist für Erfassungsaufträge auf 5 Sekunden festgelegt. Das bedeutet, dass pollingInterval alle 5 Sekunden ausgeführt wird, das T-Protokoll nach Änderungen durchsucht und diese Protokolle als repliziert markiert. Dann schneidet es die Protokolle ab.

Es empfiehlt sich, den pollingInterval-Wert auf >=3599 zu setzen. Das bedeutet, dass Erfassungsaufträge nicht so häufig ausgeführt werden dürfen, und stellt sicher, dass T-Protokolle für einen bestimmten Zeitraum nicht gekürzt werden.

Eine stark transaktionale Datenbank kann jedoch zum Staus eines vollen T-Protokolle führen, und die Aufgabe schlägt mit einem Fehler ähnlich dem folgenden fehl:

E: RetCode: SQL_ERROR SqlState: 42000 NativeError: 9002 Message: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The transaction
log for database ‘yourdatabase' is full due to 'REPLICATION'

Lösung

Problembehandlung und Behebung von Problemen mit vollen SQL-Server-T-Protokollen bei eingeschaltetem CDC

Gehen Sie wie folgt vor, um ein Problem mit vollen SQL-Server-T-Protokollen bei eingeschaltetem CDC zu beheben.

1.    Überprüfen Sie die Größe Ihrer Transaktionsprotokolldateien:

DBCC SQLPERF(logspace)

2.    Wenn das Transaktionsprotokoll voll ist, führen Sie diesen Befehl aus, um zu sehen, was die Protokolle belastet:

select name, log_reuse_wait_desc from sys.databases where name = ' db_name '
  • Replication: Die Replikation funktioniert nicht mehr oder liest keine aktiven Transaktionen.
  • Active_transaction: Es gibt eine offene Transaktion.

Wenn es eine aktive Transaktion gibt, überprüfen Sie die Liste der offenen Transaktionen:

select * from sys.sysprocesses where open_tran=1

Hinweis: Es ist nicht möglich, das T-Protokoll einer Datenbank zu verkleinern, bei der CDC aktiviert ist, wenn sich die AWS DMS-Aufgabe im Status „ausgeführt“ befindet. Beenden Sie stattdessen die Aufgabe und warten Sie, bis die Transaktionsprotokolle durch die Protokollsicherung gekürzt werden. Verkleinern Sie dann das T-Protokoll der Datenbank.

Schrumpfen Sie die T-Protokolldateien und STARTEN Sie die Aufgabe NEU

Nachdem die Protokolle bereinigt wurden, verkleinern Sie die T-Protokolldateien und STARTEN Sie die Aufgabe NEU:

1.    Beenden Sie die Aufgabe.

2.    Überprüfen Sie den Status von CDC, und schalten Sie CDC dann aus.

Überprüfen Sie den Status von CDC:

select b.name,a.run_date,a.run_status from msdb.dbo.sysjobhistory as a
join msdb.dbo.sysjobs as b on a.job_id=b.job_id
where b.name like '%cdc%capture%';

Deaktivieren Sie CDC auf Datenbankebene:

exec msdb.dbo.rds_cdc_disable_db '<db_name>'

Suchen Sie Tabellen, die zu CDC gehören:

USE db_name
GO
SELECT s.name AS Schema_Name, tb.name AS Table_Name
, tb.object_id, tb.type, tb.type_desc, tb.is_tracked_by_cdc
FROM sys.tables tb
INNER JOIN sys.schemas s on s.schema_id = tb.schema_id
WHERE tb.is_tracked_by_cdc = 1

CDC auf Tabellenebene ausschalten:

use <db_name>
EXEC sys.sp_cdc_disable_table
@source_schema = N'<schema>',
@source_name   = N'<table>',
@capture_instance = N'<schema_table>'

3.    Bestätigen Sie, ob CDC ausgeschaltet ist:

select is_cdc_enabled, * from sys.databases where name = 'dbname' Value 1- enabled   and 0 -Disabled

4.    Warten Sie nach dem Ausschalten von CDC mindestens 10 Minuten und verkleinern Sie dann Ihre T-Protokolle:

use <dbname>
SELECT file_id, name
FROM sys.database_files;
GO

USE <dbname>
GO
DBCC SHRINKFILE (N'dbname_log' , 0, TRUNCATEONLY)
GO

5.    Bestätigen Sie die Größe der Protokolle:

DBCC SQLPERF(logspace)

6.    Schalten Sie CDC erneut ein, und starten Sie die Aufgabe erneut. Die Wiederaufnahme der Aufgabe kann zu fehlenden Transaktionen führen. Der Zugriff auf das archivierte T-Protokoll wird für Amazon RDS für SQLServer nicht unterstützt.