Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Use um slot de replicação para CDC

Última atualização: Oct 10, 2026

O PostgreSQL oferece suporte nativo para ativar o Change Data Capture (CDC) por meio de slots de replicação. Este tópico descreve como configurar o CDC em uma instância do ApsaraDB RDS for PostgreSQL.

Pré-requisitos

Observações de uso

  • Para usar este recurso, ative o CDC e consuma alterações de dados apenas na instância primária. Este recurso não é compatível com instâncias somente leitura.

  • O ApsaraDB RDS for PostgreSQL é compatível com o Logical Replication Slot Failover. Um failover entre primária e secundária não afeta o CDC. Para mais informações, consulte Logical Replication Slot Failover.

  • Antes de ativar o CDC, modifique um parâmetro da sua instância do ApsaraDB RDS for PostgreSQL. Essa ação reinicia a instância. Para evitar interrupções no service, execute essa operação em horários de baixa demanda.

  • Ao usar o CDC em uma instância do ApsaraDB RDS for PostgreSQL, observe o seguinte:

    • O CDC exige mais espaço de armazenamento para logs WAL. Se o consumo de dados for anormal ou parar, a instância não limpa os logs WAL automaticamente. Isso pode causar o acúmulo de logs até consumirem todo o espaço em disco disponível, bloqueando a instância. Uma instância bloqueada torna-se somente leitura e rejeita operações de gravação.

    • Manter linhas de dados antigas por um período prolongado pode causar um problema de wraparound de ID de transação e bloquear todas as operações de gravação na instância. O log de erros pode conter as seguintes mensagens:

      “HINT: Close open transactions soon to avoid wraparound problems. You might also need to commit or roll back old prepared transactions, or drop stale replication slots.”
      “WARNING: oldest xmin is far in the past.”

    Para limpar o espaço, exclua manualmente o slot de replicação para permitir que o kernel do PostgreSQL limpe automaticamente os logs WAL e as linhas de dados antigos. Para mais informações, consulte Desative o CDC.

    Nota

    Monitore regularmente o tamanho do log WAL e o uso de espaço em disco da sua instância. Para acompanhar o desempenho, visualize os dados de monitoramento e, para configurar alertas, gerencie as regras relevantes. Para mais informações, consulte Visualize os dados do Enhanced Monitoring e Gerencie as regras de alerta.

Ative o CDC

Etapa 1: crie um banco de dados de teste

  1. Para começar, acesse a página Instâncias. Na barra de navegação superior, selecione a região da instância RDS. Em seguida, encontre a instância RDS e clique em seu ID.

  2. No painel de navegação à esquerda, escolha Databases.

  3. Em seguida, clique em Create Database. Após criar o banco de dados testdb, o status dele muda para Em execução e o conjunto de caracteres passa a ser UTF8.

    Nota

    Neste exemplo, usamos um banco de dados chamado testdb. Para instruções detalhadas, consulte Crie um banco de dados.

Etapa 2: crie contas de teste e configure permissões

  1. No painel de navegação à esquerda, escolha Accounts.

  2. Em seguida, clique em Create Account para criar uma conta privilegiada (db_admin) e uma conta padrão para o CDC (cdc_user).

    Nota

    Os nomes de conta usados neste tópico são apenas para fins de demonstração. Especifique nomes personalizados. Para mais informações sobre como criar uma conta, consulte Crie uma conta.

  3. Use a conta db_admin para se conectar à instância do ApsaraDB RDS for PostgreSQL.

    psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdb
    Nota

    Para mais informações sobre como obter o endpoint de uma instância, consulte Visualize ou altere o endpoint e o número da porta.

  4. Para adicionar a conta cdc_user à função de replicação, execute o seguinte comando:

    ALTER USER cdc_user WITH REPLICATION;

    Para verificar o resultado, execute o seguinte comando:

    SELECT rolreplication FROM  pg_roles WHERE rolname='cdc_user';

    Saída de exemplo:

     rolreplication
    ----------------
     t
    (1 row)
  5. Para conceder permissões à conta cdc_user, execute o seguinte comando:

    GRANT SELECT ON ALL TABLES IN SCHEMA PUBLIC to cdc_user;

Etapa 3: modifique os parâmetros da instância

  1. Para consultar as configurações atuais dos parâmetros, execute o seguinte comando:

    SELECT name,
           setting,
           short_desc,
           source
    FROM pg_settings
    WHERE name ='wal_level';

    Saída de exemplo:

             name          | setting |                               short_desc                                |       source
    -----------------------+---------+-------------------------------------------------------------------------+--------------------
     wal_level             | replica | Sets the level of information written to the WAL.                       | configuration file
    (1 rows)

    O parâmetro wal_level controla a quantidade de informações que o PostgreSQL grava no log WAL. O valor padrão é replica e você só pode definir esse parâmetro na inicialização do servidor. Valores válidos:

    • minimal: Grava apenas as informações necessárias para recuperação após uma falha ou um desligamento imediato. Nesse nível, você não pode restaurar um banco de dados a partir de um backup de base e logs WAL.

    • replica: Grava informações suficientes para oferecer suporte ao arquivamento e à replicação de WAL, incluindo a execução de consultas somente leitura em um servidor em espera.

    • logical: Adiciona informações necessárias para a decodificação lógica.

  2. Para começar, acesse a página Instâncias. Na barra de navegação superior, selecione a região da instância RDS. Em seguida, encontre a instância RDS e clique em seu ID.

  3. No painel de navegação à esquerda, escolha Parameters.

  4. Para alterar o nível, defina o parâmetro wal_level como logical.

    Nota

Etapa 4: crie um slot de replicação lógica

Nota

A modificação de parâmetro em Etapa 3 reinicia sua instância do ApsaraDB RDS for PostgreSQL. Prossiga com esta etapa somente após a instância reiniciar e seu status ser Em execução.

  1. Use a conta db_admin para se conectar à instância do ApsaraDB RDS for PostgreSQL.

    psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdb
  2. Para criar um slot de replicação chamado cdc_replication_slot usando o plugin de saída test_decoding, execute o seguinte comando:

    SELECT pg_create_logical_replication_slot('cdc_replication_slot', 'test_decoding');
    Nota
    • O nome do slot cdc_replication_slot é apenas para fins de demonstração. Especifique um nome personalizado.

    • O PostgreSQL fornece o plugin de saída test_decoding nativamente, portanto, não requer alterações.

    Saída de exemplo:

     pg_create_logical_replication_slot
    ------------------------------------
     (cdc_replication_slot,1/14003428)
    (1 row)

    Para verificar a criação do slot, execute o seguinte comando:

    SELECT * FROM pg_replication_slots;

    Saída de exemplo:

          slot_name       |    plugin     | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size  | two_phase
    ----------------------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+----------------+-----------
     cdc_replication_slot | test_decoding | logical   |  18822 | testdb   | f         | f      |            |      |        22356 | 1/140033F0  | 1/14003428          | reserved   |                | f
    (1 row)

Etapa 5: crie dados de teste

Para criar dados de teste e simular um ambiente de produção, execute os seguintes comandos:

CREATE TABLE public.tb_test(
    id int NOT NULL PRIMARY KEY
);
ALTER TABLE public.tb_test ADD name varchar(1) NULL;
INSERT INTO public.tb_test SELECT 1, 'A';

Etapa 6: leia dados do slot

  1. Use a conta cdc_user para se conectar à instância do ApsaraDB RDS for PostgreSQL.

    psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U cdc_user -d testdb
  2. Para ler as alterações do slot de replicação, execute o seguinte comando:

    SELECT * FROM pg_logical_slot_peek_changes('cdc_replication_slot', null, null);

    Saída de exemplo:

        lsn     |  xid  |                                  data
    ------------+-------+-------------------------------------------------------------------------
     1/14003D90 | 22376 | BEGIN 22376
     1/1401DDE8 | 22376 | COMMIT 22376
     1/1401DDE8 | 22377 | BEGIN 22377
     1/1401E100 | 22377 | COMMIT 22377
     1/1401E2A8 | 22382 | BEGIN 22382
     1/1401E2A8 | 22382 | table public.tb_test: INSERT: id[integer]:1 name[character varying]:'A'
     1/1401E3C0 | 22382 | COMMIT 22382
    (7 rows)

Etapa 7: consuma alterações de dados

  1. Para sair da conexão do banco de dados, execute o comando \q.

  2. Para consumir as alterações de dados, execute o seguinte comando:

    Nota

    Execute o comando pg_recvlogical como o usuário postgres. Troque de usuário executando o comando su - postgres. Se você encontrar o erro -bash: pg_recvlogical: command not found, consulte a seção Perguntas frequentes para obter uma solução.

    pg_recvlogical -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -U <privileged account> -d <test database> --create-slot --if-not-exists --slot=cdc_replication_slot --plugin=test_decoding --start -f -

    Exemplo de comando:

    pg_recvlogical -h pgm-*****.pgsql.singapore.rds.aliyuncs.com -U db_admin -d testdb --create-slot --if-not-exists --slot=cdc_replication_slot --plugin=test_decoding --start -f -

    Saída de exemplo:

    BEGIN 22376
    COMMIT 22376
    BEGIN 22377
    COMMIT 22377
    BEGIN 22382
    table public.tb_test: INSERT: id[integer]:1 name[character varying]:'A'
    COMMIT 22382

Desativar o CDC

Se o consumo de dados for anormal ou parar, os logs WAL podem se acumular e consumir todo o espaço em disco disponível, bloqueando a instância eventualmente. Para resolver isso, exclua manualmente os slots de replicação inativos. Essa ação permite ao kernel do PostgreSQL limpar os logs WAL antigos.

Exclua slots de replicação inativos no console, por meio de uma chamada de API ou executando um comando SQL:

  • No console: Gerencie os logs WAL.

  • Pela API: Exclua o slot.

  • Por comando SQL:

    1. Use a conta db_admin para se conectar à instância do ApsaraDB RDS for PostgreSQL.

      psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdb
    2. Para visualizar os nomes e as informações sobre os slots inativos, execute o seguinte comando:

      SELECT slot_name, slot_type, database, active, safe_wal_size
      FROM pg_replication_slots
      WHERE active = 'f';

      Saída de exemplo:

            slot_name       | slot_type | database | active | safe_wal_size
      ----------------------+-----------+----------+--------+---------------
       cdc_replication_slot | logical   | testdb   | f      |
      (1 row)
    3. Para excluir o slot de replicação lógica, execute o seguinte comando:

      SELECT pg_drop_replication_slot('cdc_replication_slot');

Perguntas frequentes

  • P: O que fazer ao receber o erro -bash: pg_recvlogical: command not found ao consumir dados?

    R: O pg_recvlogical é uma ferramenta nativa de decodificação lógica para PostgreSQL que usa o plugin de saída padrão test_decoding. Esse plugin está no diretório contrib/test_decoding do pacote de código-fonte do PostgreSQL. Compile e instale o PostgreSQL a partir do código-fonte. Após a instalação, a ferramenta pg_recvlogical estará no diretório /bin do caminho de instalação do cliente. Para mais informações sobre como instalar o PostgreSQL a partir do código-fonte, consulte Instale a partir do código-fonte.

  • P: Excluí manualmente um slot de replicação, mas o sistema não limpou automaticamente os logs WAL e eles ainda estão consumindo espaço em disco. O que fazer?

    R: Altere o parâmetro wal_keep_segments para o valor padrão de 128 para reduzir o número de arquivos de log retidos. Para mais informações sobre como modificar os parâmetros da instância, consulte Modifique os parâmetros de uma instância do ApsaraDB RDS for PostgreSQL.