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:

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

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.

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:

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:

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:

  1. No novo DR (anteriormente principal), ative o job pg_cron.

  2. 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:

Confirmações

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.