Postgresql varundus

Allikas: Kuutõrvaja
Redaktsioon seisuga 17. aprill 2016, kell 20:08 kasutajalt Jj (arutelu | kaastöö) (Postgres restore)
(erin) ←Vanem redaktsioon | Viimane redaktsiooni (erin) | Uuem redaktsioon→ (erin)

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