Dump Postrgres baze i vraćanje podataka u istu nakon što migracije pođu po zlu

Ko god je ikad pisao migracije morao je naići na barem najmanji problem zbog kojeg bi bilo nemoguće popraviti podatke koje je migracija pokvarila. Obrišeš nešto, sleši se migracija na pola puta i ostavi model nekonzistentan, ograničenja baze nisu zadovoljena i ne možeš ni da mrdneš.

Probao sam razne varijante dump-a i čitajući dokumentaciju Postgres-a sam shvatio da stvari nisu jednostavne onako kako bi trebale biti. Mislim, koliko komplikovano je skini SVE u fajl -> Vrati SVE iz fajla kako je bilo?

Izgleda da uvek moraš da budeš pomalo haker.
Da skratim priču, mene je spasilo sledeće:

Budući da sve ovo radim na Ubuntu 14.0.4 moram početi ovako

sudo su postgres
// unesi password 
cd ~ 

Dump

pg_dump -f ime_fajla.sql -Ox ime_baze

Objašnjenje 

-f samo pokazuje gde da sačuva dump.
-Ox govori bazi da hoću da sve constrainte sačuva u takvom redosledu da ih mogu posle vratiti kako treba. Zašto ovo nije uvek uključeno ne pitajte me. Ovo je "O", kao "olovka", nije nula!

Vrati sve kako je bilo

(Napomena: verovatno će dump biti u .gz arhivi. Otpakuj prvo pa onda izvrši ovo dole, jer on ne ume da prepozna da je zapakovan.)
su postgres    
dropdb ime_baze
createdb ime_baze -O postgres
psql ime_baze -f ime_fajla.sql

A sada ključni detalj, koji nekako nigde nije dobro dokumentovan

psql ime_baze -c "GRANT ALL ON ALL TABLES IN SCHEMA public to postgres;"
psql ime_baze -c "GRANT ALL ON ALL SEQUENCES IN SCHEMA public to postgres;"
psql ime_baze -c "GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to postgres;"
Ovo je neophodno kako bi korisnik postgres imao prava da radi sa bazom šta mu je volja - tj. da kažeš bazi: "hej, ja sam te napravio i ima da me slušaš!"

Još jedna stvar može i ne mora da zeza. Naime, iz nekog razloga može da se desi da je pogrešan owner podešen svim tabelama nakon što su ponovo učitane i zato više ne možeš da izvršavaš migracije.

Veoma je važno da se OWNER postavi na user-a kojim se kačiš na bazu. Kod:

for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" YOUR_DB` ; do  psql -c "alter table $tbl owner to NEW_OWNER" YOUR_DB ; done

Ukoliko se postgres napravi pametan i traži šifru za postgres, to se prilično jednostavno menja ali se ja time ovde neću baviti.

Srećno čuvanje živaca sa bazama podataka!

Коментари

Популарни постови