Русский
Русский
English
Статистика
Реклама

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

В короткой заметке описан 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. Создать папки хранения и добавить скрипты

Создать папки.
mkdir -p /postgres/wal_arcchown postgres:postgres /postgres/wal_arcmkdir -p /postgres/backupchown postgres:postgres /postgres/backupsmkdir -p /postgres/scriptschown postgres:postgres /postgres/scripts

Cкрипты в папке /postgres/scripts
pg_receivewal.sh
#!/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
#!/bin/bash# rename.sh# /postgres/scripts/for f in /postgres/wal_arc/*.partial;do  mv -- "$f" "${f%.partial}"doneexit 0

2. Запустить непрерывное архивирование WAL-файлов

Настроить файл .pgpass, для запуска pg_receivewal без пароля:
vi ~/.pgpass    localhost:5432:*:postgres:postgreschmod 0600 ~/.pgpass

Настроить сервис для запуска pg_receivewal.Пользователь root.
pg_receivewal.service
########################################################### /etc/systemd/system/# pg_receivewal.service[Unit]Description=Receiving for WAL stream[Service]Type=simpleWorkingDirectory=/postgres/scriptsUser=postgresGroup=postgresExecStart=/postgres/scripts/pg_receivewal.sh[Install]WantedBy=multi-user.target

Запускаем сервис.Пользователь root
systemctl daemon-reloadsystemctl 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 completepg_basebackup: checkpoint completedpg_basebackup: base backup completed

5. Имитируем катастрофу БД

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

6. Восстановление БД

Создать папки файлов данных и WAL:
mkdir /postgres/pgdatachown postgres:postgres /postgres/pgdatachmod 750 /postgres/pgdata mkdir /postgres/waldirchown postgres:postgres /postgres/waldirchmod 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/pgdatals -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
К списку статей
Опубликовано: 28.10.2020 20:04:59
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Postgresql

Recovery

Backup

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru