pg_basebackup în PostgreSQL

Replicare și backup PostgreSQL 9.1+ (-R: 9.3+, backup incremental: 17+)

Face o copie fizică completă a unui server PostgreSQL care rulează, folosită pentru backup sau pentru a porni un server replică (standby).

Sintaxă SQL
pg_basebackup -h gazda -U utilizator -D director [-F p|t] [-X stream] [-P] [-R] [-z] [-c fast]
pg_basebackup ... --incremental=backup_anterior/backup_manifest   # PostgreSQL 17+

Ce face pg_basebackup

pg_basebackup copiază toate fișierele de date ale unui server pornit, prin protocolul de replicare, fără să oprească baza de date. Rezultatul este un director (sau arhive tar) din care poți porni un server PostgreSQL identic.

Cu -X stream (implicit) copiază și fișierele WAL generate în timpul backup-ului, deci copia este consistentă. Cu -R scrie configurația de replicare (standby.signal și primary_conninfo în postgresql.auto.conf): serverul pornit din copie devine imediat replică a celui original.

Din PostgreSQL 17 există backup incremental: cu summarize_wal = on pe server, --incremental copiază doar blocurile schimbate față de backup-ul anterior, iar pg_combinebackup le reunește. Utilizatorul trebuie să aibă atributul REPLICATION și o linie replication în pg_hba.conf.

Parametri

Parametru Descriere
-D director Directorul destinație; trebuie să fie gol sau să nu existe.
-F p | t Format: p (plain, fișiere ca pe server) sau t (arhive tar).
-X stream Copiază WAL-ul în paralel (implicit din PostgreSQL 10).
-P Afișează progresul.
-R Scrie configurația pentru serverul replică.
-z Comprimă arhivele tar cu gzip.
-c fast Cere un checkpoint imediat, ca backup-ul să înceapă repede.

Ce returnează

Directorul sau arhivele de backup. Cod de ieșire 0 la succes.

Exemple

Exemplul 1: Pornirea unei replici (standby)

Rulat pe serverul nou, ca utilizatorul sistemului postgres, cu directorul de date gol.

pg_basebackup -h 10.0.0.5 -U replicator -D /var/lib/postgresql/18/main -X stream -c fast -P -R -v

Ieșire în terminal

pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/5000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_48211"
2483201/2483201 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/5000138
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: renaming backup_manifest.tmp to backup_manifest
pg_basebackup: base backup completed

Exemplul 2: Backup comprimat într-un director cu data

pg_basebackup -h localhost -U backup -D /backup/pg/2026-10-25 -F t -z -P

Ieșire în terminal

2483201/2483201 kB (100%), 1/1 tablespace

$ ls /backup/pg/2026-10-25
backup_manifest  base.tar.gz  pg_wal.tar.gz

Exemplul 3: Director destinație care nu este gol

pg_basebackup -h 10.0.0.5 -U replicator -D /var/lib/postgresql/18/main -R

Ieșire în terminal

pg_basebackup: error: directory "/var/lib/postgresql/18/main" exists but is not empty

Greșeli frecvente

  • Consideri copia făcută de pg_basebackup suficientă pentru recuperarea la un anumit moment (PITR). Pentru asta ai nevoie și de arhivarea continuă a WAL-ului (archive_command sau un instrument ca pgBackRest).
  • Uiți linia pentru replicare din pg_hba.conf (host replication replicator 10.0.0.6/32 scram-sha-256) și primești no pg_hba.conf entry for replication connection.
  • Nu testezi restaurarea. Un backup este util doar dacă ai pornit cel puțin o dată un server din el.

Comenzi înrudite