Восстановление базы postgresql до нужного момента времени

Thank you for reading this post, don't forget to subscribe!

Схе­ма бэка­па с воз­мож­но­стью вос­ста­нов­ле­ния до опре­де­лен­но­го времени

 

В настрой­ках postgresql.conf необ­хо­ди­мо указать

archive_mode = on

archive_command = 'cp %p /cluster/wal/%f'  # ука­зать путь, куда будут копи­ро­вать­ся wal log

 

Опци­о­наль­но мож­но доба­вить пара­мет­ры, кото­рые будут сохра­нять wal_log через опре­де­лен­ный про­ме­жу­ток вре­ме­ни и/или при дости­же­нию опре­де­лен­но­го размера

Так­же пара­метр копи­ро­ва­ния мож­но изме­нить под скрипт или архи­ва­цию (в слу­чае, если это­го тре­бу­ют обстоятельства)

Дан­ные пара­мет­ры поз­во­ля­ют копи­ро­вать wal_log в ука­зан­ную дирек­то­рию. Ука­зан­ная дирек­то­рия долж­на иметь поль­зо­ва­те­ля postgres, и иметь пара­мет­ры 0700

 

Так­же в скрип­те бэка­па сле­ду­ет ука­зать через какое вре­мя уда­лять забэкап­лен­ные дан­ные, кото­рые уже не понадобятся

find "$BASE_DIR/" -mindepth 1 -type d -mtime +7 -print0 | xargs -0r rm -rfv

Схе­ма вос­ста­нов­ле­ния БД postgres с воз­мож­но­стью отка­та на опре­де­лен­ное время

Скрипт дол­жен запус­кать­ся из дирек­то­рии, в кото­рой будут пра­ва на чте­ние и выпол­не­ние поль­зо­ва­те­ля postgres

В фай­ле pg_gba.conf на сер­ве­ре, на кото­ром будет вос­ста­нов­ле­ние дол­жен быть про­пи­сан хост, роль и поль­зо­ва­тель для репликации

host    replication     postgres        10.242.144.156/32       md5

 

Вре­мя вос­ста­нов­ле­ния нуж­но будет выбрать из пред­ло­жен­ных вариантов

Невоз­мож­но будет вос­ста­но­вить базу, на срок мень­ше, чем вре­мя бека­па резерв­ной копии.

Схе­ма для вос­ста­нов­ле­ния standolone БД

Убеж­да­ем­ся, что wal log нахо­дят­ся в нуж­ной дирек­то­рии и име­ет­ся нуж­ная вре­мен­ная метка

Для вос­ста­нов­ле­ния базы необ­хо­ди­мо запу­стить скрипт для мастера

Скрипт: оста­нав­ли­ва­ет postgres, опци­о­наль­но копи­ру­ет суще­ству­ю­щий ката­лог БД, уда­ля­ет суще­ству­ю­щую БД, копи­ру­ет БД из бэка­па, отка­ты­ва­ет БД к нуж­но­му вре­мен­но­му про­ме­жут­ку, запус­ка­ет postgres.

 

Схе­ма для вос­ста­нов­ле­ния обыч­ной репли­ка­ции без фейловераba

Убеж­да­ем­ся, что wal log нахо­дят­ся в нуж­ной дирек­то­рии и име­ет­ся нуж­ная вре­мен­ная метка

На масте­ре запу­стить скрипт

Скрипт: оста­нав­ли­ва­ет postgres, опци­о­наль­но копи­ру­ет суще­ству­ю­щий ката­лог БД, уда­ля­ет суще­ству­ю­щую БД, копи­ру­ет БД из бека­па, отка­ты­ва­ет БД к нуж­но­му вре­мен­но­му про­ме­жут­ку, запус­ка­ет postgres.

На слей­ве запу­стить скрипт для слейва

Запус­ка­ем скрипт для слейва

Скрипт: оста­нав­ли­ва­ет postgres, копи­ру­ет postgres.conf и pg_hba.conf, уда­ля­ет суще­ству­ю­щую БД, копи­ру­ем базу с масте­ра, вос­ста­нав­ли­ва­ет postgres.conf и pg_hba.conf, запус­ка­ет postgres

 

P.S

Если после вос­ста­нов­ле­ния БД сра­зу запу­стить еще раз вос­ста­нов­ле­ние, то может воз­ник­нуть баг (при вос­ста­нов­ле­нии БД в дирек­то­рии wal логов авто­ма­ти­че­ски фор­ми­ру­ют­ся n-ное коли­че­ство wal логов, кото­рые впо­след­ствии пере­за­пи­сы­ва­ют­ся), кото­рый копи­ру­ет пусты сфор­ми­ро­ван­ные wal логи в дирек­то­рию с резерв­ны­ми wal лога­ми, и пере­за­пи­сы­ва­ет суще­ству­ю­щие wal логи.

 

Схе­ма для вос­ста­нов­ле­ния БД на кла­сте­ре patroni

В отли­чии от standalone и обыч­ной репли­ка­ции, patroni на осно­ве postgresql до 12 вер­сии не под­дер­жи­ва­ет вос­ста­нов­ле­ние до опре­де­лен­но­го времени.

В слу­чае, если база упа­ла, то ее мож­но вос­ста­но­вить до момен­та, когда был сохра­нен послед­ний wal log файл.

Важ­но, что­бы бэкап wal log фай­лов был в одну общую дирек­то­рию, для того, что­бы при пере­клю­че­нии лиде­ра меж­ду сре­рве­ра­ми, бэка­пы про­дол­жи­ли заливаться

Для вос­ста­нов­ле­ния необ­хо­ди­мо оста­но­вить кла­стер patroni на нодах

Далее на одной ноде, кото­рая будет лиде­ром, под поль­зо­ва­те­лем пост­грес выполняем:

rm -rf /var/lib/pgsql/10/data/*      # Уда­ля­ем фай­лы из дирек­то­рии постгреса

cp -r /cluster/tst-vsrv-pg1/2021-05-12/* /var/lib/pgsql/10/data/         # Копи­ру­ем бэкап базы в дирек­то­рию data

rm -rf /var/lib/pgsql/10/data/pg_wal/*         # Уда­ля­ем ста­рые wal log

cp -r /cluster/wal/* /var/lib/pgsql/10/data/pg_wal/             # Копи­ру­ем забэкап­лен­ные wal log

 

Запус­ка­ем patroni, ждем когда база под­ни­мет­ся, и пере­хо­дим к ноде-реплике

 

На ноде-репли­ке:

rm -rf /var/lib/pgsql/10/data/*

 

Запус­ка­ем patroni, база под­тя­нет­ся автоматически

 

Успеш­ное вос­ста­нов­ле­ние базы запу­стит новую вре­мен­ную линию, и суще­ству­ю­щий бекап уже вос­ста­но­вить не получиться.

Скрипт бэка­па БД

 

Скрипт вос­ста­нов­ле­ния БД на мастере

 

Вос­ста­нов­ле­ние базы на слейве