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:
- pokretanje command prompta (cmd.exe) u administratorskom rezimu
- navigacija u folder gde se nalazi pg_dump.exe npr: cd Program Files\PostgreSQL\9.6\bin
- pokretanje komande za dump sa opcijama dupm-a:
pg_dump -U <postgres> -d <b1> -n <public> -f <mydbPA.sql>
- 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:
- Pre bekapovanja promeniti funkciju
bpub.maxdatstocklock()
tako da se doda eksplictno šema tabele -btek.firme
- U tabeli
btek.firme
postaviti vrednost poljadatStockLock
uNULL
- Nakon bekapovanja vratiti funkciju na staro kao i vrednost polja
datStockLock
- 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.