pg_dump și pg_restore în PostgreSQL

Indecși, performanță și terminalul psql PostgreSQL 9.3+ (standard în PostgreSQL 15–17)

Creează copii de siguranță (backup) consistente online și restaurează selectiv sau în paralel bazele de date PostgreSQL.

Sintaxă SQL
pg_dump -h host -U user -Fc -f backup.dump nume_dbnpg_restore -h host -U user -d nume_db -j 4 backup.dump

Ce face pg_dump și pg_restore

pg_dump este utilitarul oficial de linie de comandă pentru realizarea copiilor de siguranță logice ale unei baze de date PostgreSQL. Datorită arhitecturii MVCC, pg_dump realizează un backup 100% consistent la un moment dat în timp (snapshot) fără a bloca citirile sau scrierile aplicației aflate în producție.

Deși implicit pg_dump generează un script SQL text (care se restaurează cu psql -f backup.sql), în producție se recomandă formatul binar comprimat Custom (-Fc) sau formatul Directory (-Fd). Acestea sunt restaurate cu utilitarul pg_restore, care permite restaurarea în paralel pe mai multe nuclee CPU (-j) sau extragerea unui singur tabel dintr-o arhivă întreagă.

Clauze, operatori și argumente

Clauză / Operator Descriere
-Fc (--format=custom) Recomandat: creează o arhivă binară comprimată și flexibilă, restaurabilă cu pg_restore.
-Fd -j N (--format=directory) Salvează câte un fișier per tabel într-un director, permițând rularea pg_dump în paralel pe N fire de execuție.
-Fp (--format=plain) Formatul implicit: generează un fișier text SQL simplu (se restaurează cu psql, nu cu pg_restore).
-s / -a Exportă doar schema DDL fără date (-s, --schema-only) sau doar datele fără structură (-a, --data-only).
-t nume_tabel Exportă sau restaurează doar tabelul specificat (poate fi repetat pentru mai multe tabele).
--no-owner --no-privileges (-O -x) Omite comenzile ALTER OWNER și GRANT/REVOKE, util când restaurezi baza pe un alt utilizator (ex: de pe producție pe local).
pg_restore -j N -c --if-exists Restaurează folosind N joburi paralele și șterge obiectele existente înainte de recreare.

Exemple

Exemplul 1: Backup în format Custom comprimat (-Fc) și restaurare paralelă pe 4 fire cu pg_restore

Salvăm baza de date magazin_prod într-o arhivă comprimată și o restaurăm rapid într-o bază de staging folosind 4 procese paralele.

# 1. Crearea arhivei de backup (în terminalul sistemului de operare, nu în psql)
pg_dump -h localhost -U postgres -Fc --no-owner -f /backups/magazin_2025_03.dump magazin_prod

# 2. Restaurarea rapidă în paralel (4 nuclee) într-o bază de date nouă
createdb -h localhost -U postgres magazin_staging
pg_restore -h localhost -U postgres -d magazin_staging -j 4 --no-owner -v /backups/magazin_2025_03.dump

Rezultat interogare

pg_restore: connecting to database for restore
pg_restore: creating TABLE "public.clienti"
pg_restore: creating TABLE "public.comenzi"
pg_restore: creating TABLE "public.produse"
pg_restore: processing data for table "public.comenzi"
pg_restore: creating INDEX "public.idx_comenzi_client_data"
pg_restore: implied data-only restore

Exemplul 2: Exportul doar al schemei (-s) sau restaurarea unui singur tabel (-t) din arhivă

Extragem structura DDL a bazei pentru versionare în Git și recuperăm doar tabelul produse dintr-un backup complet.

# Export doar structura (fără date) în format SQL text
pg_dump -U postgres -s --no-owner -f schema_magazin.sql magazin_prod

# Restaurarea unui singur tabel dintr-o arhivă -Fc existentă
pg_restore -U postgres -d magazin_staging -t produse --clean --if-exists /backups/magazin_2025_03.dump

Rezultat interogare

(fără ieșire — comenzile s-au finalizat cu codul 0)

Greșeli frecvente

  • Încercarea de a restaura un fișier .sql (creat fără -Fc) folosind pg_restore: vei primi eroarea input file appears to be a text format dump. Please use psql.
  • Rularea pg_dump din interiorul promptului psql: atât pg_dump, cât și pg_restore sunt programe de sistem independente și se rulează direct în terminalul Bash/Zsh.

Comenzi și funcții înrudite