Можно ли дважды восстановить БД из WAL? - PullRequest
0 голосов
/ 10 октября 2019

У меня есть основной сервер базы данных, который периодически архивируется на s3. Таким образом, s3 имеет «снимок» базы данных со всеми соответствующими последними WAL. У меня есть другой (локальный) сервер базы данных, который я хочу периодически обновлять, чтобы он соответствовал состоянию основного сервера базы данных. Поэтому я однажды скопировал «главный» каталог из s3 и применил все WAL из s3 с помощью restore.conf. Единственное, что я изменил в этом файле:

restore_command = 'aws s3 cp s3://%bucketName%/database/pg_wal/%f %p'

Это было успешно. Через некоторое время я хочу применить все последние WALs от s3, чтобы быть «более синхронизированными» с основным сервером базы данных. Можно ли это как-то сделать? Я точно знаю, что я не делал никаких обновлений или записей на моем "скопированном" сервере базы данных. Когда я пытаюсь сделать это точно так же, как и раньше , я получаю следующие ошибки (от stderr):

fatal error: An error occurred (404) when calling the HeadObject 
operation: Key "database/pg_wal/00000001000001EF0000001F" does not 
exist
fatal error: An error occurred (404) when calling the HeadObject 
operation: Key "database/pg_wal/00000002.history" does not exist
fatal error: An error occurred (404) when calling the HeadObject 
operation: Key "database/pg_wal/00000001.history" does not exist
fatal error: An error occurred (403) when calling the HeadObject 
operation: Forbidden
fatal error: An error occurred (403) when calling the HeadObject 
operation: Forbidden
fatal error: An error occurred (403) when calling the HeadObject 
operation: Forbidden
fatal error: An error occurred (403) when calling the HeadObject 
operation: Forbidden
fatal error: An error occurred (403) when calling the HeadObject 
operation: Forbidden

Это более подробное описаниемоей процедуры:

У меня есть две директории на s3: basebackup и pg_wal. basebackup содержит файлы base, global, pg_logical, pg_multixact, pg_xact, PG_VERSION, backup_label.

При первом восстановлении я делаюследующие:

  1. Stop postgres

  2. aws s3 sync s3://%bucketname%/basebackup ~/10/main

  3. mkdir пустые каталоги в ~/10/main

  4. скопировано recovery.conf.sample в ~/10/main/recovery.conf

  5. изменить recovery.conf как указано выше

  6. start PostgreSQL

Когда я делаю это снова через некоторое время, я делаю шаги 1, 4, 5, 6 и получаю описанный результат.

Возможно, мне нужно как-то указать первый WAL из корзины s3 для восстановления? Потому что мы уже восстановили некоторые из них раньше. Или это вообще невозможно?

1 Ответ

1 голос
/ 10 октября 2019

В ваших процедурах, кажется, что-то не так:

  • Полная резервная копия состоит не только из файлов и каталогов, перечисленных выше, но и из complete каталог данных (pg_wal / pg_xlog может быть пустым).

  • После первого восстановления PostgreSQL выберет новую временную линию, переименует backup_label и recovery.confи создать обычную базу данных.

    Невозможно возобновить восстановление такой базы данных. Я не знаю, что именно вы сделали, чтобы снова войти в режим восстановления, но вы, должно быть, что-то сломали.

Как только база данных завершит восстановление, единственный способ продолжить восстановление - этовосстановите исходную резервную копию снова и восстановите с начала.

Рассматривали ли вы возможность восстановления на определенный момент времени с recovery_target_action = 'pause'? Тогда PostgreSQL останется в режиме восстановления, и вы сможете выполнять запросы к базе данных. Чтобы продолжить восстановление, определите новую цель восстановления и перезапустите сервер.

...