Pourquoi ma tâche AWS DMS qui utilise PostgreSQL comme source échoue-t-elle alors que tous les slots de réplication sont en cours d'utilisation ?

Lecture de 3 minute(s)
0

Je possède une tâche AWS Database Migration Service (AWS DMS) qui utilise une instance de base de données Amazon Relational Database Service (Amazon RDS) for PostgreSQL. Ma tâche échoue, tous les slots de réplication sont en cours d'utilisation et je reçois un message d'erreur.

Brève description

Pour les instances Amazon RDS for PostgreSQL, AWS DMS utilise des slots de réplication natifs afin d'effectuer la réplication logique pour la capture de données modifiées (CDC).

Le paramètre max_replication_slots contrôle le nombre d'slots de réplication à la disposition d'une instance PostgreSQL. Par défaut, les instances RDS for PostgreSQL ont cinq slots de réplication. Si vous dépassez le nombre maximal d'slots de réplication, des entrées de journal semblables à celles-ci s'affichent :

Messages
[SOURCE_CAPTURE ]E: Échec (retcode -1) de l'exécution de l'instruction [1022502] (ar_odbc_stmt.c:2579)
[SOURCE_CAPTURE ]E: RetCode: SQL_ERROR SqlState: 53400 NativeError: 1 Message: ERREUR : tous les slots de réplication sont en cours d'utilisation ;

Pour corriger ces erreurs, supprimez les slots de réplication utilisés ou augmentez la valeur du paramètre max_replication_slots.

Résolution

Supprimer les slots de réplication utilisés

Les slots de réplication utilisés continuent d'occuper de l'espace. Si vous exécutez plusieurs tâches AWS DMS ou si d'anciennes tâches s'exécutent sur la même instance de base de données, supprimez les slots de réplication utilisés.

Commencez par identifier le nombre maximal d'slots de réplication. Supprimez ensuite les slots de réplication non utilisés.

Pour vérifier le nombre maximal d'slots de réplication, exécutez la requête suivante. Pour identifier les slots de réplication non utilisés, passez en revue la colonne active :

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

Remarque : la valeur active: t (true) signifie que l'slot est en cours d'utilisation, et la valeur active: f (false) signifie le contraire.

Pour supprimer un slot de réplication inutilisé, exécutez cette requête :

SELECT pg_drop_replication_slot('old_and_used_slot');

Remarque : remplacez old_and_used_slot par le nom de votre slot de réplication.

Après avoir supprimé les slots de réplication non utilisés, redémarrez la tâche.

Augmenter la valeur du paramètre max_replication_slots

Modifiez le paramètre de base de données dans le groupe de paramètres de base de données personnalisé attaché à l'instance de base de données RDS. Augmentez ensuite la valeur du paramètre max_replication_slots. Dans la mesure où il s'agit d'un paramètre statique, vous devez veiller à redémarrer l'instance de base de données après avoir modifié la valeur de paramètre. Redémarrez ensuite la tâche.

Informations connexes

Activation de la capture de données modifiées (CDC) à l'aide de la réplication logique

Amazon RDS for PostgreSQL

Utilisation d'une base de données PostgreSQL comme source AWS DMS

Exemples de décodage logique sur le site Web PostgreSQL