34.1. Очистка памяти

В зависимости от параметров конфигурации очистки памяти Postgres Pro Enterprise может автоматически перезаписывать данные нулевыми байтами перед удалением. В этом разделе описывается, как очищаются данные различных типов. По умолчанию все параметры очистки памяти включены.

34.1.1. Удаление файлов из внешней памяти

Когда вы выполняете команды SQL, удаляющие файлы, соответствующее дисковое пространство возвращается операционной системе. К таким командам относятся:

  • Команды, удаляющие объекты БД:

    • DROP TABLE

    • DROP TEMPORARY TABLE

    • DROP MATERIALIZED VIEW

    • DROP INDEX

    • TRUNCATE

    • DROP DATABASE

    • DROP SCHEMA

  • Команды, пересоздающие объекты:

    • VACUUM FULL

    • REINDEX

    • ALTER TABLE ADD COLUMN (со значением по умолчанию)

    • ALTER TABLE ALTER COLUMN TYPE

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

Примечание

Команда ALTER TABLE DROP COLUMN не пересоздаёт файл. Все данные, содержащиеся в удаляемом столбце, остаются внутри страниц, хотя к ним и нельзя обращаться с помощью команд SQL. Чтобы физически удалить эти данные из файла, выполните VACUUM FULL после удаления столбца.

34.1.2. Очистка страниц

В соответствии с моделью MVCC (Multiversion Concurrency Control, Многоверсионное управление конкурентным доступом) при удалении строк (командой DELETE) данные, содержащиеся в этих строках, помечаются как удалённые, но физически не удаляются. При модификации строк (командой UPDATE) сначала удаляется старая версия строки, а затем вставляется новая, так что предыдущее содержимое так же сохраняется в странице.

Чтобы механизм MVCC работал корректно, Postgres Pro сохраняет удалённые данные в страницах до тех пор, пока эта версия может быть востребована какими-либо активными снимками. Если строка задействуется в индексах, то в страницах индексов так же сохраняются ссылки на строки, которые были удалены, но ещё не освобождены. Когда версия строки не востребована никакими снимками, её можно удалить, произведя процедуру VACUUM. При этом все ссылки на эту версию будут удалены и из индексов. Однако это удаление не подразумевает физическое уничтожение: в обычном режиме соответствующее место в странице помечается как свободное и может использоваться для размещения другой строки.

Для предотвращения доступа к удалённым версиям строк необходимо включить параметр wipe_heaptuple_on_delete в файле конфигурации postgresql.conf. При этом процесс VACUUM будет не только помечать место в страницах как свободное, но и заполнять его нулевыми байтами.

34.1.3. Очистка блоков памяти в ОЗУ

Во время работы сервера оперативная память (в ОЗУ) постоянно выделяется и освобождается. Postgres Pro использует собственную подсистему управления памятью, основанную на контекстах, в которой память всегда выделяется в одном из вложенных контекстов. При удалении контекста освобождается вся память, выделенная в нём и в соответствующих вложенных контекстах. Этот подход позволяет избежать утечек памяти. Тем не менее выделением и освобождением памяти в конце концов занимается операционная система. В обычных условиях освобождаемая область ОЗУ возвращается операционной системе и может быть выделена другому процессу.

Чтобы из освобождаемой области ОЗУ удалялись все данные, включите следующие параметры в файле конфигурации postgresql.conf:

  • wipe_memctx_on_free — этот параметр включает заполнение нулевыми байтами освобождаемой памяти в каком-либо контексте.

  • wipe_mem_on_free — этот параметр включает заполнение нулевыми байтами освобождаемой памяти, не принадлежащей никакому контексту. Хотя Postgres Pro всегда выделяет память в контекстах, вы можете воспользоваться этим параметром для большей уверенности.

34.1.4. Очистка файлов WAL

Журнал предзаписи (Write-Ahead Log, WAL) представляет собой стандартный способ обеспечения целостности данных, позволяющий осуществлять резервное копирование, восстановление на момент времени и репликацию данных между серверами. Концептуальной сущностью WAL является то, что изменения в каталогах данных (где располагаются таблицы и индексы) должны производиться только после фиксации изменений в журнале, то есть после того, как записи журнала, описывающие изменения, окажутся в постоянном хранилище. Таким образом WAL может содержать важные данные, которые необходимо защищать.

Сервер Postgres Pro всегда сохраняет определённое количество сегментов WAL в каталоге $PGDATA/pg_wal. Минимальный объём сохраняемых сегментов WAL определяется параметром min_wal_size. В случае большой нагрузки размер сегментов WAL может увеличиться до значения max_wal_size и даже несколько его превысить. Пока размер журнала WAL на диске остаётся больше min_wal_size, старые файлы сегментов WAL удаляются при освобождении. В противном случае сегменты WAL перезаписываются.

Для недопущения неавторизованного доступа к освобождённым сегментам WAL необходимо включить параметр wipe_xlog_on_free в файле конфигурации postgresql.conf. В этом случае сегмент WAL будет заполнен нулевыми байтами перед удалением или повторным использованием.

Более подробно конфигурация и использование WAL описывается в Главе 29.