Skip to content

Неудачный merge корраптит данные в бэкапе #83

Closed
@istarling

Description

@istarling

Имеем некий виртуальный сервер с 4 CPU и HDD.
В PostgreSQL 11.3 создаем БД и наполняем тестовыми данными. Например так:

pgbench -i -s 200

Берем pg_probackup 2.1.3 и настраиваем бэкап-каталог. Допустим, так:

pg_probackup init -B /var/lib/pgsql/11/backups/probackup
pg_probackup add-instance -B /var/lib/pgsql/11/backups/probackup/ -D /var/lib/pgsql/11/data/ --instance om11

Далее сосздаем цепочку из сжатых бэкапов. Один FULL и два DELTA.

pg_probackup backup -B /var/lib/pgsql/11/backups/probackup/ --instance om11 -b FULL --stream --compress-algorithm=zlib --compress-level=4 --log-level-console=verbose -j 4
pg_probackup backup -B /var/lib/pgsql/11/backups/probackup/ --instance om11 -b DELTA --stream --compress-algorithm=zlib --compress-level=4 --log-level-console=verbose -j 4
pg_probackup backup -B /var/lib/pgsql/11/backups/probackup/ --instance om11 -b DELTA --stream --compress-algorithm=zlib --compress-level=4 --log-level-console=verbose -j 4

Теперь необходимо смоделировать ситуацию, когда на диске с бэкапом кончается место и добиться падения merge с ошибкой "No space left on device". Для следующего примера мне удалось получить ошибку, когда на диске оставалось 3ГБ свободного пространства.

Подаем нагрузку командой "pgbench -c 3 -j 80 -T 3000 -P 1" и запускаем merge в 4 потока:

pg_probackup merge -B /var/lib/pgsql/11/backups/probackup/ --instance om11 --log-level-console=verbose -i PSKHNN -j 4

В итоге у меня диск имел 100% нагрузку по io, а спустя некоторое время merge упал с ошибкой вида:

ERROR: File: /var/lib/pgsql/11/backups/probackup/backups/om11/PSKMBB/database/base/13878/33085.2_tmp, cannot write backup at block 35693: No space left on device
ERROR: Cannot write block 112460 of "/var/lib/pgsql/11/backups/probackup/backups/om11/PSKMBB/database/base/13878/16550": No space left on device
ERROR: File: /var/lib/pgsql/11/backups/probackup/backups/om11/PSKMBB/database/base/13878/16550.2_tmp, cannot write backup at block 39001: No space left on device
ERROR: Interrupted during page reading
ERROR: Data files merging failed

Далее высвобождаем n-количество байт и запускаем merge в 1 поток:

pg_probackup merge -B /var/lib/pgsql/11/backups/probackup/ --instance om11 --log-level-console=verbose -i PSKHNN -j 1

В итоге получаем ошибку и невалидный бэкап:

ERROR: Cannot read block 35686 of "/var/lib/pgsql/11/backups/probackup/backups/om11/PSKMBB/database/base/13878/33085.2" read 48 of 509
ERROR: Data files merging failed

Полная версия лога - https://oc.postgrespro.ru/index.php/s/rhn8JppgJ5lXg5o

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions