Warum schlägt meine AWS-DMS-Aufgabe, die PostgreSQL als Quelle verwendet, fehl, obwohl alle Replikationsslots verwendet werden?

Lesedauer: 2 Minute
0

Ich habe eine AWS-Database-Migration-Service (AWS DMS)-Aufgabe, die einen Amazon Relational Database Service (Amazon RDS) für eine PostgreSQL-DB-Instance verwendet. Meine Aufgabe schlägt fehl, alle Replikationsslots sind belegt und ich erhalte eine Fehlermeldung.

Kurzbeschreibung

Für PostgreSQL-Instances von Amazon RDS verwendet AWS DMS systemeigene Replikationsslots, um die logische Replikation für Change Data Capture (Änderungsdatenerfassung, CDC) durchzuführen.

Die Anzahl der Replikationsslots, über die eine PostgreSQL-Instance verfügt, wird durch den Parametermax_replication_slotsgesteuert. Standardmäßig verfügt RDS für PostgreSQL-Instances über fünf Replikationsslots. Wenn Sie die maximale Anzahl von Replikationsslots überschreiten, werden Protokolleinträge wie diese angezeigt:

Nachrichten
[SOURCE_CAPTURE ]E: Failed (retcode -1) to execute statement [1022502] (ar_odbc_stmt.c:2579)
[SOURCE_CAPTURE ]E: RetCode: SQL_ERROR SqlState: 53400 NativeError: 1 Nachricht: ERROR: all replication slots are in use;

Um diese Fehler zu beheben, entfernen Sie die verwendeten Replikationsslots oder erhöhen Sie den Wert des Parametersmax_replication_slots.

Behebung

Verwendete Replikationsslots entfernen

Verwendete Replikationsslots belegen weiterhin Speicherplatz. Wenn Sie mehrere AWS-DMS-Aufgaben ausführen oder alte Aufgaben haben, die auf derselben DB-Instance ausgeführt werden, entfernen Sie die verwendeten Replikationsslots.

Identifizieren Sie zunächst die maximale Anzahl von Replikationsslots. Entfernen Sie dann die ungenutzten Replikationsslots.

Führen Sie die folgende Abfrage aus, um die maximale Anzahl von Replikationsslots zu überprüfen. Überprüfen die Spalteaktiv, um ungenutzte Replikationsslots zu identifizieren:

SELECT * FROM pg_replication_slots;
     slot_name    |    plugin     | slot_type | datoid | database | active |  xmin  | catalog_xmin | restart_lsn
 -----------------+---------------+-----------+--------+----------+--------+--------+--------------+-------------
old_and_used_slot | test_decoding | logical   |  12052 | postgres | f      |        |          684 | 0/16A4408

Hinweis: **aktiv: t (wahr)bedeutet, dass der Slot verwendet wird, undaktiv: f (falsch)**bedeutet, dass der Slot nicht verwendet wird.

Führen Sie diese Abfrage aus, um einen ungenutzten Replikationsslot zu entfernen:

SELECT pg_drop_replication_slot('old_and_used_slot');

Hinweis:Ersetzen Sieold_and_used_slotdurch den Namen Ihres Replikationsslots.

Nachdem Sie die ungenutzten Replikationsslots entfernt haben, starten Sie die Aufgabe erneut.

Erhöhen Sie den Wertes des Parameters max_replication_slots.

Ändern Sie den DB-Parameter in der benutzerdefinierten DB-Parametergruppe, die an die RDS-DB-Instance angehängt ist. Erhöhen Sie dann den Wert des Parametersmax_replication_slots. Dies ist ein statischer Parameter. Stellen Sie daher sicher, dass Sie dieDB-Instance neu starten, nachdem Sie den Parameterwert geändert haben. Starten Sie anschließend die Aufgabe erneut.

Ähnliche Informationen

Aktivierung von Change Data Capture (CDC) mithilfe logischer Replikation

Amazon RDS für PostgreSQL

Verwendung einer PostgreSQL-Datenbank als AWS-DMS-Quelle

Beispiele für logische Dekodierungauf der PostgreSQL-Website