CREATE PUBLICATION (replicare logică) în PostgreSQL

Replicare și backup PostgreSQL 10+ (filtre WHERE, liste de coloane și TABLES IN SCHEMA: 15+) Q&A / Distribuie cod

Pe serverul sursă, alege ce tabele se trimit prin replicare logică. Serverele abonate primesc apoi fiecare INSERT, UPDATE și DELETE.

Sintaxă SQL
CREATE PUBLICATION nume
    FOR TABLE tabel [(coloane)] [WHERE (condiție)] [, ...]
  | FOR TABLES IN SCHEMA schema
  | FOR ALL TABLES
    [WITH (publish = 'insert, update, delete, truncate')];
ALTER PUBLICATION nume ADD TABLE tabel;

Ce face CREATE PUBLICATION (replicare logică)

Replicarea logică trimite modificările rând cu rând (nu fișierele bazei de date), deci poți copia doar anumite tabele, între versiuni diferite de PostgreSQL. Se folosește pentru upgrade-uri cu întrerupere minimă, rapoarte pe alt server sau sincronizarea unor tabele între aplicații.

Serverul sursă (publisher) are nevoie de wal_level = logical în postgresql.conf (cere repornire). Publicația definește ce se trimite; pe serverul destinație se creează o abonare (CREATE SUBSCRIPTION).

Pentru ca UPDATE și DELETE să poată fi replicate, fiecare tabel are nevoie de o identitate a rândului (replica identity): de obicei cheia primară. Schimbările de structură (DDL) și, până la PostgreSQL 18 inclusiv, valorile secvențelor nu se replică.

Parametri

Parametru Descriere
FOR TABLE tabel Tabelele publicate. Din PostgreSQL 15: listă de coloane și filtru WHERE pe rânduri.
FOR TABLES IN SCHEMA PostgreSQL 15+: toate tabelele dintr-o schemă, inclusiv cele create ulterior.
FOR ALL TABLES Toate tabelele din baza de date (cere superuser).
publish Ce operații se trimit (implicit toate: insert, update, delete, truncate).

Ce returnează

Mesajul CREATE PUBLICATION.

Exemple

Exemplul 1: Publicarea a două tabele

Pe server s-a setat deja wal_level = logical și s-a repornit PostgreSQL.

CREATE PUBLICATION pub_magazin FOR TABLE clienti, comenzi;

SELECT pubname, schemaname, tablename FROM pg_publication_tables;

Rezultat în psql

CREATE PUBLICATION
   pubname   | schemaname | tablename 
-------------+------------+-----------
 pub_magazin | public     | clienti
 pub_magazin | public     | comenzi
(2 rows)

Exemplul 2: Doar comenzile din Iași și doar câteva coloane (PostgreSQL 15+)

CREATE PUBLICATION pub_iasi
    FOR TABLE comenzi (id, client_id, total, oras) WHERE (oras = 'Iași');

Rezultat în psql

CREATE PUBLICATION

Exemplul 3: Tabel fără cheie primară într-o publicație

ALTER PUBLICATION pub_magazin ADD TABLE jurnal;
DELETE FROM jurnal WHERE creat_la < '2026-01-01';

Rezultat în psql

ALTER PUBLICATION
ERROR:  cannot delete from table "jurnal" because it does not have a replica identity and publishes deletes
HINT:  To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE.

Greșeli frecvente

  • Creezi publicația pe un server cu wal_level = replica (valoarea implicită). Publicația se creează cu un avertisment, dar abonările nu vor funcționa până nu schimbi setarea și repornești serverul.
  • Adaugi în publicație tabele fără cheie primară: UPDATE și DELETE pe ele încep să dea eroare. Adaugă o cheie primară sau setează REPLICA IDENTITY FULL (mai lent).

Comenzi înrudite

  • CREATE SUBSCRIPTION (replicare logică): Pe serverul destinație, se abonează la o publicație: copiază datele existente, apoi primește continuu modificările de pe serverul sursă.
  • pg_basebackup: Face o copie fizică completă a unui server PostgreSQL care rulează, folosită pentru backup sau pentru a porni un server replică (standby).
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: CREATE PUBLICATION (replicare logică)

Ai o nelămurire despre utilizarea comenzii CREATE PUBLICATION (replicare logică) sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.