Wie kann ich Probleme mit „T-Log full“ in meiner RDS für SQL Server-Quelle beheben, wenn CDC für meine AWS DMS-Aufgabe aktiviert ist?

Lesedauer: 5 Minute
0

Ich habe eine AWS Database Migration Service (AWS DMS)-Aufgabe, in der Change Data Capture (CDC) aktiviert ist. Meine Aufgabe verwendet Amazon Relational Database Service (Amazon RDS) für SQL Server als Quelle. Ich sehe bei meiner AWS DMS-Aufgabe Probleme mit der Meldung „SQL Server T-Log full“.

Kurzbeschreibung

Wenn Sie SQL Server als Quelle für AWS DMS-Aufgaben verwenden, aktivieren Sie MS Change Data Capture (CDC) auf Ihren Instances, um Änderungen zu replizieren. Sie können MS CDC für Amazon RDS SQL Server, lokale SQL Server und SQL Server auf Amazon Elastic Compute Cloud (Amazon EC2)-Instances verwenden.

Nachdem Sie CDC aktiviert haben, verwendet es die Funktion fn_dblog(), um laufende DML-Änderungen aus der aktiven Protokolldatei zu verfolgen und zu lesen. Für jede Quelltabelle erstellt CDC eine entsprechende CDC-Änderungstabelle.

CDC erstellt zwei Aufträge, um Änderungen zu verfolgen:

  • Erfassungsauftrag: Scannt T-Logs und verwendet dann die Speicherprozedur sp_replcmds, um Änderungen in der entsprechenden Änderungstabelle zu erfassen und aufzuzeichnen.
  • Bereinigungsauftrag: Bereinigt die Änderungsverfolgung auf der Grundlage der Aufbewahrungsrichtlinie.

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

EXEC sys.sp_cdc_help_jobs
  • Maxtrans: Die maximale Anzahl der Transaktionen, die in jedem Scanzyklus verarbeitet werden sollen.
  • Maxscans: Die maximale Anzahl der Scanzyklen, die ausgeführt werden müssen, damit alle Zeilen aus dem Protokoll extrahiert werden können.
  • Pollinginterval: Die Anzahl der Sekunden zwischen den Log-Scan-Zyklen.

Bei Amazon RDS für SQL Server werden standardmäßig alle 5 Minuten Sicherungen des Transaktionsprotokolls erstellt. Während der Sicherung des Transaktionsprotokolls kürzt SQL Server den inaktiven Teil des Transaktionsprotokolls. Dieser Teil enthält Protokollsequenznummern (Log Sequence Numbers; LSN), die AWS DMS nicht gelesen hat. Daher findet AWS DMS möglicherweise die erforderlichen LSNs für die Replikation der gewünschten Datenänderungen nicht.

Um dieses Problem zu vermeiden, verfügt AWS DMS über die Optionen awsdms_truncation_safeguard und pollingInterval.

awsdms_truncation_safeguard: AWS DMS erstellt in der Quelldatenbank eine Tabelle mit dem Namen awsdms_truncation_safeguard. Diese Tabelle verhindert das Kürzen des Transaktionsprotokolls, indem sie eine Transaktion in der Datenbank nachahmt.

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

**pollingInterval:**Der Standardwert ist für Erfassungsaufträge auf 5 Sekunden festgelegt. Das bedeutet, dass pollingInterval alle 5 Sekunden ausgeführt wird, T-Log auf Änderungen durchsucht und diese Protokolle dann als repliziert markiert werden. Dann kürzt es die Protokolle.

Es hat sich bewährt, den pollingInterval-Wert auf >=3599 festzulegen. Dadurch wird verhindert, dass Erfassungsaufträge zu häufig ausgeführt werden. Außerdem werden die T-Logs so konfiguriert, dass sie nicht für einen bestimmten Zeitraum gekürzt werden.

Eine Datenbank mit vielen Transaktionen kann zu einem T-Log-Full-Status führen. Die Aufgabe schlägt dann mit einem Fehler wie 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'

Behebung

**Hinweis:**Wenn Sie beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehler erhalten, stellen Sie sicher, dass Sie die neueste AWS CLI-Version verwenden.

Probleme vom Typ „SQL Server T-Log full“ beheben und lösen, wenn CDC aktiviert ist

Gehen Sie folgendermaßen vor, um Probleme vom Typ „SQL Server T-Log full“ zu beheben und zu lösen, wenn CDC aktiviert ist.

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

DBCC SQLPERF(logspace)

2.    Wenn das Transaktionsprotokoll voll ist, führen Sie den folgenden Befehl aus, um den Inhalt des Protokolls zu sehen:

select name, log\_reuse\_wait\_desc from sys.databases where name = ' db\_name '
  • **Replikation:**Die Replikation funktioniert nicht mehr oder liest keine aktiven Transaktionen.
  • **Active_transaction:**Eine Transaktion ist offen.

Wenn eine Transaktion aktiv ist, überprüfen Sie die Liste der offenen Transaktionen:

select \* from sys.sysprocesses where open\_tran=1

**Hinweis:**Wenn AWS DMS ausgeführt wird, können Sie das T-Log einer Datenbank, in der CDC aktiviert ist, nicht verkleinern. Beenden Sie stattdessen die Aufgabe und warten Sie dann, bis die Protokollsicherung die Transaktionsprotokolle kürzt. Verkleinern Sie dann das T-Log der Datenbank.

T-Log-Dateien verkleinern und die Aufgabe NEU STARTEN

Nach dem Bereinigen der Protokolle verkleinern Sie die T-Log-Dateien und starten 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%';

Schalten Sie CDC auf Datenbankebene aus:

exec msdb.dbo.rds_cdc_disable_db '<db_name>'

Suchen Sie nach Tabellen, die Teil von CDC sind:

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

Schalten Sie CDC auf Tabellenebene aus:

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

3.    Stellen Sie sicher, dass CDC ausgeschaltet ist:

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

4.    Nachdem Sie bestätigt haben, dass CDS ausgeschaltet ist, warten Sie mindestens 10 Minuten und verkleinern Sie dann Ihre T-Logs:

use <dbname>
SELECT file_id, name
FROM sys.database_files;
GO
USE <dbname>
GO
DBCC SHRINKFILE (N'dbname_log' , 0, TRUNCATEONLY)
GO

5.    Überprüfen Sie die Größe der Protokolle:

DBCC SQLPERF(logspace)

6.    Schalten Sie CDC wieder ein und starten Sie die Aufgabe erneut. Die Wiederaufnahme der Aufgabe kann zu fehlenden Transaktionen führen. Amazon RDS für SQL Server unterstützt den Zugriff auf das archivierte T-Log nicht.

Ähnliche Informationen

Voraussetzungen für die Verwendung der fortlaufenden Replikation (CDC) aus einer SQL Server-Quelle

Empfohlene Einstellungen für die Verwendung von Amazon RDS für SQL Server als Quelle für AWS DMS

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr