Sequences in pglogischer Replikation für Disaster Recovery in OCI Database with PostgreSQL verwalten

Einführung

In diesem Tutorial wird eine benutzerdefinierte Lösung zum Synchronisieren von PostgreSQL-Sequenzwerten in einem pglogischen bidirektionalen Replikationssetup zwischen primären und Disaster-Recovery-(DR-)Systemen beschrieben.

Problembeschreibung:

Im aktuellen Setup haben wir die pglogische bidirektionale Replikation konfiguriert. Einige der replizierten Tabellen basieren auf Sequenzen. Wir haben jedoch festgestellt, dass die last_value dieser Sequenzen nicht zwischen der primären und der DR-Umgebung repliziert wird.

Dies ist das erwartete Verhalten und wird nicht als Bug in pglogical betrachtet. Im Design werden Sequenzwerte nicht repliziert, da Sequenzen als nicht transaktionsfähig und inhärent knotenspezifisch betrachtet werden, um Konflikte zu vermeiden.

Um diese Lücke zu schließen, haben wir eine benutzerdefinierte Lösung implementiert, um die Sequenzwerte zwischen dem primären und dem DR-System zu synchronisieren. Konkret entwickeln wir ein Verfahren, das:

Dieser Ansatz stellt sicher, dass die Sequenzwerte in beiden Systemen konsistent bleiben, wodurch potenzielle Datenintegritäts- oder Konfliktprobleme hauptsächlich in der DR-Umgebung vermieden werden.

Ziele

Aufgabe 1: Pglogische bidirektionale Replikation einrichten

Stellen Sie sicher, dass die pglogische bidirektionale Replikation bereits zwischen dem primären und dem DR-System konfiguriert ist.

Wenn noch nicht konfiguriert, richten Sie pglogical entsprechend in der offiziellen Dokumentation ein: Pglogical Extension Replication in der Quelldatenbank einrichten.

Aufgabe 2: Erforderliche Erweiterungen aktivieren

Aktivieren Sie sowohl in Primär- als auch in DR-Systemen die folgenden Erweiterungen, indem Sie die Konfiguration über die OCI-Konsole erstellen.

Nachdem Sie die Konfigurationsdatei auf DBSystems angewendet haben, melden Sie sich bei der Datenbank postgres für jede DBSystem an, und führen Sie die folgende Abfrage aus.

CREATE EXTENSION IF NOT EXISTS pg_cron;
CREATE EXTENSION IF NOT EXISTS dblink;

3. Aufgabe: Prozedur erstellen

Erstellen Sie die Prozedur sowohl auf Primär- als auch auf DR-Systemen in der Datenbank postgres.

Prozedurdefinition:

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;
$$;

Hinweis:

Aufgabe 4: pg_cron-Job im DR-System erstellen

Führen Sie die folgende Abfrage aus, um einen pg_cron-Job zu erstellen, und planen Sie die Ausführung der Prozedur alle eine Minute auf dem DR-Datenbanksystem.

SELECT cron.schedule('UPDATE SEQUENCE', '*/1 * * * *', $$ CALL sync_sequences_from_remote(); $$);

Hinweise:

Aufgabe 5: Job pg_cron im primären System erstellen und deaktiviert lassen

Führen Sie die folgende Abfrage aus, um einen pg_cron-Job zu erstellen und zu deaktivieren.

SELECT cron.schedule('*/1 * * * *', $$ CALL sync_sequences_from_remote() $$);

-- Disable the job (on Primary)
SELECT cron.alter_job(jobid := <job_id>, active := false);

Aufgabe 6: Failover verarbeiten

Führen Sie im Falle eines Failovers die folgenden Schritte aus:

  1. Aktivieren Sie im neuen DR (früher primär) den Job pg_cron.

  2. Deaktivieren Sie in der neuen Primärdatenbank (früher DR) den Job pg_cron.

Dadurch wird sichergestellt, dass der Synchronisierungsprozess immer nur auf dem aktuellen DR-System ausgeführt wird.

Hinweis:

Bestätigungen

Weitere Lernressourcen

Sehen Sie sich weitere Übungen zu docs.oracle.com/learn an, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning YouTube-Kanal zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um ein Oracle Learning Explorer zu werden.

Die Produktdokumentation finden Sie im Oracle Help Center.