19 Занятие 19: Резервное копирование / Использование pg_probackup
Исходная страница в нативном Markdown: Резервное копирование / Использование pg_probackup
Примечание
Эта страница извлечена из официального PDF в нативный Markdown. Текст слайдов, код и комментарии сохранены в порядке чтения; исходные PDF и HTML остаются эталоном макета.
HTML source:pgpro_19_probackup_2.htmlArchive:PGPRO-handouts-16.zipСтраниц PDF: 38
Page 1: Резервное копирование / Использование pg_probackup
Некоммерческое использование материалов курса (презентации, демонстрации) разрешается без ограничений. Коммерческое использование возможно только с письменного разрешения компании Postgres Professional. Запрещается внесение изменений в материалы курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу: edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за любые повреждения и убытки, включая потерю дохода, нанесенные прямым или непрямым, специальным или случайным использованием материалов курса. Компания Postgres Professional не предоставляет каких-либо гарантий на материалы курса. Материалы курса предоставляются на основе принципа «как есть» и компания Postgres Professional не обязана предоставлять сопровождение, поддержку, обновления, расширения и изменения.
Читаются все файлы данных, но в копию попадают только измененные с последнего копирования страницы
Комментарии преподавателя
Инкрементальная копия включает в себя все изменения, произошедшие после создания какой-либо другой копии.
Полная копия и набор последующих инкрементальных копий образуют цепочку. При восстановлении кластера из инкрементальной копии pg_probackup восстанавливает родительскую полную копию, а затем применяет к ней последовательно инкрементальные копии, останавливаясь после целевой.
Утилита pg_probackup поддерживает три режима инкрементального резервного копирования: DELTA, PAGE и PTRACK.
Режим DELTA — разностное копирование. Страницы файлов в каталоге данных сравниваются со страницами из последней резервной копии. В новую резервную копию попадают только измененные с момента последнего копирования страницы.
Достоинство режима DELTA — его простота: не требуется архив WAL и не надо устанавливать дополнительные расширения. Однако есть и недостаток: объем ввода-вывода может оказаться почти таким же, как при полном резервном копировании.
Если указана инкрементальная копия, применяется цепочка копий, начиная с полной
Комментарии преподавателя
Если команде restore утилиты указать инкрементальную копию, pg_probackup восстановит родительскую полную копию и затем последовательно применит нужные инкрементальные копии.
Если идентификатор копии не указан, выполняется восстановление из самой последней имеющейся копии (включая копии из цепочки, если последняя копия — инкрементальная).
Page 6: Копирование DELTA
Создадим базу данных, к которой будет подключаться роль backup.
You are now connected to database "pgpro_probackup_2" as user "student".
Мы будем запускать утилиту локально от имени пользователя ОС student, а агент на удаленном сервере будет обращаться к файлам кластера от имени postgres. Необходимые настройки в виртуальной машине курса уже произведены.
Подготовим локальный каталог копий, владелец файлов — student.
Каталог PGDATA принадлежит пользователю ОС postgres и группе postgres, и экземпляр обычно запускается от имени postgres. Если указан параметр –allow-group-access, при восстановлении дополнительно выдаются права на чтение и доступ в каталог группе postgres — это позволит в будущем выполнять резервное копирование от имени членов группы, не используя максимальные привилегии root.
Сначала сформируем полную резервную копию удаленного сервера, используя потоковую доставку записей WAL:
student$ pg_probackup show \
-B /var/probackup --instance ent-16
==========================================================================================
====================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time
Data WAL Zalg Zratio Start LSN Stop LSN Status
==========================================================================================
====================================================
ent-16 16 TIUPRH 2026-07-27 23:47:51.513336+03 FULL STREAM 1/0 36s
328MB 16MB none 1,00 0/C000028 0/C001820 OK
Произведем какие-нибудь изменения, например, создадим таблицу:
msg
----------------------------
Полная копия создана.
Теперь сделаем разностную.
(2 rows)
Мы восстановили данные, использовав цепочку из полной и разностной копий.
Page 8: Объединение копий
{#source-figure-008 caption=“Source slide page 8: Объединение копий”}
Команда merge объединяет родительскую полную копию и дочерние инкрементальные копии в одну общую
Не нагружает сеть передачей данных
Комментарии преподавателя
Инкрементальная резервная копия строится быстрее полной и занимает меньше места. Однако по мере роста цепочки занимаемый объем и время восстановление будут увеличиваться.
Утилита pg_probackup позволяет объединить цепочку копий в одну полную копию командой merge.
Передав команде merge идентификатор последней инкрементальной копии в цепочке, мы получим единую полную копию, содержащую данные родительской полной копии со всеми изменениями, накопленными в цепочке инкрементальных. Все копии цепочки удаляются и остается единственная объединенная полная копия.
Указав команде идентификатор родительской копии, мы получим объединенную копию, включающую родительскую полную и первую инкрементальную.
При объединении вся работа производится в каталоге резервных копий, команда merge не передает данные по сети.
Третья копия, последняя в цепочке, содержит изменения данных, произошедшие после построения копии с этим идентификатором.
По мере добавления инкрементальных копий они будут занимать все больше дискового пространства. Можно выполнить полное копирование и удалить все предыдущие копии, но удобнее воспользоваться объединением копий.
В результате имеем единственную полную копию, объединяющую в себе три предыдущие:
student$ pg_probackup show \
-B /var/probackup --instance ent-16
==========================================================================================
======================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time
Data WAL Zalg Zratio Start LSN Stop LSN Status
==========================================================================================
======================================================
ent-16 16 TIUPTT 2026-07-27 23:49:12.963247+03 FULL STREAM 1/0 22s
335MB 16MB none 1,00 0/10000028 0/100003C0 OK
В резервную копию помещаются лишь измененные страницы, обнаруженные PTRACK
Требуется расширение ptrack
Комментарии преподавателя
PTRACK — еще один режим инкрементального резервного копирования экземпляра Postgres Pro. В копию попадают только изменившиеся страницы, но, в отличие от DELTA, утилите не требуется сравнивать данные с резервной копией: она получает список страниц с помощью механизма PTRACK.
Механизм PTRACK встроен в ядро Postgres Pro Enterprise. Он отслеживает и отмечает модификации страниц в специальной карте и предоставляет API для получения списка файлов, измененных с произвольного момента LSN, и битовых карт измененных в этих файлах страниц.
Утилита pg_probackup получает список страниц, подлежащих копированию, запрашивая изменения, произошедшие после создания предыдущей резервной копии. Поскольку для этого не требуется читать файлы данных и последнюю резервную копию, этот режим инкрементального резервного копирования может оказаться самым быстрым, особенно в сценариях, когда интенсивно изменяются одни и те же страницы.
Существующая полная копия была сделана до того, как PTRACK стал отслеживать изменения, поэтому для демонстрации работы PTRACK нам потребуется новая полная копия.
В каталоге резервных копий появилась инкрементальная копия:
student$ pg_probackup show \
-B /var/probackup --instance ent-16
==========================================================================================
=========================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time
Data WAL Zalg Zratio Start LSN Stop LSN Status
==========================================================================================
=========================================================
ent-16 16 TIUPW4 2026-07-27 23:50:30.218220+03 PTRACK STREAM 1/1 2s
1201kB 16MB none 1,00 0/14000028 0/14002630 OK
ent-16 16 TIUPV3 2026-07-27 23:49:57.033426+03 FULL STREAM 1/0 35s
336MB 16MB none 1,00 0/12000028 0/120001A0 OK
ent-16 16 TIUPTT 2026-07-27 23:49:12.963247+03 FULL STREAM 1/0 22s
335MB 16MB none 1,00 0/10000028 0/100003C0 OK
Восстановление в данном случае производится так же, как и для разностных копий. Однако, какая копия будет использована для восстановления, если явно не указать идентификатор?
В архиве должны быть все сегменты WAL, записанные после предыдущей копии
Комментарии преподавателя
При наличии архива WAL для создания инкрементальных копий можно использовать еще один режим инкрементального резервного копирования pg_probackup — страничное копирование (PAGE).
При копировании PAGE pg_probackup сканирует все записи WAL в архиве, начиная с момента создания предыдущей полной или инкрементальной копии, и определяет по ним список изменившихся страниц. При этом необходимо, чтобы в архиве присутствовали все файлы WAL, сгенерированные после предыдущей копии.
Режим PAGE особенно эффективен, когда в базах данных происходит немного изменений. Если же объем журнальных файлов сравним с общим объемом файлов базы данных, ускорение будет незначительным, однако объем инкрементальной копии все равно будет меньше, чем полной.
Архив WAL заполняется с целевого сервера командой pg_probackup archive-push (указанной в конфигурационном параметре archive_command) по SSH. И при восстановлении целевой сервер будет читать необходимые сегменты журнала по SSH командой pg_probackup archive-get (указанной в параметре restore_command).
Здесь мы имеем дело с удаленным восстановлением. Поэтому при вызове pg_probackup restore требуется указать два набора параметров.
Remote-параметры указывают на целевой сервер с восстанавливаемым экземпляром:
● –remote-host — адрес целевого сервера;
● –remote-user — владелец экземпляра (postgres);
● –remote-port — порт SSH.
Archive-параметры указывают на сервер резервного копирования, хранящий архив WAL:
● –archive-host — адрес сервера резервного копирования;
● –archive-user — владелец каталога резервных копий;
● –archive-port — порт SSH.
Archive-параметры используются, чтобы сформировать на целевом сервере значение параметра restore_command.
Page 15: Копирование PAGE
Подготовим экземпляр к работе с архивацией WAL.
=>ALTERSYSTEMSETarchive_mode=on;
ALTERSYSTEM
Для команды архивирования целевым является сервер резервного копирования, здесь ему соответствует localhost. Команда архивирования будет подключаться к серверу по SSH под именем владельца каталога резервных копий — пользователя student.
student$ pg_probackup show \
-B /var/probackup \
--archive
ARCHIVE INSTANCE 'ent-16'
==========================================================================================
=======
TLI Parent TLI Switchpoint Min Segno Max Segno N segments Size Zratio N backups
Status
==========================================================================================
=======
Пока он пуст.
Переключим сегмент WAL.
=>SELECTpg_switch_wal();
pg_switch_wal
---------------
0/15004FE4
(1 row)
=>INSERTINTOt1VALUES('Архивация WAL работает.');
INSERT01
Сегмент WAL попал в архив:
student$ pg_probackup show \
-B /var/probackup \
--archive
ARCHIVE INSTANCE 'ent-16'
==========================================================================================
=====================================
TLI Parent TLI Switchpoint Min Segno Max Segno N
segments Size Zratio N backups Status
==========================================================================================
=====================================
1 0 0/0 000000010000000000000015 000000010000000000000015 1
16MB 1,00 1 OK
Выполним полное резервное копирование. Поскольку настроена файловая архивация, копировать WAL не нужно, ключ – stream не указываем.
student$ pg_probackup backup \
Page 16: Page 16
-B /var/probackup --instance ent-16 \
-b FULL
Проверим каталог резервных копий:
student$ pg_probackup show \
-B /var/probackup --instance ent-16
==========================================================================================
======================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time
Data WAL Zalg Zratio Start LSN Stop LSN Status
==========================================================================================
======================================================
ent-16 16 TIUPXO 2026-07-27 23:51:32.411384+03 FULL ARCHIVE 1/0 40s
335MB 16MB none 1,00 0/17000028 0/180000C0 OK
ent-16 16 TIUPTT 2026-07-27 23:49:12.963247+03 FULL STREAM 1/0 22s
335MB 16MB none 1,00 0/10000028 0/100003C0 OK
Создадим еще одну таблицу.
=>CREATETABLEt2ASSELECT'Проверка режима PAGE.'msg;
SELECT1
Увеличим счетчик транзакций и запомним номер, он потребуется нам позже.
Ее сформировала утилита по переданным ей archive-параметрам.
Восстановление прошло успешно, но, естественно, таблица t2 по-прежнему на месте, а t1 — отсутствует:
=>SELECT*FROMt2;
msg
-----------------------
Проверка режима PAGE.
(1 row)
{#source-figure-019 caption=“Source slide page 19: Восстановление PITR”}
При наличии архива WAL можно восстановить систему на момент времени — point-in-time recovery
Требуется архив WAL от момента создания резервной копии
Комментарии преподавателя
Если до выполнения резервного копирования уже был настроен архив WAL, то с помощью pg_probackup можно выполнить восстановление на момент времени в прошлом (Point-In-Time Recovery, PITR). Независимо от того, является ли резервная копия автономной (включает журнальные файлы) или нет, требуется наличие архива WAL как минимум с момента создания резервной копии.
При восстановлении на момент времени не обязательно указывать идентификатор копии. Утилита pg_probackup автоматически выберет резервную копию, ближайшую к заданной целевой точке, и начнет восстановление.
Указать точку восстановления можно параметрами:
● –recovery-target-time — на заданное время в формате timestamp;
● –recovery-target-xid — до заданной транзакции;
● –recovery-target-lsn — до заданного LSN;
● –recovery-target-name — до заранее созданной именованной точки;
● –recovery-target=‘latest’ — до последнего согласованного состояния;
● –recovery-target=‘immediate’ — до самого раннего согласованного состояния.
Итак, мы обнаружили, что таблица была удалена, и решили восстановить данные на момент до удаления таблицы.
Ранее мы выяснили номер транзакции — 971. Восстановим данные до этого номера.
Восстановление только требуемых баз данных кластера
-db-include — база данных для восстановления
-db-exclude — база данных, которую не надо восстанавливать
Комментарии преподавателя
Частичное восстановление применяется в случаях, когда не требуется восстанавливать все базы данных кластера.
Параметром –db-include можно задать имя базы данных для восстановления. Базы template0 и template1 восстанавливаются всегда. Можно указать несколько таких параметров, по одному для каждой восстанавливаемой базы данных.
Используя параметр –db-exclude, можно попросить утилиту восстановить все базы, кроме указанных.
Все файлы пропущенных баз данных все равно создаются утилитой, но создаются пустыми. Это необходимо, поскольку при старте экземпляра процесс startup проигрывает журнальные записи (как минимум для восстановления согласованности) и ожидает обнаружить соответствующие файлы данных. Затем ненужные базы данных можно удалить.
Восстановим из единственной оставшейся полной копии все базы данных кластера, кроме pgpro_probackup_2_bis.
student$ pg_probackup show \
-B /var/probackup --instance ent-16
==========================================================================================
======================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time
Data WAL Zalg Zratio Start LSN Stop LSN Status
==========================================================================================
======================================================
ent-16 16 TIUPTT 2026-07-27 23:49:12.963247+03 FULL STREAM 1/0 22s
335MB 16MB none 1,00 0/10000028 0/100003C0 OK
msg
----------------------------------
Полная копия создана.
Теперь сделаем разностную.
После частичного восстановления.
(3 rows)
Page 25: Восстановление страниц
{#source-figure-025 caption=“Source slide page 25: Восстановление страниц”}
CHECKSUM
восстановление испорченных страниц и страниц,
отличающихся от резервной копии
Комментарии преподавателя
При инкрементальном восстановлении (восстановлении страниц) каталог данных экземпляра не перезаписывается полностью, а только обновляется теми страницами, состояние которых изменилось по сравнению с резервной копией. Если каталог данных не сильно отличается от копии, такое восстановление будет работать значительно быстрее обычного.
Для инкрементального восстановления в командную строку добавляется параметр -I, после которого указывается один из двух режимов: CHECKSUM или LSN. Эти режимы определяют, как именно будут выбираться страницы, требующие восстановления.
В режиме CHECKSUM восстанавливаются страницы с некорректной контрольной суммой или с номером LSN, отличающимся от LSN в резервной копии. Для этого утилита читает все файлы данных экземпляра, получает их контрольные суммы и LSN, а затем сравнивает эту информацию с содержимым резервной копии. Если имеет место цепочка инкрементальных резервных копий, в более ранних копиях ищутся только те страницы, которые не были найдены в более поздних.
Экономия достигается за счет того, что только изменившиеся страницы передаются по сети и записываются на диск целевого экземпляра.
{#source-figure-026 caption=“Source slide page 26: Восстановление страниц”}
LSN
восстановление испорченных страниц и страниц,
измененных после точки сдвига
точка сдвига — наиболее поздняя копия из инкрементальной цепочки,
соответствующая прошлому состоянию каталога данных экземпляра
Комментарии преподавателя
В режиме LSN утилита пытается найти в инкрементальной цепочке целевой резервной копии наиболее позднюю копию, соответствующую какому-либо состоянию каталога данных экземпляра в прошлом. Момент завершения создания этой копии называется точкой сдвига (Shift LSN) и принадлежит некоторой линии времени. Точка сдвига важна тем, что страницы экземпляра с LSN ≤ Shift LSN заведомо совпадают со страницами, которые можно восстановить из целевой резервной копии, то есть при восстановлении такие страницы можно просто игнорировать.
Если подходящей на роль точки сдвига копии нет, восстановление в режиме LSN невозможно (режим CHECKSUM доступен всегда).
На слайде копия Δ2 не может служить точкой сдвига, поскольку не соответствует никакому прошлому состоянию экземпляра: она была сделана в первой линии времени, а экземпляр в некоторый момент переключился на вторую линию. А копия Δ1 удовлетворяет условиям и будет выбрана в качестве точки сдвига.
Режим LSN требует корректности файла pg_control, поскольку из него считывается Redo LSN и линия времени экземпляра, и наличия необходимых файлов истории в архиве WAL. Также должны быть включены контрольный суммы.
Однако если режим доступен, он оказывается более эффективным, чем CHECKSUM. Файлы каталога данных все равно читаются полностью, но в режиме CHECKSUM по резервной копии проверяются все страницы, а в LSN — только измененные позже точки сдвига.
В предыдущем опыте частичного восстановления база данных pgpro_probackup_2_bis не была восстановлена. Инкрементальное восстановление позволит не копировать лишние данные, ограничившись только недостающими и измененными страницами.
В управляющем файле кластера есть информация о последней контрольной точке, которая определяет текущее положение экземпляра на линии времени:
В нашем случае линия времени всего одна, а имеющаяся копия отражает прошлое состояние экземпляра, так что может служить точкой сдвига для режима LSN (Backup TIUPTT is chosen as shiftpoint):
Обратите внимание на строку «Restore incremental ratio (less is better)». Это отношение объема восстановленных страниц к общему объему данных в кластере. Чем меньше это значение, тем выше эффективность и скорость инкрементального восстановления.
синхронизация отставшего ведомого сервера с ведущим
добавление нового ведомого сервера
Комментарии преподавателя
Быстро клонировать экземпляр или синхронизировать отставшую реплику позволяет команда catchup утилиты pg_probackup. Она не использует каталог резервных копий, а берет данные непосредственно из каталога данных копируемого экземпляра.
Ускорение относительно обычных средств может достигаться за счет:
● многопоточной передачи данных;
● инкрементального копирования (с дополнению к режиму FULL доступны DELTA и PTRACK).
Использование команды catchup для синхронизации отставшей реплики позволяет избежать сложных ручных процедур с использованием rsync и подобных инструментов.
Команда catchup отличается от других операций, выполняемых утилитой pg_probackup:
Здесь были использованы следующие параметры командной строки pg_probackup:
-D — целевой каталог для восстановления; -j — копировать в несколько потоков; –restore-as-replica — создать файл standby.signal и настроить строку подключения к мастеру.
Запустим реплику, изменив перед этим номер порта в конфигурации.
You are now connected to database "pgpro_probackup_2" as user "student".
=>SELECTpg_is_in_recovery();
Page 31: Page 31
pg_is_in_recovery
-------------------
t
(1 row)
=>SELECTcount(*)FROMt1;
count
---------
1000000
(1 row)
На реплике аварийно завершается основной процесс:
student$ sudo kill -QUIT $(sudo head -n 1 /var/lib/pgpro/ent-16-prod/postmaster.pid)
Пока реплика простаивает, на основном сервере изменим тысячу строк:
=>UPDATEt1SETmsg=msg||'!'WHEREmsg~'000$';
UPDATE1000
Если реплика долго простаивала, ее синхронизации может занять долгое время, даже если все нужные журнальные файлы еще сохранились на основном сервере. Мы хотим ускорить синхронизацию, передав данные с мастера на реплику командой catchup, которая будет передавать только измененные страницы.
Используем режим инкрементального копирования DELTA, укажем пути к каталогам данных. Дополнительный файл конфигурации не копируем:
INFO: --stream is required, forcing stream mode
INFO: This PostgreSQL instance was initialized with data block checksums. Data block
corruption will be detected
INFO: Catchup start, pg_probackup version: 2.8.14, PostgreSQL version: 16, remote: false,
source-pgdata: /var/lib/pgpro/ent-16, destination-pgdata: /var/lib/pgpro/ent-16-prod
INFO: Database catchup start
INFO: Destination file "/var/lib/pgpro/ent-16-prod/postgresql.auto.conf" excluded with
--exclude-path option
INFO: syncLSN = 0/10000028
INFO: Enable CFS flock feature
INFO: wait for pg_backup_start()
INFO: pg_start_backup START LSN 0/16000028
INFO: Source file "/var/lib/pgpro/ent-16/postgresql.auto.conf" excluded with
--exclude-path option
INFO: Source PGDATA size: 377MB (excluded 280B)
INFO: Start LSN (source): 0/16000028, TLI: 1
INFO: LSN in destination: 0/10000028, TLI: 1
INFO: Removing redundant files in destination directory
WARNING: Renaming pg_control file: Cannot rename file
"/var/lib/pgpro/ent-16-prod/global/pg_control" to
"/var/lib/pgpro/ent-16-prod/global/pg_control.pbk.bak": No such file or directory
INFO: Start transferring data files
INFO: wait for pg_stop_backup()
INFO: pg_stop_backup() successfully executed
INFO: stop_stream_lsn 0/16920000 currentpos 0/16920000
INFO: Databases synchronized. Transferred datafiles size: 10232kB, transferred wal size:
16MB, time elapsed: 1s
INFO: Catchup incremental ratio (less is better): 3% (10232kB/377MB)
INFO: Syncing copied files to disk
INFO: Files are synced, time elapsed: 18s
Обратите внимание на строку «Catchup incremental ratio (less is better)» — она показывает отношение объема переданных для синхронизации страниц к их общему объему. Чем меньше значение, тем эффективнее работает синхронизация.
Запустим реплику.
waiting for server to start..................... done
server started
student$ psql -p 5434 pgpro_probackup_2
Проверим данные на реплике:
=>SELECTcount(*)FROMt1WHEREmsg~'!$';
count
-------
1000
(1 row)
Все измененные строки синхронизированы.
Page 33: Итоги
Утилита pg\_probackup поддерживает инкрементальное копирование и инкрементальное восстановление измененных страниц
При наличии архива WAL поддерживается восстановление на момент в прошлом
Возможно восстановление части данных кластера и эффективная синхронизация двух кластеров
Page 34: Практика
Подготовьте экземпляр к работе с архивированием WAL, создайте базу данных, выполните полное копирование со сжатием. 2. Измените какие-либо данные в базе и выполните инкрементальное страничное копирование со сжатием. 3. Убедитесь, что полученная цепочка копий пригодна для восстановления экземпляра. 4. Имитируйте аварию сервера с физической порчей данных. 5. Восстановите испорченные данные, не затрагивая при этом другие данные кластера.
Комментарии преподавателя
Аварийно завершите основной процесс экземпляра. Измените файл основного слоя таблицы средствами ОС, например: