Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Use the logical subscription feature

Última atualização: Jun 26, 2026

A assinatura lógica permite a sincronização unidirecional, em nível de tabela e quase em tempo real, entre instâncias do ApsaraDB RDS for PostgreSQL. Utilize esse recurso para compartilhar dados entre regiões, consolidar informações de várias fontes em um banco de dados central ou distribuir dados por bancos de dados distintos.

Pré-requisitos

Antes de começar, certifique-se de que você possui:

  • Uma instância do ApsaraDB RDS for PostgreSQL executando PostgreSQL 10 ou superior com discos em nuvem

  • O parâmetro wal_level definido como logical na instância publicadora — reconfigure-o na página Parameters no console do ApsaraDB RDS e reinicie a instância para que a alteração tenha efeito

  • (Para assinaturas entre instâncias) O bloco CIDR da Virtual Private Cloud (VPC) adicionado à lista de permissões de endereços IP de ambas as instâncias — por exemplo, adicione 172.16.0.0/16. Para mais detalhes, consulte Configurar uma lista de permissões de endereços IP

  • Uma conta com a função rds_superuser — seja a conta privilegiada ou uma conta padrão criada com CREATE ROLE xxx WITH SUPERUSER

Como funciona

  1. Na instância publicadora, crie uma publicação para uma ou mais tabelas em um banco de dados.

  2. Na instância assinante, crie uma assinatura que se conecte ao banco de dados da publicadora e referencie a publicação.

  3. O PostgreSQL transmite alterações no nível de linha (INSERT, UPDATE, DELETE) das tabelas publicadas para a assinante quase em tempo real.

As assinaturas lógicas funcionam entre dois bancos de dados na mesma instância RDS ou entre duas instâncias RDS que residem na mesma VPC e estão conectadas por endpoints internos.

Para obter informações sobre o mecanismo subjacente, consulte Princípios e melhores práticas de assinatura lógica.

Crie uma publicação na instância publicadora

  1. Conecte-se à instância publicadora e acesse o banco de dados que deseja publicar.

  2. Crie uma publicação para uma tabela:

    Apenas tabelas base persistentes podem ser publicadas. Para objetos suportados, consulte CREATE PUBLICATION .
    -- On the publisher database
    CREATE PUBLICATION <publication_name> FOR TABLE <schema.table_name>;

    Exemplo:

    -- On the publisher database (testdb01)
    CREATE PUBLICATION pub1 FOR TABLE public.t1;
  3. Verifique se a publicação foi criada:

    -- On the publisher database
    SELECT * FROM pg_publication;

    A saída lista pub1 com seus detalhes de configuração.

Crie uma assinatura na instância assinante

Os passos variam dependendo se a publicadora e a assinante estão na mesma instância RDS ou em instâncias diferentes.

Mesma instância RDS, bancos de dados diferentes

Quando a publicadora e a assinante estão na mesma instância, o PostgreSQL não consegue criar um slot de replicação dentro do mesmo comando CREATE SUBSCRIPTION — essa tentativa faz o comando travar. Trata-se de uma restrição do mecanismo PostgreSQL, não uma limitação do RDS. Crie o slot separadamente primeiro e depois referencie-o na assinatura.

  1. Conecte-se ao banco de dados da publicadora e crie um slot de replicação lógica:

    -- On the publisher database
    SELECT pg_create_logical_replication_slot('<slot_name>', 'pgoutput');
  2. Conecte-se ao banco de dados da assinante e crie uma tabela com o mesmo esquema e nome da tabela na publicadora.

  3. Acesse o banco de dados da assinante e crie a assinatura, referenciando o slot criado no passo 1. Se a instância executar PostgreSQL 16 ou superior:

    Importante

    Sempre inclua create_slot=false na cláusula WITH quando a publicadora e a assinante estiverem na mesma instância. A omissão desse parâmetro causa o travamento do comando.

    -- On the subscriber database
    CREATE SUBSCRIPTION <subscription_name>
    CONNECTION 'host=127.0.0.1 port=<port> user=<username> password=<password> dbname=<publisher_db_name>'
    PUBLICATION <publication_name> WITH (create_slot=false, slot_name=<slot_name>);

    Se a instância executar PostgreSQL 10 a 15:

    -- On the subscriber database
    CREATE SUBSCRIPTION <subscription_name>
    CONNECTION 'dbname=<publisher_db_name>'
    PUBLICATION <publication_name> WITH (create_slot=false, slot_name=<slot_name>);
  4. Verifique a assinatura:

    -- On the subscriber database
    SELECT * FROM pg_subscription;

Instâncias RDS diferentes

  1. Conecte-se à instância assinante e acesse o banco de dados da assinante.

  2. Crie uma tabela com o mesmo esquema e nome da tabela existente na publicadora.

  3. Crie a assinatura:

    -- On the subscriber database
    CREATE SUBSCRIPTION <subscription_name>
    CONNECTION 'host=<Internet endpoint of the publisher RDS instance> port=<port> user=<username> password=<password> dbname=<publisher_db_name>'
    PUBLICATION <publication_name>;

    Exemplo:

    -- On the subscriber database (testdb02)
    CREATE SUBSCRIPTION sub1_from_pub1
    CONNECTION 'host=pgm-2ze7n9zb0n1f****.pg.rds.aliyuncs.comm port=5432 user=testdbuser password=****x dbname=testdb01'
    PUBLICATION pub1 WITH (enabled, create_slot, slot_name='sub1_from_pub1');

    Para todos os parâmetros de assinatura disponíveis, consulte CREATE SUBSCRIPTION.

  4. Verifique a assinatura:

    -- On the subscriber database
    SELECT * FROM pg_subscription;

Adicione tabelas a uma publicação existente

Após adicionar tabelas a uma publicação, atualize a assinatura na instância assinante — novas tabelas não são detectadas automaticamente.

-- On the subscriber database
ALTER SUBSCRIPTION <subscription_name> REFRESH PUBLICATION;

Monitore slots de replicação

Aviso

Slots de replicação não utilizados retêm arquivos de Write-Ahead Logging (WAL) e impedem sua reciclagem. Caso uma assinante pare de consumir alterações, os arquivos WAL se acumulam e podem preencher o armazenamento da publicadora, tornando a instância indisponível.

Após configurar assinaturas lógicas:

  • Monitore o Storage Used na instância publicadora e configure um alerta para crescimento anormal.

  • Acompanhe o Maximum Used Transaction IDs para detectar riscos de estouro de ID de transação.

  • Remova qualquer slot de replicação que não esteja mais em uso:

    -- On the publisher database
    SELECT pg_drop_replication_slot('<slot_name>');

    Para listar todos os slots de replicação ativos:

    -- On the publisher database
    SELECT * FROM pg_replication_slots;

Próximos passos