Инструкция по восстановлению резервной копии кластера СУБД Postgres

    Инструкция по восстановлению резервной копии кластера СУБД Postgres

    0. База данных (кластер) размещена в /DATABASE/data

    Резервные копии размещены в /BACKUP/db/ггггммдд

    Используется PostgreSQL-12.

    1. Остановим кластер

    # service postgresql-12 stop

    2. Переименуем каталог с текущим кластером. Он может понадобится для разбора полётов.

    # mv /DATABASE/data /DATABASE/data1

    3. Чтобы не забыть что за кластер у нас тут лежит, обязательно делаем пометку.

    # touch /DATABASE/data1/readme

    # mcedit /DATABASE/data1/readme

    Пишем кратко, что случилось.

    30.08.2022 Иванов Петр ==================

    Ночью электрики на спор дернули рубильник, всё погасло. На утро база при запуске крашнулась. Восстанавливаю бэкап за 29.08.2022. Если всё нормально, через месяц этот кластер можно удалить.

    ==================================

    Сохраняем.

    4. Создадим каталог для базы которую будем восстанавливать.

    # mkdir /DATABASE/data

    Примечание: Если мы всё делали по инструкции, то наша резервная копия состоит из двух архивов:

    base.tar.gz - собственно резервная копия кластера

    pg_wal.tar.gz - wal файлы. Этот архив нам поможет "докатить" все транзакции, которые были сделаны например в момент выполнения резервного копирования.

    5. Переместим архив кластера в каталог (так быстрее) и разархивируем его.

    # mv /BACKUP/db/20220829/base.tar.gz /DATABASE/data

    # tar xzf /DATABASE/data/base.tar.gz

    6. Переместим архив кластера обратно (так быстрее).

    # mv /DATABASE/data/base.tar.gz /BACKUP/db/20220829

    7. Создадим каталог для WAL файлов и разархивируем в него pg_wal.tar.gz.

    # mkdir /DATABASE/pg_wal

    # mv /BACKUP/db/20220829/pg_wal.tar.gz /DATABASE/pg_wal

    # tar xzf /DATABASE/pg_wal/pg_wal.tar.gz

    # mv /DATABASE/pg_wal/pg_wal.tar.gz /BACKUP/db/20220829

    8. Просто так, запускать кластер не получится. Нам нужно сообщить СУБД, что мы восстанавливаем её из резервной копии. Для этого необходимо в каталоге кластера создать файл recovery.signal

    # touch /DATABASE/data/recovery.signal

    9. После всех манипуляций, необходимо всем каталогам с которыми будет работать Postgres установить владельца postgres.

    # chown -R postgres:postgres /DATABASE

    10. Откройте файл конфигурации кластера:

    # mcedit /DATABASE/data/postgresql.conf

    11. Долистайте до секции Archive Recovery, раскомментируйте restore_command и впишите:

    restore_command = 'cp /DATABASE/pg_wal/%f %p'

    Получится также как на картинке:

    Сохраните файл.

    12. Запускаем кластер

    # service postgresql-12 start

    Он немного подумает и запустится.

    13. Проверяем, что всё хорошо.

    # psql -U postgres

    postgres#\l+

    Смотрим, что базы на месте и они не пусты.

    14. Кластер восстановлен. Чистим за собой.

    # rm -rf /DATABASE/pg_wal

    Идеи, баги, вопросы?

    Сообщи нам t.me/screensquid