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șiDELETEpe 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).
Î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.