¿Por qué la tarea de AWS DMS que utiliza PostgreSQL como origen falla con todas las ranuras de replicación en uso?

3 minutos de lectura
0

Tengo una tarea de AWS Database Migration Service (AWS DMS) que utiliza una instancia de base de datos de Amazon Relational Database Service (Amazon RDS) para PostgreSQL. La tarea falla, todas las ranuras de replicación están en uso y se muestra un mensaje de error.

Breve descripción

En el caso de las instancias de Amazon RDS para PostgreSQL, AWS DMS utiliza ranuras de replicación nativas para realizar la replicación lógica para la captura de datos de cambio (CDC).

El número de ranuras de replicación que tiene una instancia de PostgreSQL se controla mediante el parámetro max_replication_slots. De forma predeterminada, hay cinco ranuras de replicación para las instancias de RDS para PostgreSQL. Si supera el número máximo de ranuras de replicación, verá entradas de registro como las siguientes:

Mensajes
[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 Message: ERROR: all replication slots are in use;

Para solucionar estos errores, elimine las ranuras de replicación utilizadas o aumente el valor del parámetro max_replication_slots.

Solución

Eliminación de ranuras de replicación utilizadas

Las ranuras de replicación utilizadas siguen ocupando espacio. Si ejecuta varias tareas de AWS DMS o tiene tareas antiguas ejecutándose en la misma instancia de base de datos, elimine las ranuras de replicación utilizadas.

Primero, averigüe cuál es el número máximo de ranuras de replicación. A continuación, elimine las ranuras de replicación no utilizadas.

Ejecute la siguiente consulta para comprobar el número máximo de ranuras de replicación. Para ver cuáles son las ranuras de replicación no utilizadas, consulte la columna 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

Nota: active: t (true) significa que la ranura está en uso, mientras que active: f (false) significa que la ranura no está en uso.

Para eliminar una ranura de replicación no utilizada, ejecute esta consulta:

SELECT pg_drop_replication_slot('old_and_used_slot');

Nota: Reemplace old_and_used_slot por el nombre de su ranura de replicación.

Una vez eliminadas las ranuras de replicación no utilizadas, reinicie la tarea.

Aumento del valor del parámetro max_replication_slots

Modifique el parámetro de base de datos en el grupo de parámetros de base de datos personalizados asociado a la instancia de base de datos de RDS. A continuación, aumente el valor del parámetro max_replication_slots. Se trata de un parámetro estático, así que asegúrese de reiniciar la instancia de base de datos después de cambiar su valor. A continuación, reinicie la tarea.

Información relacionada

Activating change data capture (CDC) using logical replication

Amazon RDS para PostgreSQL

Using a PostgreSQL database as an AWS DMS source

Logical Decoding Examples en el sitio web de PostgreSQL