====== 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.