Gerenciar Sequências na Configuração de Replicação pglógica para Recuperação de Desastres no OCI Database with PostgreSQL
Introdução
Este tutorial descreve uma solução personalizada para sincronizar valores de sequência PostgreSQL em uma configuração de replicação bidirecional pglógica entre os sistemas primário e de Recuperação de Desastres (DR).
Instrução do Problema:
Em nossa configuração atual, configuramos a replicação bidirecional glógica. Algumas das tabelas replicadas dependem de sequências; no entanto, observamos que o last_value
dessas sequências não é replicado entre os ambientes primário e DR.
Este é o comportamento esperado e não é considerado um bug em pglogical. Por padrão, os valores de sequência não são replicados, pois as sequências são consideradas não transacionais e inerentemente específicas do nó para evitar conflitos.
Para resolver essa lacuna, implementamos uma solução personalizada para sincronizar os valores de sequência entre os sistemas primário e de DR. Especificamente, estamos desenvolvendo um procedimento que:
-
Recupera o
last_value
de cada sequência relevante do banco de dados principal. -
Atualiza a sequência correspondente no lado do DR para corresponder ao principal.
-
Executa automaticamente a cada minuto usando a extensão
pg_cron
.
Essa abordagem garante que os valores da sequência permaneçam consistentes em ambos os sistemas, evitando assim possíveis problemas de integridade de dados ou conflitos, principalmente no ambiente de DR.
Objetivos
- Gerenciamento de sequências na replicação pglógica para configuração de DR no OCI Database with PostgreSQL.
Tarefa 1: Configurar Replicação Bidirecional pglógica
Certifique-se de que a replicação bidirecional pglógica já esteja configurada entre os sistemas primário e de DR.
Se ainda não estiver configurado, siga a documentação oficial para configurar o pglogical
adequadamente: Configure a Replicação de Extensão pglógica no Banco de Dados de Origem.
Tarefa 2: Ativar Extensões Obrigatórias
Nos sistemas principal e de DR, ative as extensões a seguir criando a configuração na Console do OCI.
-
pg_cron
-
dblink
Depois de aplicar o arquivo de configuração no DBSystems, conecte-se ao banco de dados postgres
em cada DBSystem e execute a consulta a seguir.
CREATE EXTENSION IF NOT EXISTS pg_cron;
CREATE EXTENSION IF NOT EXISTS dblink;
Tarefa 3: Criar o Procedures
Crie o procedimento nos sistemas principal e de DR no banco de dados postgres
.
Definição do Procedimento:
CREATE OR REPLACE PROCEDURE sync_sequences_from_remote()
LANGUAGE plpgsql
AS $$
DECLARE
-- Update the connection string with correct credentials and hostname
conn_str TEXT := 'host=<hostname> user=<username> password=<password> dbname=postgres';
row RECORD;
remote_seq_query TEXT :=
$_$SELECT schemaname, sequencename, last_value
FROM pg_sequences
WHERE schemaname !~ 'pg_catalog|cron|information_schema|pg_toast|pg_temp'
AND last_value IS NOT NULL$_$;
full_seq_name TEXT;
setval_sql TEXT;
BEGIN
FOR row IN
SELECT * FROM dblink(conn_str, remote_seq_query)
AS t(schemaname TEXT, sequencename TEXT, last_value BIGINT)
LOOP
full_seq_name := quote_ident(row.schemaname) || '.' || quote_ident(row.sequencename);
setval_sql := FORMAT('SELECT setval(%L, %s, true);', full_seq_name, row.last_value);
RAISE NOTICE 'Setting sequence: %', setval_sql;
EXECUTE setval_sql;
END LOOP;
END;
$$;
Observação:
- Substitua
<hostname>
,<username>
e<password>
por valores reais com segurança.- Use o
<hostname>
para representar o FQDN do sistema de BD.
Tarefa 4: Criar um Job pg_cron
no Sistema DR
Execute a consulta a seguir para criar um job pg_cron
e programar o procedimento para ser executado a cada minuto no sistema de banco de dados de DR.
SELECT cron.schedule('UPDATE SEQUENCE', '*/1 * * * *', $$ CALL sync_sequences_from_remote(); $$);
Observações:
- Certifique-se de que o job
pg_cron
esteja ativado somente no sistema DR.- Se necessário, ajuste a programação do job.
Tarefa 5: Criar um Job pg_cron
no Sistema Principal e Mantê-lo Desativado
Execute a consulta a seguir para criar um job pg_cron
e desativá-lo.
SELECT cron.schedule('*/1 * * * *', $$ CALL sync_sequences_from_remote() $$);
-- Disable the job (on Primary)
SELECT cron.alter_job(jobid := <job_id>, active := false);
Tarefa 6: Tratar o Failover
No caso de um failover, siga estas etapas:
-
No novo DR (anteriormente principal), ative o job
pg_cron
. -
No novo principal (anteriormente DR), desative o job
pg_cron
.
Isso garante que o processo de sincronização seja sempre executado somente no sistema de DR atual.
Observação:
Comandos úteis:
-- List all scheduled jobs and get job ID SELECT jobid, schedule, command, active FROM cron.job; -- Disable a job SELECT cron.alter_job(jobid := <job_id>, active := false); -- Enable a job SELECT cron.alter_job(jobid := <job_id>, active := true);
Ajuste o procedimento e a definição de cargo com base em seus requisitos específicos do ambiente.
Teste completamente o procedimento em um ambiente de desenvolvimento antes de implantá-lo na produção.
Links Relacionados
Confirmações
- Autor - Arvind Yadav (Equipe Técnica Principal)
Mais Recursos de Aprendizado
Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal do Oracle Learning YouTube. Além disso, acesse education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.
Para obter a documentação do produto, visite o Oracle Help Center.
Manage Sequences in pglogical Replication for Disaster Recovery Setup in OCI Database with PostgreSQL
G39332-01
Copyright ©2025, Oracle and/or its affiliates.