Удаление "брошенных" файлов в ADB

Содержание

Обзор

"Брошенные" (orphaned) файлы — это файлы, не ассоциированные ни с одной из существующих таблиц в базе данных. Они могут остаться в файловой системе после аварийного завершения некоторого бэкенд-процесса, связанного с созданием новой таблицы в рамках транзакции. Причинами сбоя могут быть отказы оборудования, нехватка свободного места на диске и так далее. В результате успешного восстановления системы после сбоя незакоммиченные изменения в базе данных отсутствуют (новой таблицы нет в системном каталоге), однако на сегмент-хостах могут остаться файлы данных этой таблицы. Со временем таких файлов, занимающих место на диске, может становиться все больше, а их поиск и удаление требуют времени и сопряжены с рисками удаления полезных данных.

Начиная с версии 6.29.0.3 в ADB поддерживается автоматическое отслеживание и удаление "брошенных" файлов на уровне ядра СУБД в случае прерывания транзакций. В предыдущих версиях ADB файлы данных удалялись автоматически лишь для штатно завершившихся транзакций (в случае их отката через ABORT), а "брошенные" файлы возможно было удалить лишь вручную (например, используя для их поиска функции и представления расширения gp_check_functions).

Подход к обработке "брошенных" файлов, реализованный в ADB 6.29.0.3, основан на следующих принципах:

  • В случае коммита или отката транзакции, создавшей таблицу, ядро СУБД, как и ранее, в штатном режиме самостоятельно определяет, как обработать файлы данных таблицы. В случае вызова ABORT файлы удаляются, в случае COMMIT PREPARED — сохраняются.

  • Для удаления брошенных файлов рассматриваются лишь транзакции в статусе TRANSACTION_STATUS_IN_PROGRESS. СУБД полагает, что транзакция в этом статусе может прерваться нештатно и оставить "брошенные" файлы. Транзакции в других статусах не рассматриваются, так как считаются обработанными штатным образом (см. предыдущий пункт).

  • Решение о необходимости удаления файлов принимается СУБД автоматически на этапе выполнения восстановления (recovery).

ВАЖНО
  • В статье технического блога Удаление брошенных файлов можно получить более подробную информацию о причинах появления orphaned-файлов, подходах к решению этой проблемы в других СУБД, а также познакомиться с деталями реализации от команды ADB/Greengage DB.

  • Следует понимать, что установка версии ADB 6.29.0.3 не приводит к удалению всех накопившихся ранее "брошенных" файлов, однако предотвращает их накопление в будущем.

Настройка

Автоматическое отслеживание и удаление "брошенных" файлов в нештатных ситуациях регулируется при помощи GUC gp_track_pending_delete. По умолчанию параметру присвоено значение on, что означает использование новой обработки файлов, реализованной в ADB 6.29.0.3. Если по каким-либо причинам ее следует отключить, измените значение параметра на off. Следует учитывать, что параметр gp_track_pending_delete можно изменить только путем редактирования файла postgresql.conf на всех сегментах с помощью утилиты gpconfig, а для применения изменений требуется перезапуск СУБД (перезагрузки конфигурационного файла недостаточно).

Ниже показан пример изменения значения gp_track_pending_delete:

  1. Подключитесь к master-хосту ADB под пользователем gpadmin:

    $ sudo su - gpadmin
  2. Выведите текущее значение параметра:

    $ gpconfig -s gp_track_pending_delete

    Результат:

    Values on all segments are consistent
    GUC          : gp_track_pending_delete
    Master  value: on
    Segment value: on
  3. Измените значение параметра на всех сегментах:

    $ gpconfig -c gp_track_pending_delete -v off

    Результат:

    20250827:10:10:29:2622827 gpconfig:bds-mdw:gpadmin-[INFO]:-completed successfully with parameters '-c gp_track_pending_delete -v off'
  4. Перезапустите СУБД:

    $ gpstop -r -a
  5. Проверьте значение параметра повторно, чтобы убедиться в применении изменений:

    $ gpconfig -s gp_track_pending_delete

    Вывод команды:

    Values on all segments are consistent
    GUC          : gp_track_pending_delete
    Master  value: off
    Segment value: off
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней