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:
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:
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!
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
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š!"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;"
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!
Коментари
Постави коментар