[PostgreSQL] Этюд по PITR в PostgreSQL штатными средствами
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
В короткой заметке описан 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
===========
Похожие новости:
- [Open source, PostgreSQL, Администрирование баз данных] Знакомство с pg_probackup. Третья часть
- [PostgreSQL, Карьера в IT-индустрии] PostgreSQL: кому и зачем нужны продвинутые навыки работы?
- [PostgreSQL, SQL, Алгоритмы, Ненормальное программирование] SQL HowTo: обрабатываем дерево — упорядочиваем иерархию с рекурсией и без
- [PostgreSQL, Django, Apache] Поднимаем Django стек на MS Windows
- [PostgreSQL] PostgreSQL 14: Часть 2 или «в тени тринадцатой» (Коммитфест 2020-09)
- [Администрирование баз данных, SQL, PostgreSQL, MySQL] Восемь интересных возможностей PostgreSQL, о которых вы, возможно, не знали (перевод)
- [PostgreSQL, SQL, Ненормальное программирование] «Жизнь» на PostgreSQL
- [Microsoft SQL Server, Администрирование баз данных, Резервное копирование] MS SQL Server: BACKUP на стероидах
- [API, MySQL, PHP, PostgreSQL, Разработка под Linux] Создание современного API на PHP в 2020 году
- [Open source, PostgreSQL, Администрирование баз данных] Знакомство с pg_probackup. Вторая часть
Теги для поиска: #_postgresql, #_postgresql, #_recovery, #_backup, #_postgresql
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:43
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
В короткой заметке описан 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. Создать папки хранения и добавить скрипты Создать папки.SPLmkdir -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.shSPL#!/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.shSPL#!/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.serviceSPL##########################################################
# /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
systemctl start pg_receivewal.service
Итог: В самом простом сценарии, База Данных восстановлена на требуемую точку во времени. =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:43
Часовой пояс: UTC + 5