pgs_restore

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
Next revisionBoth sides next revision
pgs_restore [2018/02/22 10:29] – [pg_restore] milanopgs_restore [2021/01/22 21:38] milano
Line 8: Line 8:
 ==== Prenos baze podataka na drugi server ==== ==== Prenos baze podataka na drugi server ====
  
-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 :+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 [[:pgs_dump|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> <code>
 pg_dump -U postgres -Fc -d b1 -f b1.backup pg_dump -U postgres -Fc -d b1 -f b1.backup
Line 32: Line 32:
 **-d postgres** je parametar koji pravi najviše zabune, jer izgleda kao da dajemo instrukciju da se baza raspakuje u bazu sa imenom //postgres//. Ustvari, parametar -C sprečava da se ovo desi, pa je ime //postgres// iskorišćeno samo zato što takvo sigurno postoji na novom serveru. Moglo je poslužiti i bilo koje drugo, za koje znamo da postoji. Kako smo zadali parametar -C, pg_restore će automatski napraviti bazu pod imenom **b1**, kako je u izvornom b1.backup fajlu i navedeno.\\ **-d postgres** je parametar koji pravi najviše zabune, jer izgleda kao da dajemo instrukciju da se baza raspakuje u bazu sa imenom //postgres//. Ustvari, parametar -C sprečava da se ovo desi, pa je ime //postgres// iskorišćeno samo zato što takvo sigurno postoji na novom serveru. Moglo je poslužiti i bilo koje drugo, za koje znamo da postoji. Kako smo zadali parametar -C, pg_restore će automatski napraviti bazu pod imenom **b1**, kako je u izvornom b1.backup fajlu i navedeno.\\
 **b1.backup** je ime fajla u kom se nalazi spakovana i kompresovana baza koju raspakujemo. **b1.backup** je ime fajla u kom se nalazi spakovana i kompresovana baza koju raspakujemo.
 +
 +
 ===== psql - vraćanje iz "plain-text" formata ===== ===== psql - vraćanje iz "plain-text" formata =====
  
Line 49: Line 51:
 Psql alatu se može zadati i server, port, baza, korisničko ime i lozinka u ovom formatu, (ispred reči dbname treba da budu 2 crtice, ali ih docuwiki spaja u jednu) npr: \\ psql.exe –dbname=postgresql://korisnik:lozinka@:pgserver:5432/b4 //ostale_opcije_i_parametri Psql alatu se može zadati i server, port, baza, korisničko ime i lozinka u ovom formatu, (ispred reči dbname treba da budu 2 crtice, ali ih docuwiki spaja u jednu) npr: \\ psql.exe –dbname=postgresql://korisnik:lozinka@:pgserver:5432/b4 //ostale_opcije_i_parametri
  
 +===== Aktivna opcija "zaključavanja perioda" =====
 +
 +Usled razloga opisanih u [[pgs_dump|pg_dump]] proceduri, a ukoliko prilikom bekapovanja baze nisu preduzeti nikakvi koraci, rekonstrukcija baze treba da ide sledećim tokom. \\ 
 +Opisan je najgori scenario: poslovni period u bekapovanij bazi je bio je zaključan na tekući dan u momentu bekapa. \\ 
 +Primer je iz realnog sveta, bekap je napravljen na bazi MgMivela, a rekonstruišu se samo šeme **bcus**, **bpub** i **btek** (tekuća godina). \\ 
 +
 +Rekonstrukcija šema i podataka istovremeno ne može biti sprovedena. Prvo je neophodno rekonstruisati šeme. \\ 
 +
 +<code>
 +#> pg_restore -h 192.168.0.5 -p 5432 -U postgres -v -n bcus -n bpub -n btek -O -d b3 -x -s c:\b3_mivela.backup 2>restore.log
 +</code> 
 +
 +Objašnjavam ređe opcije: 
 +
 +''-v'' - //verbose// režim rada, znači bogatiji opisi grešaka i akcija \\ 
 +''-n'' - navodim šeme koje želim da izvučem iz bekapa \\
 +''-O'' - naređujem da se ne rekonstruiše vlasništvo nad objektima (vlasnik postaje korisnik naveden pod ''-U'' opcijom) \\
 +''-x'' - naređujem da se ne rekonstruišu ni posebne privilegije nad objektima \\ 
 +''-s'' - naređujem da se radi **samo rekonstrukcija šeme objekata baze** (definicije tabela, pogleda, funkcija itd.) \\ 
 +''2>'' - ovo nije vezano za ''pg_restore'' već ukazuje //shell-u// da izlaz (opis radova) usmeri u fajl ''restore.log'' umesto na ekran (beskorisno). \\ \\
 +
 +Sada kada imamo definiciju svih objekata može se promeniti funkcija ''bpub.maxdatstocklock()'' \\
 +<code>
 +CREATE OR REPLACE FUNCTION bpub.maxdatstocklock() RETURNS timestamp AS 
 +$BODY$
 +    DECLARE result timestamp;
 +    BEGIN
 +         SELECT CASE WHEN (MAX(datStockLock) IS NULL)
 +                     THEN '1970-03-22'::timestamp
 +                     ELSE MAX(datStockLock)
 +                END
 +         FROM btek.firme   -- <<< u potpunosti zakucavamo na koju tabelu firme mislimo; search_path više nije bitan
 +         INTO result;
 +         RETURN result;
 +    END;
 +$BODY$
 +LANGUAGE plpgsql
 +STABLE;
 +</code>
 +
 +Kako je rečeno, u ovom primeru je pored svega još i zaključan period na tekući dan, te rekonstrukcija zapisa nije moguća pre njegovog otključavanja. Za ovaj korak potrebni su nam samo podaci tabele ''btek.firme'' pa ćemo izvući samo njih:
 +<code>
 +#> pg_restore -h 192.168.0.5 -p 5432 -U postgres -v -n btek -t firme -O -d b3 -x -a c:\b3_mivela.backup 2>restore2.log
 +</code>
 +
 +Objašnjavam ređe opcije: 
 +
 +''-t'' - navodim tabelu čije podatke želim rekonstruisati \\
 +''-a'' - naređujem da želim samo podatke \\ \\
 +
 +Otključavam period:
 +<code>
 +UPDATE btek.firme SET datStockLock=NULL
 +</code>
 +Ukoliko je potrebno vratiti zaključavanje u prethodno stanje pre postavke u NULL treba očitati tekuću vrednost.
 +
 +Sada smo spremni da preuzmemo i ostale podatke:
 +<code>
 +#> pg_restore -h 192.168.0.5 -p 5432 -U postgres -v -n bcus -n bpub -n btek -O -d b3 -x -a c:\b3_mivela.backup 2>restore3.log
 +</code>
 +
 +Po završetku procesa otvoriti fajl ''restore3.log'' i proveriti ima li grešaka zbog kojih podaci nisu mogli biti učitani.
 +Očekivana je samo jedna greška - tabela ''firme'' neće biti učitana jer su podaci već bili u njoj.
 +
 +Vreme je da se funkcija ''bpub.maxdatstocklock()'' vrati u izvorni oblik \\
 +<code>
 +CREATE OR REPLACE FUNCTION bpub.maxdatstocklock() RETURNS timestamp AS 
 +$BODY$
 +    DECLARE result timestamp;
 +    BEGIN
 +         SELECT CASE WHEN (MAX(datStockLock) IS NULL)
 +                     THEN '1970-03-22'::timestamp
 +                     ELSE MAX(datStockLock)
 +                END
 +         FROM firme   -- <<< sada opet search_path upravlja odabirom tabele za regulisanje zaključavanja
 +         INTO result;
 +         RETURN result;
 +    END;
 +$BODY$
 +LANGUAGE plpgsql
 +STABLE;
 +</code>
  
 +Ukoliko treba sada je trenutak da se vrati i prethodni datum zaključavanja u ''firme.datStockLock''. \\ 
 +Proveriti broj zapisa u tabelama ''racuni'',''otpremnice'',''ulaz'' i ''nalozi''. \\ 
 +Trebalo bi da je sve savršeno !
  • pgs_restore.txt
  • Last modified: 2024/01/31 12:29
  • by milano