Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Central de ajuda/ Relational Database Service/ Melhores práticas/ RDS for PostgreSQL/ Publicações e assinaturas do RDS for PostgreSQL
Atualizado em 2024-09-24 GMT+08:00

Publicações e assinaturas do RDS for PostgreSQL

Definição lógica

Uma publicação pode ser definida em qualquer servidor de replicação física principal. O nó onde uma publicação é definida é chamado de publicador. Uma publicação é um conjunto de alterações geradas a partir de uma tabela ou de um grupo de tabelas e também pode ser descrito como um conjunto de alterações ou um conjunto de replicação. Cada publicação existe em apenas um banco de dados.

Uma assinatura é o lado downstream da replicação lógica. O nó onde uma assinatura é definida é chamado de assinante. Uma assinatura define a conexão com outro banco de dados e o conjunto de publicações (uma ou mais) às quais deseja se inscrever. O banco de dados de assinantes se comporta da mesma forma que qualquer outra instância do RDS for PostgreSQL (primária) e pode ser usado como editor para outros bancos de dados definindo suas próprias publicações.

Permissões necessárias

  • Para criar uma publicação, o publicador deve ter a permissão de replicação.
  • Ao criar uma publicação para ALL TABLES, verifique se o editor usa o usuário root da versão inicial ou posterior para escalonamento de privilégios.
  • Ao criar ou excluir uma assinatura, verifique se o assinante usa o usuário root da versão inicial ou posterior para escalonamento de privilégios.

Para obter detalhes sobre o escalonamento de privilégios root de cada versão, consulte Privilégios do usuário root.

Restrições às publicações

  • Atualmente, as publicações só podem conter tabelas (índices, números de sequência e exibições materializadas não podem ser publicados). Cada tabela pode ser adicionada a várias publicações, se necessário.
  • Uma publicação pode ter vários assinantes.
  • ALL TABLES podem ser usada para publicar todas as tabelas.
  • Várias publicações podem ser criadas em um determinado banco de dados, mas cada publicação deve ter um nome exclusivo. As publicações criadas podem ser obtidas consultando pg_publication.
  • As publicações podem optar por limitar as alterações que produzem a qualquer combinação de INSERT, UPDATE, DELETE e TRUNCATE, semelhante à forma como os gatilhos são disparados por tipos de evento específicos. Por padrão, todos os tipos de operação são replicados.

    Exemplo: para publicar as operações UPDATE e DELETE na tabela t1:

    CREATE PUBLICATION update_delete_only FOR TABLE t1 WITH (publish = 'update, delete') ;
  • Identidade da réplica: uma tabela publicada deve ter uma identidade de réplica configurada para poder replicar as operações UPDATE e DELETE. Se nothing estiver definido para a identidade da réplica, as operações UPDATE ou DELETE subsequentes causarão um erro no publicador.

    Você pode obter a identidade da réplica de uma tabela em pg_class.relreplident.

    relreplident é do tipo de caractere e identifica colunas usadas para formar "identidade de réplica" para linhas: d = padrão, f = todas as colunas, i = índice e n = nada.

    Para verificar se uma tabela tem uma restrição de índice que pode ser usada como uma identidade de réplica, execute o seguinte:

    SELECT quote_ident(nspname) || '.' || quote_ident(relname) AS name, con.ri AS keys, CASE relreplident WHEN 'd' THEN 'default' WHEN 'n' THEN 'nothing' WHEN 'f' THEN 'full' WHEN 'i' THEN 'index' END AS replica_identity FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid, LATERAL (SELECT array_agg(contype) AS ri FROM pg_constraint WHERE conrelid = c.oid) con WHERE relkind = 'r' AND nspname NOT IN ('pg_catalog', 'information_schema', 'monitor', 'repack', 'pg_toast') ORDER BY 2,3;
  • Comando para alterar uma identidade de réplica

    A identidade da réplica de uma tabela pode ser alterada usando AALTER TABLE.

    ALTER TABLEtable_nameREPLICA IDENTITY { DEFAULT | USING INDEXindex_name | FULL | NOTHING};-- There are four forms: ALTER TABLE t_normal REPLICA IDENTITY DEFAULT; -- The primary key is used as the replica identity. If there is no primary key, the replica identity is set to FULL. ALTER TABLE t_normal REPLICA IDENTITY FULL; -- The entire row is used as the replica identity. ALTER TABLE t_normal REPLICA IDENTITY USING INDEX t_normal_v_key; -- A unique index is used as the replica identity. ALTER TABLE t_normal REPLICA IDENTITY NOTHING; -- No replica identity is set.
  • Precauções para usar identidades de réplica
    • Se uma tabela tiver uma chave primária, a identidade da réplica poderá ser definida como DEFAULT.
    • Se uma tabela não tiver uma chave primária, mas tiver um índice exclusivo não-nulo, a identidade da réplica poderá ser definida como INDEX.
    • Se uma tabela não tiver uma chave primária ou um índice exclusivo não-nulo, a identidade da réplica poderá ser definida como FULL. Isso, no entanto, é muito ineficiente e só deve ser usado como alternativa se nenhuma outra solução for possível.
    • Em todos os casos diferentes dos mencionados acima, a replicação lógica não pode ser implementada. As informações de saída são insuficientes e um erro pode ser relatado.
    • Se uma tabela com identidade de réplica "nothing" for adicionada à replicação lógica, excluir ou atualizar a tabela causará um erro no editor.

Restrições às assinaturas

  • Para garantir que os slots de failover sejam usados, os slots de failover devem ser criados no editor e associados aos slots de replicação existentes usando create_slot = false.

    CREATE SUBSCRIPTION sub1 CONNECTION 'host=192.168.0.1 port=5432 user=user1 dbname=db1' PUBLICATION pub_name with (create_slot = false,slot_name = FailoverSlot_name);

  • A replicação lógica não replica alterações DDL, portanto, as tabelas no conjunto de publicações já devem existir no assinante.
  • Várias assinaturas podem ser criadas em um determinado banco de dados. Essas assinaturas podem vir de um ou mais editores.
  • Uma determinada tabela de um assinante não pode aceitar várias publicações da mesma fonte.
  • Ao criar uma assinatura ou alterar uma assinatura, você pode usar enable para ativar a assinatura ou disable para suspender a assinatura.
  • Para excluir uma assinatura, use DROP SUBSCRIPTION. Observe que depois que uma assinatura é excluída, a tabela local e os dados não são excluídos, mas as informações upstream da assinatura não são mais recebidas.

    Se uma assinatura estiver associada a um slot de replicação, DROP SUBSCRIPTION não poderá ser executada dentro de um bloco de transação. Você pode usar ALTER SUBSCRIPTION para desassociar a assinatura do slot de replicação.

    Para excluir completamente uma assinatura, execute as seguintes etapas:

    1. Consulte o slot de replicação associado à assinatura no assinante.

      select subname,subconninfo,subslotname from pg_subscription where subname = 'sub2';

      • subname indica o nome do assinante.
      • subconninfo indica informações sobre o host remoto conectado.
      • subslotname indica o nome do slot de replicação do host remoto.
    2. No assinante, desassocie a assinatura do slot de replicação e exclua a assinatura.

      ALTER SUBSCRIPTION subname SET (slot_name = NONE);

      DROP SUBSCRIPTION subname;

    3. Exclua o slot de replicação associado no publicador.

      select pg_drop_replication_slot(' slot_name);

Referência de sintaxe

  • Publicações

    CREATE PUBLICATION é usado para criar uma publicação, DROP PUBLICATION é usado para excluir uma publicação e ALTER PUBLICATION é usado para modificar uma publicação.

    Depois que uma publicação é criada, as tabelas podem ser adicionadas ou removidas dinamicamente usando ALTER PUBLICATION. Tais operações são todas transacionais.

  • Assinaturas

    CREATE SUBSCRIPTION é usado para criar uma assinatura, DROP SUBSCRIPTION é usado para excluir uma assinatura e ALTER SUBSCRIPTION é usado para modificar uma assinatura.

    Depois de criar uma assinatura, você pode usar ALTER SUBSCRIPTION para suspender ou retomar a assinatura a qualquer momento. Excluir e recriar uma assinatura resulta na perda de informações sincronizadas, o que significa que os dados relacionados precisam ser sincronizados novamente.

Para mais detalhes, consulte a documentação oficial. O PostgreSQL 13 é usado como exemplo.