Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
kb:pg:pgs_dump [2025/03/29 15:44] – removed - external edit (Unknown date) 127.0.0.1kb:pg:pgs_dump [2025/03/29 15:44] (current) – ↷ Links adapted because of a move operation milano
Line 1: Line 1:
 +====== 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
 +
 +<file>
 +c:\Program Files\PostgreSQL\9.6\bin\pg_dump.exe
 +</file>
 +
 +===== 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 :
 +<code>
 +pg_dump -U postgres -Fc -d b1 -f b1.backup
 +</code>
 +
 +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):
 +
 +<code>
 +pg_dump --dbname=postgresql://korisnik:lozinka@imePGServera:port/nekabaza --schema=nekaschema --verbose -Fc --file="Putanja_do_dump_fajla"
 +</code>
 +
 +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:
 +
 +<code>
 +pg_dump -U postgres -Fc -d b1 -n bcus -n bpub -n btek -O -x -f b1.backup
 +</code>
 +===== 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 ''<nowiki>postgresql://nessa:deus@MOC:5432/b100</nowiki>'', š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. 
 +<code>pg_dump -U postgres -s -d b1 -f b1_SCHEMA.sql</code>
 +Samo podaci baze se mogu izvesti komandom ''-a (–data-only)'' npr. <code>pg_dump -U postgres -a –disable-triggers -d b1 -f b1_DATA.sql</code>
 +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 **[[kb:pg:pgs_restore|pg_restore]]** procesu.