Skip to content

восстановление бэкапов на определенный момент времени #480

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
SergeyQIWI opened this issue Apr 6, 2022 · 2 comments

Comments

@SergeyQIWI
Copy link

Добрый день!

Интересует восстановление бэкапов на момент времени.

Исходные данные:
pg16 сервер бэкапов
pg15 сервер, на который восстанавливается бэкап
pg28 сервер, с которого создаются бэкапы
Удаленные сервера
Oracle Linux Server release 7.3, PostgreSQL 10.20
pg_probackup-10 2.5.5 (PostgreSQL 10.19)

Удаленный сервер postgresql.conf (pg28)
archive_mode = on
archive_command = '/usr/bin/pg_probackup-10 archive-push -B /u01/pg_probackup --instance=pg28 --wal-file-path=%p --wal-file-name=%f --remote-host=pg16.test --remote-user=postgres'
На сервере бэкапов имеем:
pg_probackup-10 2.5.5 (PostgreSQL 10.19)

[pg16:postgres]$ pg_probackup-10 show --instance pg28 -B /u01/pg_probackup

Instance  Version  ID      Recovery Time           Mode   WAL Mode  TLI  Time    Data   WAL  Zratio  Start LSN   Stop LSN    Status
pg28      10       R9X2DS  2022-04-06 14:54:24+03  FULL   ARCHIVE   1/0   33s  2659MB  16MB    1.00  2/8C000028  2/8D0000F0  OK
pg28      10       R9X225  2022-04-06 14:47:37+03  FULL   STREAM    1/0   51s  2659MB  32MB    1.00  2/8A000028  2/8A000198  OK
pg28      10       R9WZLN  2022-04-06 13:54:30+03  FULL   STREAM    1/0   50s  2659MB  16MB    1.00  2/6D000060  2/6D000208  OK
pg28      10       R9WXC1  2022-04-06 13:05:36+03  FULL   STREAM    1/0   51s  2659MB  32MB    1.00  2/67000060  2/670001D0  OK
pg28      10       R9WPFR  2022-04-06 10:14:55+03  FULL   ARCHIVE   1/0   41s  2658MB  16MB    1.00  2/59000028  2/5A0000F0  OK
pg28      10       R9WOVE  2022-04-06 10:02:27+03  DELTA  STREAM    1/1   31s   819kB  16MB    1.00  2/57000028  2/57000198  OK
pg28      10       R9VE4N  2022-04-05 17:12:40+03  DELTA  STREAM    1/1   21s   379kB  16MB    1.00  2/2E000028  2/2E000198  OK
pg28      10       R9VDMO  2022-04-05 17:01:56+03  DELTA  STREAM    1/1   22s   379kB  16MB    1.00  2/2B000028  2/2B000198  OK
pg28      10       R9VCGC  2022-04-05 16:36:54+03  FULL   STREAM    1/0   49s  2658MB  32MB    1.00  2/25000028  2/25000198  OK 

Бэкапы делались следующими командами:
pg_probackup-10 backup -B /u01/pg_probackup --instance pg28 -b FULL --stream -j2 --remote-host=pg28.test.osmp.ru --remote-user=postgres -U barman -d pgbackup
pg_probackup-10 backup -B /u01/pg_probackup --instance pg28 -b delta --stream -j2 --remote-host=pg28.test.osmp.ru --remote-user=postgres -U barman -d pgbackup
pg_probackup-10 backup -B /u01/pg_probackup --instance pg28 -b FULL --remote-host=pg28.test.osmp.ru --remote-user=postgres -U barman -d pgbackup

Для проверки корректности восстановления на заданное время работает крон (pg28)
*/10 * * * * psql -c 'insert into timing(select now());select pg_switch_wal();'

Восстановление бэкапов проводилось после создания последнего бэкапа, плюс некоторое время (дельта) , чтобы отработал крон (вставилась строка в таблицу и переключился wal и этот wal оказался на сервере бэкапов)
Восстановление определенного бэкапа проверил, работает отлично.
pg_probackup-10 restore --instance=pg15 -D /opt/postgres/10 -i R9VCGC --remote-proto=ssh --remote-host=pg15.test.osmp.ru --archive-host=pg15 --log-level-console=log --log-level-file=verbose --log-filename=restore_pg15.log

А вот восстановление на определенный момент времени никак не получается.
а)
Если брать бэкап с WAL Mode = STREAM, то бэкап восстанавливается на момент времени создания бэкапа. Сужу по последнему примененному WAL и таблице , заполняющейся по крону.
К тому же нашел вот это #470, где говориться, что при таком виде (stream) восстановится на определенный момент времени не возможно
pg_probackup-10 restore --instance=pg28 -D /opt/postgres/10 -j 1 --recovery-target-time='2022-04-05 14:45:00' --progress --remote-proto=ssh --remote-host=pg15.test.osmp.ru --log-level-console=log --log-level-file=verbose --log-filename=restore_time.log

б)
Если брать бэкап с WAL Mode = ARCHIVE, то WAL не копируются на удаленный сервер и при поднятии кластера ошибка
2022-04-06 14:43:15 MSK [32603]: [1-1]: INFO: pg_probackup archive-push WAL file: 000000010000000200000073, threads: 1/1, batch: 1/1, compression: none
2022-04-06 14:43:15 MSK [32603]: [1-1]: ERROR: Cannot open source file "/opt/postgres/10/pg_wal/000000010000000200000073": No such file or directory
2022-04-06 14:43:15 MSK [32600]: [1-1] user=,db= 00000 LOG: archive command failed with exit code 1

исправляется легко копированием WAL на удаленный сервер c сервера бэкапов scp * pg15.test.osmp.ru:/$PGDATA/pg_wal. (PS при большом количестве wal журналов на сервере бэкапов это будет затруднительно сделать)

Подскажите, что настроено/делается не так?

pg_probackup-10 show-config --instance pg28 -B /u01/pg_probackup | grep -v '#'
pgdata = /opt/postgres/10
system-identifier = 7020398115032853815
pgdatabase = backupdb
pghost = pg28.test.osmp.ru
pguser = barman
replica-timeout = 5min
archive-timeout = 5min
log-level-console = INFO
log-level-file = LOG
log-filename = backup_cron.log
log-directory = /u01/pg_probackup/backups/pg28
log-rotation-size = 0TB
log-rotation-age = 0d
retention-redundancy = 1
retention-window = 3
wal-depth = 1
compress-algorithm = none
compress-level = 1
remote-proto = ssh
remote-host = pg28.test.osmp.ru
remote-user = postgres

@slothfk
Copy link

slothfk commented Apr 7, 2022

Вам надо укзаать откуда серверу, на который проихсодит восстановление, брать журналы
Для этого можно использовать параметры --archive-host, --archive-user и --archive-port
Т.е. схема такова, что журналы не "приезжают" вместе с восстановленной копией, а тянутся с сервера резервных копий "на лету" в процессе восстановления

Механизм когда журналы будут презжать вместе с копией обещались реализовать

Хотя, у нас используются копии не STREAM и ARCHIVE, но с указанными параметрами все восстанавливается как надо

@SergeyQIWI
Copy link
Author

Спасибо большое.
Восстановление на заданное время отработало.

Применил параметр --archive-host и в команду добавил restore_command

pg_probackup-10 restore -B /u01/pg_probackup --instance=pg28 --remote-user=postgres --recovery-target-time='2022-04-07 17:42:00+3'
--remote-host=pg15.test.osmp.ru --archive-host=pg16.test.osmp.ru
restore_command = '"/usr/bin/pg_probackup-10" archive-get -B "/u01/pg_probackup/wal/pg28"
--instance "pg28" --wal-file-path=%p --wal-file-name=%f --remote-host=pg16.test.osmp.ru --remote-user=barman'

где -B "/u01/pg_probackup/wal/pg28" - путь до wal журналов на сервере бэкапов

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants