CREATE SUBSCRIPTION (replicare logică) în PostgreSQL

Replicare și backup PostgreSQL 10+ (ALTER SUBSCRIPTION ... SKIP: 15+)

Pe serverul destinație, se abonează la o publicație: copiază datele existente, apoi primește continuu modificările de pe serverul sursă.

Sintaxă SQL
CREATE SUBSCRIPTION nume
    CONNECTION 'host=... port=5432 dbname=... user=... password=...'
    PUBLICATION nume_publicatie [, ...]
    [WITH (copy_data = true, enabled = true)];
ALTER SUBSCRIPTION nume REFRESH PUBLICATION | ENABLE | DISABLE;
DROP SUBSCRIPTION nume;

Ce face CREATE SUBSCRIPTION (replicare logică)

CREATE SUBSCRIPTION se conectează la serverul sursă, creează acolo un slot de replicare, copiază datele actuale ale tabelelor publicate (copy_data = true, implicit) și apoi aplică pe rând fiecare modificare nouă.

Tabelele trebuie să existe deja pe destinație, cu aceleași nume și coloane compatibile: replicarea logică nu creează structura. O metodă simplă este pg_dump --schema-only de pe sursă, restaurat pe destinație.

Dacă aplicarea unei modificări eșuează (de exemplu o cheie duplicată pe destinație), abonarea se oprește și reîncearcă până rezolvi conflictul. Starea se vede în pg_stat_subscription și în jurnalul serverului.

Parametri

Parametru Descriere
CONNECTION Șirul de conectare la serverul sursă. Utilizatorul are nevoie de atributul REPLICATION (sau drepturi echivalente) și de drept de citire pe tabele.
PUBLICATION Una sau mai multe publicații de pe sursă.
copy_data Copiază datele existente la început (implicit true).
REFRESH PUBLICATION Preia tabelele adăugate între timp în publicație.

Ce returnează

Mesajul CREATE SUBSCRIPTION, precedat de un NOTICE despre slotul de replicare creat pe sursă.

Exemple

Exemplul 1: Abonare la publicația magazinului

CREATE SUBSCRIPTION abonare_magazin
    CONNECTION 'host=10.0.0.5 port=5432 dbname=magazin user=replicator password=parola-lunga'
    PUBLICATION pub_magazin;

Rezultat în psql

NOTICE:  created replication slot "abonare_magazin" on publisher
CREATE SUBSCRIPTION

Exemplul 2: Starea abonării

SELECT subname, pid IS NOT NULL AS activ, received_lsn
FROM pg_stat_subscription;

Rezultat în psql

     subname     | activ | received_lsn 
-----------------+-------+--------------
 abonare_magazin | t     | 0/3A1C2F08
(1 row)

Exemplul 3: Tabel nou adăugat în publicație

Pe sursă s-a rulat ALTER PUBLICATION pub_magazin ADD TABLE produse, iar pe destinație tabelul produse există deja (gol).

ALTER SUBSCRIPTION abonare_magazin REFRESH PUBLICATION;

Rezultat în psql

ALTER SUBSCRIPTION

Greșeli frecvente

  • Ștergi baza de date sursă sau serverul destinație fără DROP SUBSCRIPTION: slotul de replicare rămâne pe sursă și păstrează fișierele WAL la nesfârșit, până se umple discul. Verifică pg_replication_slots pe sursă.
  • Scrii în tabelele replicate și pe destinație. Rândurile introduse local pot intra în conflict cu cele care vin de pe sursă și opresc replicarea.
  • Pui parola în clar în CONNECTION și o vede oricine poate citi pg_subscription cu drepturi suficiente. Preferă un fișier .pgpass pe server pentru utilizatorul sistemului care rulează PostgreSQL.

Comenzi înrudite

  • CREATE PUBLICATION (replicare logică): Pe serverul sursă, alege ce tabele se trimit prin replicare logică. Serverele abonate primesc apoi fiecare INSERT, UPDATE și DELETE.
  • pg_basebackup: Face o copie fizică completă a unui server PostgreSQL care rulează, folosită pentru backup sau pentru a porni un server replică (standby).