Por que minha tarefa do AWS DMS que usa o PostgreSQL como fonte falha com todos os slots de replicação em uso?

3 minuto de leitura
0

Eu tenho uma tarefa do AWS Database Migration Service (AWS DMS) que usa uma instância de banco de dados do Amazon Relational Database Service (Amazon RDS) para PostgreSQL. Minha tarefa falha, todos os slots de replicação estão em uso e eu recebo uma mensagem de erro.

Breve descrição

Para instâncias do Amazon RDS para PostgreSQL, o AWS DMS usa slots de replicação nativos para executar a replicação lógica para a captura de dados de alteração (CDC).

O parâmetro max_replication_slots controla o número de slots de replicação de uma instância do PostgreSQL. Por padrão, as instâncias do RDS para PostgreSQL têm cinco slots de replicação. Se você exceder o número máximo de slots de replicação, verá entradas de log como estas:

Mensagens
[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 esses erros, remova os slots de replicação usados ou aumente o valor do parâmetro max_replication_slots.

Resolução

Remova os slots de replicação usados

Os slots de replicação usados continuam ocupando espaço. Se você executa várias tarefas do AWS DMS ou tem tarefas antigas que são executadas na mesma instância de banco de dados, remova os slots de replicação usados.

Primeiro, identifique o número máximo de slots de replicação. Em seguida, remova os slots de replicação não utilizados.

Para verificar o número máximo de slots de replicação, execute a consulta a seguir. Para identificar slots de replicação não utilizados, revise a coluna 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

Observação: active: t (verdadeiro) significa que o slot está em uso e active: f (falso) significa que o slot não está em uso.

Para remover um slot de replicação não utilizado, execute esta consulta:

SELECT pg_drop_replication_slot('old_and_used_slot');

Observação: substitua old_and_used_slot pelo nome do seu slot de replicação.

Depois de remover os slots de replicação não utilizados, reinicie a tarefa.

Aumente o valor do parâmetro max_replication_slots

Modifique o parâmetro de banco de dados no grupo de parâmetros de banco de dados personalizado que está anexado à instância de banco de dados do RDS. Depois, aumente o valor do parâmetro max_replication_slots. Esse é um parâmetro estático, então certifique-se de reinicializar a instância de banco de dados depois de alterar o valor do parâmetro. Em seguida, reinicie a tarefa.

Informações relacionadas

Activating change data capture (CDC) using logical replication

Amazon RDS para PostgreSQL

Using a PostgreSQL database as an AWS DMS source

Logical decoding examples no site do PostgreSQL