Table of Contents

PG Dump

pg_dump

Za kopiranje PostgreSQL baze podataka najsvrsishodnije je koristiti postojeci pg_dump koji je lociran u folderu kome je instaliran Postgres, i to u folderu Bin.

Primer lokacije na Windows platformi

c:\Program Files\PostgreSQL\9.6\bin\pg_dump.exe

Izvoz u kompresovanu datoteku

Preporučeni način izvoza baze podataka sa najviše opcija pri uvozu na drugi server jeste upotreba custom formata zapisa (-Fc).

Pri prenosu celih baza podataka, veoma je važno da izlazni fajl bude kompresovan jer se može desiti da zbog veličine bude nepodesan za prenos/manipulaciju. Kompresijom upravlja pg _dump, a niže je primer prenosa baze pod nazivom b1, sa extenzijama, šemama i svim ostalim Pg objektima. Operaciju izvodim pod sistemskim postgres nalogom, iako to može biti bilo koji drugi korisnik sa odgovarajućim pravima :

pg_dump -U postgres -Fc -d b1 -f b1.backup

Objašnjenje parametara:

-U postgres znači da operaciju izvodim pod korisničkim nalogom postgres.
-Fc znači da koristim custom format fajla, koji dozvoljava najviše opcija pri raspakivanju ( pg _ restore ) baze. Istovremeno, ovaj format automatski podrazumeva kompresovanje podataka.
-d b1 je ime baze podataka koju prenosim/bekapujem/čuvam
-f b1.backup je ime fajla u koji se podaci pohranjuju.

Ako se dump pravi sa računara na kom nije PGS server sintaksa je sledeća (–verbose može da se izostavi kada nema potrebe da se ispisuje trenutna dump akcija u CMD prozoru):

pg_dump --dbname=postgresql://korisnik:lozinka@imePGServera:port/nekabaza --schema=nekaschema --verbose -Fc --file="Putanja_do_dump_fajla"

Preporuka za izradu kopije za potrebe prenosa na drugi server (npr. kada stavljamo bazu na kanal) jeste da se prilikom dump-a izostave podaci o vlasniku, odnosno privilegijama pristupa objektima. Tako izbegavamo neophodnost postojanja identičnog korisničkog naloga na serveru na kom će se baza raspakivati.

-x isključiće prenos privilegija -O isključiće prenos vlasnika -n omogućava navođenje šema koje treba ubaciti u bekap, i ponavlja se onoliko puta koliko šema treba preneti.

Primer tipične komande za izradu bekapa namnjenog prenosu “na kanal” bi bio:

pg_dump -U postgres -Fc -d b1 -n bcus -n bpub -n btek -O -x -f b1.backup

Izvoz u tekstualnu datoteku (plain text)

Ovaj format omogućava proizvoljne aktivnosti na prilagođavanju fajla za naknadni uvoz u običnom uređivaču teksta jer se baza izvozi kao SQL skript. Kako se pri zameni delova teksta izbegla mogućnost oštećenja podataka, toplo se preporučuje odvojiti definicije od podataka u dva zasebna fajla.

Procedura za dampovanje je:

  1. pokretanje command prompta (cmd.exe) u administratorskom rezimu
  2. navigacija u folder gde se nalazi pg_dump.exe npr: cd Program Files\PostgreSQL\9.6\bin
  3. pokretanje komande za dump sa opcijama dupm-a:
    1. pg_dump -U <postgres> -d <b1> -n <public> -f <mydbPA.sql>
    2. znacenje opcija: -U <user>, -d <ime baze>, -n <ime scheme> -f <format i ime fajla za izvoz>

Ime baze se može navesti i kao postgresql://nessa:deus@MOC:5432/b100, što je posebno značajno kada se radi sa mašine koja nije PG server.

Samo struktura baze se može izvesti komandom -s (–schema-only) npr.

pg_dump -U postgres -s -d b1 -f b1_SCHEMA.sql

Samo podaci baze se mogu izvesti komandom -a (–data-only) npr.

pg_dump -U postgres -a –disable-triggers -d b1 -f b1_DATA.sql

Opcija –disable-triggers zahteva da se prosledi superuser ime, u ovom slučaju je to postgres.

Aktivna opcija "zaključavanja perioda"

Kada je aktivirana opcija Uključiti mogućnost apsolutnog zaključavanja poslovnog perioda potrebno je preduzeti dodatne korake kako bi se bekapovana baza mogla rekonstruisati.

Zaključavanje se izvodi dodavanjem CONSTRAINT na tabele racuni,otpremnice,ulaz i nalozi. Ograničenje se oslanja na funkciju bpub.maxdatstocklock() koja se kreira dinamički prilikom aktiviranja opcije kroz parametre programa (znači, nema je u b0 ili Dbupdate).

Funkcija se oslanja na tabelu firme (polje datStockLock), koja se nalazi u tekućoj bazi i arhivama. Da bi zaključavanje tekućeg perioda i arhiva bilo razdvojeno u funkciji nije eksplicitno određena šema tabele firme već se koristi search_path za to.

Pošto pg_restore resetuje search_path povrat podataka u CONSTRAINT-om zaštićene tabele neće biti moguć zbog greške relation 'firme' not found. Da bi se ovo prevazišlo potrebno je:

  1. Pre bekapovanja promeniti funkciju bpub.maxdatstocklock() tako da se doda eksplictno šema tabele - btek.firme
  2. U tabeli btek.firme postaviti vrednost polja datStockLock u NULL
  3. Nakon bekapovanja vratiti funkciju na staro kao i vrednost polja datStockLock
  4. Nakon pg_restore komande (otvaranja bekapa) opet korigovati funkciju (ukloniti ekslplicitno navedenu šemu).

Ukoliko se sve ovo ne uradi i dalje će biti moguća rekonstrukcija baze iz bekapa ali dodatnim koracima u pg_restore procesu.