F.59. ptrack — механизм резервного копирования базы Postgres Pro на уровне блоков #

PTRACK — это механизм, предназначенный для резервного копирования базы Postgres Pro на уровне блоков. Когда PTRACK включён, программы резервного копирования, в частности pg_probackup, могут использовать его API для получения информации об изменённых блоках, создавая инкрементальные копии. Копируя только блоки, изменённые со времени создания предыдущей копии, можно значительно ускорить процесс создания и минимизировать объём резервных копий.

PTRACK спроектирован так, что он может допускать неточности в положительную сторону, но ошибки в отрицательную сторону исключены: это означает, что все изменения в каталоге данных, не считая изменений вспомогательных битов, гарантированно отмечаются в карте PTRACK, хотя изменёнными могут также считаться и некоторые на самом деле не модифицированные блоки.

F.59.1. Настройка PTRACK #

Установив Postgres Pro Standard, выполните следующие действия:

  1. Добавьте ptrack в параметр shared_preload_libraries в файле postgresql.conf:

    shared_preload_libraries = 'ptrack'
  2. Задайте для параметра ptrack.map_size положительное целое значение.

    Для оптимальной производительности рекомендуется задавать ptrack.map_size равным N / 1024, где N — объём кластера Postgres Pro в мегабайтах. Если этот параметр будет иметь меньшее значение, это увеличит вероятность наложения информации разных блоков в карте PTRACK, что повлечёт ложные положительные результаты при определении изменённых блоков. Вследствие этого в инкрементальную копию могут попасть и неизменённые блоки, от чего её размер может несколько увеличиться.

    Большее значение ptrack.map_size не окажет негативного влияния на работу PTRACK, но имейте в виду, что для обеспечения надёжности PTRACK использует два дополнительных временных файла такого же размера, поэтому в общей сложности для PTRACK потребуется ptrack.map_size * 3 мегабайт дискового пространства. Даже если объём кластера Postgres Pro (N) превышает 1 TB, значения больше 1024 стоит использовать, только если эффективность и, как следствие, оптимизация размера резервных копий, перевешивает издержки, связанные с увеличением карты PTRACK.

  3. Проверьте значение параметра wal_level. Используя PTRACK, необходимо установить для этого параметра значение replica или выше. В противном случае вы могли бы потерять изменения в случае аварийной остановки, так как некоторые команды не записывают информацию, если уровень wal_level равен minimal, а файлы карты PTRACK сбрасываются на диск только во время контрольных точек.

  4. Перезапустите экземпляр Postgres Pro Standard, чтобы изменения вступили в силу, а затем создайте расширение PTRACK:

    CREATE EXTENSION ptrack;

    В результате этой операции будут созданы функции PTRACK, необходимые для обращения к данным PTRACK.

После запуска сервера механизм PTRACK начинает отслеживать все изменения страниц в кластере Postgres Pro и создаёт файл ptrack.map, содержащий последние значения LSN для изменившихся страниц.

Примечание

Параметр ptrack.map_size можно задать только при запуске сервера. В случае изменения этого параметра ранее созданная карта PTRACK очищается, и отслеживание изменённых блоков начинается заново. Во избежание потери изменений рекомендуется сделать полную резервную копию сразу после присваивания ему другого значения.

F.59.2. Параметры конфигурации PTRACK #

ptrack.map_size (integer) #

Задаёт размер файла карты PTRACK и объём выделяемой для него общей памяти в мегабайтах. В карте PTRACK хранятся наибольшие значения LSN для всех страниц кластера Postgres Pro, изменённых с момента включения PTRACK. Для этого параметра не рекомендуется устанавливать значение, превышающее 1 Гбайт. Значение 0 отключает PTRACK и производит очистку всех служебных файлов.

Параметр ptrack.map_size можно задать только при запуске сервера. В случае изменения этого параметра ранее созданная карта PTRACK очищается, и отслеживание изменённых блоков начинается заново. Во избежание потери изменений рекомендуется сделать полную резервную копию сразу после присваивания ему другого значения.

По умолчанию: 0

F.59.3. Функции PTRACK #

ptrack_init_lsn() returns pg_lsn #

Возвращает LSN, соответствующий последней инициализации карты PTRACK.

ptrack_get_pagemapset(начальный_lsn pg_lsn) returns setof record #

Возвращает список файлов данных, изменённых с момента, указанного в параметре start_lsn, а также количество и битовую карту изменённых страниц для каждого файла.

Например:

postgres=# SELECT * FROM ptrack_get_pagemapset('0/185C8C0');
        path         | pagecount |                pagemap
---------------------+-----------+----------------------------------------
 base/16384/1255     |         3 | \x001000000005000000000000
 base/16384/2674     |         3 | \x0000000900010000000000000000
 base/16384/2691     |         1 | \x00004000000000000000000000
 base/16384/2608     |         1 | \x000000000000000400000000000000000000
 base/16384/2690     |         1 | \x000400000000000000000000
ptrack_get_change_stat(начальный_lsn pg_lsn) returns record #

Возвращает статистику изменений (количество файлов, количество изменённых страниц и их общий размер в мегабайтах) с момента, указанного в параметре start_lsn.

Например:

postgres=# SELECT * FROM ptrack_get_change_stat('0/285C8C8');
 files | pages |        size, MB
-------+-------+------------------------
    20 |    25 | 0.19531250000000000000
ptrack_version() returns text #

Выдаёт версию PTRACK.

F.59. ptrack — a block-level incremental backup engine for Postgres Pro #

PTRACK is a block-level incremental backup engine for Postgres Pro. If PTRACK is enabled, backup tools like pg_probackup can use its API to get information on the changed blocks on the fly when taking incremental backups. Copying only those blocks that have changed since the previous backup can significantly speed up the creation and minimize the size of backups.

PTRACK is designed to allow false positives, but to never allow false negatives: it means that all changes within the data directory except hint bits are guaranteed to be marked in the PTRACK map file, although some unchanged blocks might be included as well.

F.59.1. Setting up PTRACK #

Once you complete Postgres Pro Standard installation, do the following:

  1. Add ptrack to the shared_preload_libraries parameter in the postgresql.conf file:

    shared_preload_libraries = 'ptrack'
    
  2. Set ptrack.map_size parameter to a positive integer.

    For optimal performance, it is recommended to set ptrack.map_size to N / 1024, where N is the size of the Postgres Pro cluster, in MB. If you set this parameter to a lower value, PTRACK is more likely to map several blocks together, which leads to false-positive results when tracking changed blocks and increases the incremental backup size as unchanged blocks can also be copied into the incremental backup.

    Setting ptrack.map_size to a higher value does not affect PTRACK operation, but keep in mind that you need up to ptrack.map_size * 3 MB of additional disk space since PTRACK uses two additional temporary files to ensure durability. It is not recommended to set this parameter to a value higher than 1024. Even for Postgres Pro clusters with N > 1 TB, it makes sense to use a higher value only if the efficiency and sizes of backups are more critical than the potential overhead of maintaining a large PTRACK map.

  3. Check the wal_level setting. When using PTRACK, it is required to set the wal_level parameter to replica or higher. Otherwise, you can lose some tracked changes if crash-recovery occurs: some commands do not write WAL at all if wal_level is minimal, and PTRACK map files are flushed to disk only at checkpoint time.

  4. Restart the Postgres Pro Standard instance for the changes to take effect, and then create the PTRACK extension:

    CREATE EXTENSION ptrack;
    

    As a result, several PTRACK functions are created, which are required for accessing PTRACK data.

Once this setup is complete, PTRACK starts tracking all the page changes in the Postgres Pro cluster and creates a ptrack.map file that stores the latest LSN values for these pages.

Note

The ptrack.map_size parameter can only be set at server start. If you change this parameter, the previously created PTRACK map file is cleared, and tracking newly changed blocks starts from scratch. To avoid losing recent changes, it is recommended to retake a full backup after modifying this setting.

F.59.2. PTRACK Configuration Parameters #

ptrack.map_size (integer) #

Specifies the size of a PTRACK map file and the amount of shared memory allocated for this file, in MB. The PTRACK map file stores the latest LSN values for all pages of the Postgres Pro cluster that have changed since PTRACK was enabled. It is not recommended to set this parameter to a value higher than 1GB. The 0 value disables PTRACK and cleans up all the related service files.

The ptrack.map_size parameter can only be set at server start. If you change this parameter, the previously created PTRACK map file is cleared, and tracking newly changed blocks starts from scratch. To avoid losing recent changes, it is recommended to retake a full backup after modifying this setting.

Default: 0

F.59.3. PTRACK Functions #

ptrack_init_lsn() returns pg_lsn #

Returns the LSN of the last PTRACK map initialization.

ptrack_get_pagemapset(start_lsn pg_lsn) returns setof record #

Returns a list of data files changed since the specified start_lsn with the number and bitmap of changed pages for each file.

For example:

postgres=# SELECT * FROM ptrack_get_pagemapset('0/185C8C0');
        path         | pagecount |                pagemap
---------------------+-----------+----------------------------------------
 base/16384/1255     |         3 | \x001000000005000000000000
 base/16384/2674     |         3 | \x0000000900010000000000000000
 base/16384/2691     |         1 | \x00004000000000000000000000
 base/16384/2608     |         1 | \x000000000000000400000000000000000000
 base/16384/2690     |         1 | \x000400000000000000000000
ptrack_get_change_stat(start_lsn pg_lsn) returns record #

Returns the statistics of changes (number of files, number of changed pages and their total size in MB) since the specified start_lsn.

For example:

postgres=# SELECT * FROM ptrack_get_change_stat('0/285C8C8');
 files | pages |        size, MB
-------+-------+------------------------
    20 |    25 | 0.19531250000000000000
ptrack_version() returns text #

Returns PTRACK version.

FAQ