LINUX.ORG.RU
ФорумAdmin

Barman, PostgreSQL и «перемотка» лога предзаписи

 , ,


0

1

Продолжаю разбираться с резервным копированием БД PostgreSQL. Появился следующий вопрос.

Насколько я понимаю, при восстановлении БД из архива Бармана, у меня получается директория с базовой копией + некоторое кол-во WAL файлов. При этом, при запуске PostgreSQL на базовую копию накатятся логи и БД придет в актуальное состояние.

Но мне непонятно каким образом сделать PITR, то есть я понимаю что можно восстановить на определенный момент времени или на определенную транзакцию, но как понять какую именно транзакцию мне надо или же в какой момент произошел сбой?

Вот допустим есть следующая последовательность транзакций:

- LSN: 1000 -> INSERT...
- LSN: 1001 -> INSERT...
- LSN: 1002 -> UPDATE...
- LSN: 1003 -> DELETE FROM...
- LSN: 1004 -> INSERT...
- LSN: 1005 -> UPDATE...

То есть, на транзакции 1003 произошло удаление и мне по идеи надо восстановиться до транзакции 1002 включительно и перевести БД в режим production.

Читая вдоль и поперек документацию, я так и не понял каким образом можно увидеть «глазами», что именно произошло с БД и при этом получить номер транзакции.

Не мог бы мне кто нибудь из знающих людей объяснить. Или я вообще ничего не понимаю в этом деле?


Читая вдоль и поперек документацию, я так и не понял каким образом можно увидеть «глазами», что именно произошло с БД и при этом получить номер транзакции.

Такой возможности нет, нужно либо заранее всё логировать (log_statement = all) что на более менее нормальном трафике не реально, либо анализировать журнал транзакций и содержимое файлов кучи после аварии

https://www.postgresql.org/docs/current/pgwaldump.html https://www.postgresql.org/docs/current/pageinspect.html

и искать проблемную команду там.

Обычно (например если авария произошла по ошибке разработчика) время аварии известно, например по журналу деплоя в teamcity и откат делают приблизительный +- 5 минут, этого обычно достаточно.

anonymous ()
Ответ на: комментарий от anonymous

Такой возможности нет

Ну вот я ее и не нашел видимо поэтому. Пока что я включил log_statement = mod, по идеи этого должно быть достаточно. Буду смотреть на производительность. Проблема этого подхода: что если осыпется диск, то и лога собственно не будет.

https://www.postgresql.org/docs/current/pgwaldump.html

Вот это интереснее.

alex07 ()

То есть, на транзакции 1003 произошло удаление и мне по идеи надо восстановиться до транзакции 1002 включительно и перевести БД в режим production.

Это разные транзакции, восстанавливаться можете на любую. Если же это одна логическая транзакция, то и делайте

begin

update ...

delete ..

commit

anonymous ()
Ответ на: комментарий от alex07

WAL - это все закоммиченные транзакции Checkpoint - точка, где блоки данных файлов БД были сброшены из памяти на диск

Находишь последний чекпоинт и накатываешь транзакции до нужного момента времени. Т е у тебя в WAL все «правильные» изменеия данных, точка, до которой накатываеть - это время, а не транзакция.

Почему ты решил, что нужно останавливаться на delete ?

anonymous ()