[PostgreSQL] Этюд по PITR в PostgreSQL штатными средствами

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
28-Окт-2020 22:32

В короткой заметке описан cценарий Point In Time Recovery с использованием средств из стандартной поставки PostgreSQL версии 11.
Для создания базовой резервной копии используется штатная утилита — pg_basebackeup.
Для потоковой архивации файлов WAL используется штатная утилита — pg_receivewal
Общий сценарий довольно подробно описан в документации Непрерывное архивирование и восстановление на момент времени (Point-in-Time Recovery, PITR), однако довольно общими фразами. Поэтому при попытке реализовать на практике возникли некоторые, хотя и вполне преодолимые шероховатости.
Посмотрел по поиску на Хабре, вроде не нашел статей о PITR штатными средствами. Так, что может быть кому то пригодится, в качестве шаблона-рыбы.
Конфигурация для тестирования — самая простая, один сервер RedHat Linux, один сервис PostgreSQL(pgdata=/postgres/pgdata, waldir=/postgres/waldir), pg_receivewal запускается от имени postgres, заполнение тестовыми данными не уточняется и оставлено на личноe усмотрение.
Порядок действий по пунктам
1. Создать папки хранения и добавить скрипты

Создать папки.

SPL
mkdir -p /postgres/wal_arc
chown postgres:postgres /postgres/wal_arc
mkdir -p /postgres/backup
chown postgres:postgres /postgres/backups
mkdir -p /postgres/scripts
chown postgres:postgres /postgres/scripts

Cкрипты в папке /postgres/scripts

pg_receivewal.sh

SPL
#!/bin/bash
# pg_receivewal.sh
# /postgres/scripts/
pg_receivewal --no-loop --synchronous --slot=slot_receivewal --directory=/postgres/wal_arc --verbose --host=localhost > /postgres/scripts/pg_receivewal.log 2>&1

rename.sh

SPL
#!/bin/bash
# rename.sh
# /postgres/scripts/
for f in /postgres/wal_arc/*.partial;
do
  mv -- "$f" "${f%.partial}"
done
exit 0

2. Запустить непрерывное архивирование WAL-файловНастроить файл .pgpass, для запуска pg_receivewal без пароля:
vi ~/.pgpass
    localhost:5432:*:postgres:postgres
chmod 0600 ~/.pgpass

Настроить сервис для запуска pg_receivewal.Пользователь root.

pg_receivewal.service

SPL
##########################################################
# /etc/systemd/system/
# pg_receivewal.service
[Unit]
Description=Receiving for WAL stream
[Service]
Type=simple
WorkingDirectory=/postgres/scripts
User=postgres
Group=postgres
ExecStart=/postgres/scripts/pg_receivewal.sh
[Install]
WantedBy=multi-user.target

Запускаем сервис.Пользователь root
systemctl daemon-reload
systemctl start pg_receivewal.service

Проверяем.Пользователь root.
systemctl status pg_receivewal.service

В случае успешного старта получаем ответ
● pg_receivewal.service - Receiving for WAL stream
   Loaded: loaded (/etc/systemd/system/pg_receivewal.service; disabled; vendor preset: disabled)
   Active: active (running) since...

3. Заполнение тестовыми данными Любым способом, на усмотрение читателя.
4. Создание базовой резервной копии. Все стандартно и тривиально:
pg_basebackup  -D /postgres/backups/ --format=tar -Xs --progress --verbose

Получаем ответ о успешном выполнении:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed

pg_basebackup: base backup completed

5. Имитируем катастрофу БДОстановить сервер PostgreSQL любым способом.
Удалить папки файлов данных и WAL:
rm -rf /postgres/pgdata
rm -rf /postgres/waldir

6. Восстановление БДСоздать папки файлов данных и WAL:
mkdir /postgres/pgdata
chown postgres:postgres /postgres/pgdata
chmod 750 /postgres/pgdata
mkdir /postgres/waldir
chown postgres:postgres /postgres/waldir
chmod 750 /postgres/waldir

Восстановить файлы данных из базовой резервной копии:
cd /postgres/backups
cp base.tar /postgres/pgdata
cd /postgres/pgdata
tar -xvf base.tar
rm base.tar
rm -r pg_wal
ln -s /postgres/waldir pg_wal

В папке /postgres/wal_arc имеется неполный файл WAL(с расширением partial), нужно его переименовать, на случай если точка восстановления окажется в незаполненном файле WAL. Переименовать файл — вручную или скриптом rename.sh:
/postgres/scripts/rename.sh

Для восстановления на заданную точку во времени необходимо подготовить файл recovery.conf:
restore_command = 'cp /postgres/wal_arc/%f  %p'
recovery_target_time = '*****'
recovery_target_action=promote

recovery_target_time задается требуемая временная точка восстановления в формате timestamp.
Запустить сервис PostgreSQL любым доступным способом.
Файл recovery.conf переименован в recovery.done ?
cd /postgres/pgdata
ls -la recovery.done

Если файл переименован-восстановление прошло успешно.
Дополнительно полезно убедиться, что лог файл содержит следующие строки:
starting point-in-time recovery to ...
database system is ready to accept connections

В случае успешного восстановления перезапускаем потоковую архивацию файлов WAL:
pg_receivewal --create-slot --slot=slot_receivewal --verbose
Пользователь root
systemctl start pg_receivewal.service

Итог:
В самом простом сценарии, База Данных восстановлена на требуемую точку во времени.
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_postgresql, #_postgresql, #_recovery, #_backup, #_postgresql
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 23-Ноя 00:43
Часовой пояс: UTC + 5