Postgres – vsetko, co si chtel vediet, ale bal sa spytat svojho seniora, aby si nevypadal ako jelito 03. Backup DB.
V postgrese existuju dva zakladne sposoby zalohy databaze:
logical backup – v zasade vydumpovanie obsahu databazy do textovych suborov. Vytvorenie INSERTov v suboroch. Dobre pre male databazy na desktope, negaranuje navrat k presne stanovenemu PITR. Utility pg_dump a pg_restore, pomerne jednoduchy postup. Nebudem sa tomu viac venovat.
physical backup – zaloha binarnych datovych files clusteru (tzv. base backup) a naslednych WAL logov. Idealne pre velke produkcne databaze s poziadavkom na konzistenciu dat a presnu definiciu PITR.
vlastne 3 – specialnym sposobom backupu je zalohovanie pomocou replikacie
horeuvedene moznosti su nativne pre standardnu instalaciu postgresu, inak existuju samozrejme riesenia tretich stran (opensource) – napr. pgBackRest, Barman etc… Ich vyhodou je, ze backup sa da posunut na standardnu uroven kontinualneho bekapovania, volba Full/Incremental/Differential etc…
Physical backup, alebo base backup
Zakladna myslienka je snapshot db clusteru a priebezne archivovanie WAL logov – t.j. potom je mozne lubovolne si zvolit PITR (Point In Time Recovery, alebo recovery target). Velkymi vyhodmami basebackupu je, ze a) nerobi locky na tabulkach a b) je pomerne rychly v porovnani s inymi backupami. Nevyhodou je, ze backupuje cely cluster a neda sa robit backup len parcialnych objektov (len jedna DB alebo nejaky objekt v DB).
Zakladnou utilitou je pg_basebackup, ktora je len wrapper pre binarky pg_start_backup a pg_stop_backup.
Priebeh backupu – spusti sa pg_start_backup, ktory urobi cekpoint databazy (tzv. REDO POINT) a vytvori backup_label file (subor, kde je okrem inych veci zaznamenany CHECKPOINT LOCATION – LSN cislo, kedy bol urobeny ceckpoint). Na konci sa spusti pg_stop_backup, ktory zmaze backup_label a vytvori backup_history file. Inak .backup file sa vytvara v adresari, kde sedia WAL logy…
Priebeh restoru – pri restore sa z checkpointu (REDO POINT) obnovi cluster a prehraju sa archivovane WAL logy do pozadovaneho bodu.
Restore procesne:
- Poziadavok na restore, zastavime posgresql stroj
- Odstranime vsetky subory v datarootu
- Nakopirujeme subory zo zalohy basebackupu do datarootu (pozor na opravnenia, vsetko ako postgres, bacha na symlinky pre
pg_tblspc/
) - Vytvorime si recovery.conf (vid nizsie), kam zadame hlavne cestu k archivovanym logom a pripadne dalsie parametry
- Nastartujeme DB server, ten podla recovery conf urobi restore
Ako prebieha restore: Postgres sa znova nastartuje a pokial ma v strukture subor backup_label a je tam pritomny konfigurak recovery.conf, tak sa prepne do PITR modu a bude rekoverovat cluster podla parametrov v konfiguraku, typicky priklad:
restore_command = 'cp /mnt/server/archivedlogs/%f %p' - lokalizacia archivovanych WAL logov recovery_target_time = '2018-09-24 05:012 GMT' - cas, do ktoreho chceme restorovat, pokial nie je uvedeny, tak recovery pouzije vsetky WAL logy a restorne to tam, kam az to pojde
Inak pr enapisanie recovery.conf je idealny vzorovy sample subor v /usr/share/postgresql/../recovery.conf.sample
Na konci restoru sa: a) zmaze recovery.conf a vytvori recovery.done (teda, on ho vlastne len premenuje, takze mas konf z posledneho restoru) a b) zapise subor timeline historie – 00000002.history – jeho inkrementalny nazov je tzv. timelineId – ukazatel na verziu clustru (po restore sa uz nejedna o povodny cluster, ale jeho kopiu.). Ma to pekne konzekvencie pre WAL logy – prvych 8 cifier nazvu WAL logu je totiz tento timelineId, tudiz logy generovane po restore databazy budu napr. 00000002000000000000000F. Obsahom suboru timeline.history je zkratkovit acharakteristika toho, odkial sa zacinalo (cas a LSN).
Basebackup cez API
Basebackup sa da spustat priamo v postgrese cez jeho API – SELECT pg_start_backup(‘label’, false, false); Vid doku.
Zaver
- Princip basebackupu je jednoduchy – urobi sa checkpoint kopia clustru a potom sa uz odlievaju len WAL logy. Pri restore sa obnovi kopia klastru a doluje sa logy do pozadovaneho bodu. Z toho vyplyva:
- bud si isty, ze logy archivujes a vies kam. Idealne na bezpecne miesto mimo DB server
- archivaciou logov NEZALOHUJES datafily a konfiguraky postgresu, len zmenovost databazovych dat
- archivacia WAL logov prebieha len na zaplnenych logoch, takze keep in mind, ze restore zalozeny na archivovanych logoch bude postradat info z posledneho (zapisujuceho) logu. Ukoncenie zapisu a odarchivovanie sa da vynutit cez
pg_switch_wal
- System timelinov vyplyva z nasledovneho scenara – pokial dropnem tabulku v utorok a pridem na to vo stvrtok, tak neni problem sa restorom vratit do utorka. Ale po case zistim, ze som to vlastne chcel restornut na stredu a mam problem, pretoze WAL logy sa uz medzitym prepisali. Preto je lepsie drzat oddelene vyvojove linie WAL logov s ciselnym prefixom, ktory ukazuje na separatne linie existencie databazy.
From the PostgreSQL version 12 onwards there is no recovery.conv file to perform recovery from basebackup
https://fluca1978.github.io/2019/07/08/PostgreSQL12Recovery.html
fluca
5 Nov 19 at 10:03
skvely komand, ked potrebujes urobit basebackup a pouzit ju pre restore ucely na inom stroji, ale nemas miesto na to, aby si to zabalil do taru a preniesol az potom.
Spusti to basebackup, zapakuje do taru, prepajpuje sshckom na druhy srtoj a tam rovno rozbaluje (nutne mat nazdielane ssh kluce):
pg_basebackup -D – -F t -P -R -X none | ssh DRUHY_SERVER ‘cd /var/lib/pgsql/11/data ; tar xf -‘
ďobo
13 Dec 19 at 15:21
priklad recovery.confu na replike:
standby_mode = ‘on’ #po zrekoverovaniu zostan v standby mode ako nahradna replika
primary_conninfo = ‘host=MASTER_HOSTNAME user=replication password=blablabla port=5432’ #po nasati wal logov zostan jako replika pre tento master
restore_command = ‘cp -f /var/lib/pgsql/wal_archive/%f %p’ #ked zacnes s restorovanim, tak wal logy z primaru su tu
archive_cleanup_command = ‘/usr/pgsql-11/bin/pg_archivecleanup -d /var/lib/pgsql/wal_archive/ %r 2>>/var/lib/pgsql/cleanup.log’ #ked uz nepotrebujeme archivovane logy, tak urob cleanup
recovery_target_timeline = ‘latest’ #restoruj az do posledneho bodu, pokial to ide
dobo
6 Mar 20 at 11:38
[…] a presunie si datove fily k sebe. Perfektne je, ze si sam vytvori recovery.conf (vid clanok backup db) zo vsetkymi nutnymi parametrami a po starte DB sa prisaje k slotu a sosa wal logy z mastru.cat […]
Postgres – vsetko, co si chtel vediet, ale bal sa spytat svojho seniora, aby si nevypadal ako jelito 06. Replikacie. at db.dobo.sk
28 Jul 20 at 8:29