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:
-
Ruft die
last_value
jeder relevanten Sequenz aus der Primärdatenbank ab. -
Aktualisiert die entsprechende Sequenz auf der DR-Seite, sodass sie mit der primären Sequenz übereinstimmt.
-
Wird automatisch alle eine Minute mit der Erweiterung
pg_cron
ausgeführt.
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
- Sequenzen in pglogischer Replikation für DR-Setup in OCI Database with PostgreSQL verwalten.
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.
-
pg_cron
-
dblink
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:
- Ersetzen Sie
<hostname>
,<username>
und<password>
sicher durch tatsächliche Werte.- Verwenden Sie
<hostname>
, um den FQDN des DB-Systems darzustellen.
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:
- Stellen Sie sicher, dass der Job
pg_cron
nur auf dem DR-System aktiviert ist.- Passen Sie den Jobplan gegebenenfalls an.
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:
-
Aktivieren Sie im neuen DR (früher primär) den Job
pg_cron
. -
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:
Nützliche Befehle
-- 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);
Passen Sie die Prozedur und die Jobdefinition an Ihre umgebungsspezifischen Anforderungen an.
Testen Sie das Verfahren gründlich in einer Entwicklungsumgebung, bevor Sie es in der Produktion bereitstellen.
Verwandte Links
Bestätigungen
- Autor - Arvind Yadav (technisches Hauptmitglied)
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.
Manage Sequences in pglogical Replication for Disaster Recovery Setup in OCI Database with PostgreSQL
G39325-01
Copyright ©2025, Oracle and/or its affiliates.