====== 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 -d -n -f ''
- znacenje opcija: -U , -d , -n -f
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 polja ''datStockLock'' u ''NULL''
- 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 **[[pgs_restore|pg_restore]]** procesu.