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:
- 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.
- No assinante, desassocie a assinatura do slot de replicação e exclua a assinatura.
ALTER SUBSCRIPTION subname SET (slot_name = NONE);
DROP SUBSCRIPTION subname;
- Exclua o slot de replicação associado no publicador.
- Consulte o slot de replicação associado à assinatura no assinante.
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.
- Criação de uma publicação: https://www.postgresql.org/docs/13/sql-createpublication.html
- Exclusão de uma publicação: https://www.postgresql.org/docs/13/sql-droppublication.html
- Modificação de uma publicação: https://www.postgresql.org/docs/13/sql-alterpublication.html