Postgresql varundus
Postgresi dump
Postgresil on kaks suurt dumpimisviisi
- 1. pg_dump - dump per andmebaas. Lisaks saab anda võtmeid:
- -Fc - customized - see tekitab Postgresi enda binaarkujul faili. Eelis on selles, et seda saab restoreda mitme paralleelse protsessina. Puudus see, et dumpida saab ainult ühe protsessiga.
- -Fd - directory - see tekitab Postgresi enda vahenditega kausta, kus sees on siis .dat ja .dat.gz failid. Eeliseks see, et nii dump kui restore on võimalik paralleelsete protsessidega teha. Miinuseks see (või vähemalt ma ei suutnud seda olukorda vältida), et kõigepealt tuleb andmebaas(-id) ja vajalikud kasutajad ise luua. Väga suurt katastroofi pole, arvestades ajalist võitu, mis see annab.
- -Fp - plain ehk kui võtit ei anna/default käitumine on see, et tehakse plaintext kujul koos kõigi saba ja karvadega andmebaasi dump. Eeliseks see, et saab ette anda psql käsureautikale. Miinuseks see, et maru aeglane ja maru palju võtab ruumi (st vajab eraldi nt pakkimist).
- 2. pg_dumpall - tekitab ühe suure faili kogu postgresi sisust
- Eks võtmetega saab muidugi piirata, et pg_dumpall teeks ainult data ja ainult schemad jnejne, aga vaatame üldisemaid juhtumeid. Kustomiseeritud vmt kuju pole, ainult plaintext.
Enamus allikaid, kust ma oma tarkusevett ammutan, räägivad pigem sellest -Fc kujust kui -Fd kujust.
Teeme kõigepealt postgresi globaalsetest elementidest dumpi siis on kindel, et saame alati vajalikud tablespaced (eraldi salvestuskohad, kui neid on määratud ja need erinevad konfist) ning kasutajad jms info
pg_dumpall --globals-only > $DATE-globals.sql
Selleks, et nüüd postgresi saaks uuendada, on vaja kõigepealt pärast initdb teha:
psql -f $DATE-globals.sql
ja siis juba teada-tuntud
pg_restore -j 4 -Fd -d databaas /srv/pgdump/$DATE-databaas/
Üks võimalus on teha psql utikaga päring, et mis baasid olemas on, ja dumpitakse pg_dump utikaga. Seega, midagi sellist:
# Saame teada olemasolevad baasid DATABASES=$(su postgres -c "psql -At -c 'select datname from pg_database where not datistemplate and datallowconn order by datname;'"
Kuna templatesid pole vaja restoreda, siis selle käsuga saame kätte kõik reaalsed andmebaasid. Templated tulevad nagunii initsialiseerimisel uuesti kaasa. Nüüd väike foreach tsükkel, mis IGA baasi jaoks teeb kustomiseeritud kujul dumpi.
for DB in ${DATABASES}; do pg_dump -U postgres -Fc $DB -f $PGDUMPDIR/$DATE-$DB.sql done
Sellega saame endale kuupäeva järgi kõikidest baasidest kustomiseeritud kujul dumbid. Directory kujul dumpimisest väga ei räägita, aga ikkagi mainin ära, et minu eilne dump ühest baasist kestis 35 minutit. Huvitaval kombel plaintext kokkupakituna (gzip) ja binary (ehk kustomiseeritud) kuju ei anna ei kiiruse- ega mahuvõitu. Varasema backupga võrreldes kestis praegu dump täpselt samakaua… - 1.5h. Seega, directory based võit on 1 tund. Kui -j parameetrit suurendada, saab ehk veel paremaks?
Seega, võib-olla ikkagi siis võtta kasutusele directory-dumpid, et võita dump + restore kiiruses?
Binaar ja directory based dumpid teevad muidugi selle raskemaks, et sealt pärast mingit infot “kopi-paste” kujul kätte saada. Kui seda peaks vaja olema? Plaintekstist on see ju muidugi lihtsam.
Küll aga saab per tabel taastada binaarkujust.
Postgres restore
pg_restore oskab taastada nii schemat kui schema seest tabelit, olenemata sellest, mis formaadis dump tehtud on. Küll aga tahab pg_restore saada pg_dump poolt tehtud faili. Seega, pg_restore ei kõlba kogu baasi taastamiseks ühest failist.
Näiteks kuidas taastada baasi, mis on dumbitud pg_dump -Fd parameetriga:
#-j = number of concurrent jobs # restore juures pole vaja -Fc/-Fd võtit ette anda pg_restore -d databaasi_nimi -j 4 /srv/pgdump/20160413-databaasi_nimi/
Kuna pg_dumpall tekitab plaintext faili, siis selle põhjal saab taastada kogu andmebaasi (või selle osa - käsitööna!) ainult faili psql utiliidile ette andes.
psql -f tehtud_dump.sql
Upgrade korral võib versioonivahe osutuda sedavõrd suureks, et vanad andmetabelid ei ühildu enam uue versiooniga. Seega tuleks esiteks ümbernimetada postgres data kataloog
mv /srv/postgres/data /srv/postgres/data-old
Seejärel teostada postgresi serveri upgrade
Minna kasutajat õigustesse
su - postgres
Initsialiseeirda uus andmekataloog
initdb --locale=et_EE.utf8 -E UNICODE -D '/srv/postgres/data'
Taastada konfiguratsioonifailid
cp /srv/postgres/data-old/postgresql.conf /srv/postgres/data/ cp /srv/postgres/data-old/pg_hba.conf /srv/postgres/data/
Ja taastasda baasi sisu, näiteks plaitext failist
psql -f /srv/postgres/varukoopia postgres