30.1. ÐÑиÑÑка памÑÑи #
РзавиÑимоÑÑи Ð¾Ñ Ð¿Ð°ÑамеÑÑов конÑигÑÑаÑии оÑиÑÑки памÑÑи Postgres Pro Standard Ð¼Ð¾Ð¶ÐµÑ Ð°Ð²ÑомаÑиÑеÑки пеÑезапиÑÑваÑÑ Ð´Ð°Ð½Ð½Ñе нÑлевÑми байÑами пеÑед Ñдалением. Ð ÑÑом Ñазделе опиÑÑваеÑÑÑ, как оÑиÑаÑÑÑÑ Ð´Ð°Ð½Ð½Ñе ÑазлиÑнÑÑ Ñипов. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ñе паÑамеÑÑÑ Ð¾ÑиÑÑки памÑÑи вклÑÑенÑ.
30.1.1. Удаление Ñайлов из внеÑней памÑÑи #
Ðогда Ð²Ñ Ð²ÑполнÑеÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL, ÑдалÑÑÑие ÑайлÑ, ÑооÑвеÑÑÑвÑÑÑее диÑковое пÑоÑÑÑанÑÑво возвÑаÑаеÑÑÑ Ð¾Ð¿ÐµÑаÑионной ÑиÑÑеме. Ð Ñаким командам оÑноÑÑÑÑÑ:
ÐомандÑ, ÑдалÑÑÑие обÑекÑÑ ÐÐ:
DROP TABLEDROP TEMPORARY TABLEDROP MATERIALIZED VIEWDROP INDEXTRUNCATEDROP DATABASEDROP SCHEMA
ÐомандÑ, пеÑеÑоздаÑÑие обÑекÑÑ:
VACUUM FULLREINDEXALTER TABLE ADD COLUMN(Ñо знаÑением по ÑмолÑаниÑ)ALTER TABLE ALTER COLUMN TYPE
ÐÑли паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии wipe_file_on_delete вклÑÑÑн, ÑÐ°Ð¹Ð»Ñ Ð¿ÐµÑед Ñдалением ÑнаÑала заполнÑÑÑÑÑ Ð½ÑлевÑми байÑами.
ÐÑимеÑание
Ðоманда ALTER TABLE DROP COLUMN не пеÑеÑоздаÑÑ Ñайл. ÐÑе даннÑе, ÑодеÑжаÑиеÑÑ Ð² ÑдалÑемом ÑÑолбÑе, оÑÑаÑÑÑÑ Ð²Ð½ÑÑÑи ÑÑÑаниÑ, Ñ
оÑÑ Ðº ним и нелÑÐ·Ñ Ð¾Ð±ÑаÑаÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ SQL. ЧÑÐ¾Ð±Ñ ÑизиÑеÑки ÑдалиÑÑ ÑÑи даннÑе из Ñайла, вÑполниÑе VACUUM FULL поÑле ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑÑолбÑа.
30.1.2. ÐÑиÑÑка ÑÑÑÐ°Ð½Ð¸Ñ #
Ð ÑооÑвеÑÑÑвии Ñ Ð¼Ð¾Ð´ÐµÐ»ÑÑ MVCC (Multiversion Concurrency Control, ÐноговеÑÑионное ÑпÑавление конкÑÑенÑнÑм доÑÑÑпом) пÑи Ñдалении ÑÑÑок (командой DELETE) даннÑе, ÑодеÑжаÑиеÑÑ Ð² ÑÑиÑ
ÑÑÑокаÑ
, помеÑаÑÑÑÑ ÐºÐ°Ðº ÑдалÑннÑе, но ÑизиÑеÑки не ÑдалÑÑÑÑÑ. ÐÑи модиÑикаÑии ÑÑÑок (командой UPDATE) ÑнаÑала ÑдалÑеÑÑÑ ÑÑаÑÐ°Ñ Ð²ÐµÑÑÐ¸Ñ ÑÑÑоки, а заÑем вÑÑавлÑеÑÑÑ Ð½Ð¾Ð²Ð°Ñ, Ñак ÑÑо пÑедÑдÑÑее ÑодеÑжимое Ñак же ÑоÑ
ÑанÑеÑÑÑ Ð² ÑÑÑаниÑе.
ЧÑÐ¾Ð±Ñ Ð¼ÐµÑ
анизм MVCC ÑабоÑал коÑÑекÑно, Postgres Pro ÑоÑ
ÑанÑÐµÑ ÑдалÑннÑе даннÑе в ÑÑÑаниÑаÑ
до ÑеÑ
поÑ, пока ÑÑа веÑÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ð¾ÑÑÑебована какими-либо акÑивнÑми Ñнимками. ÐÑли ÑÑÑока задейÑÑвÑеÑÑÑ Ð² индекÑаÑ
, Ñо в ÑÑÑаниÑаÑ
индекÑов Ñак же ÑоÑ
ÑанÑÑÑÑÑ ÑÑÑлки на ÑÑÑоки, коÑоÑÑе бÑли ÑдаленÑ, но еÑÑ Ð½Ðµ оÑвобожденÑ. Ðогда веÑÑÐ¸Ñ ÑÑÑоки не воÑÑÑебована никакими Ñнимками, ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑдалиÑÑ, пÑÐ¾Ð¸Ð·Ð²ÐµÐ´Ñ Ð¿ÑоÑедÑÑÑ VACUUM. ÐÑи ÑÑом вÑе ÑÑÑлки на ÑÑÑ Ð²ÐµÑÑÐ¸Ñ Ð±ÑдÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸ из индекÑов. Ðднако ÑÑо Ñдаление не подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ ÑизиÑеÑкое ÑниÑÑожение: в обÑÑном Ñежиме ÑооÑвеÑÑÑвÑÑÑее меÑÑо в ÑÑÑаниÑе помеÑаеÑÑÑ ÐºÐ°Ðº Ñвободное и Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ ÑазмеÑÐµÐ½Ð¸Ñ Ð´ÑÑгой ÑÑÑоки.
ÐÐ»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпа к ÑдалÑннÑм веÑÑиÑм ÑÑÑок необÑ
одимо вклÑÑиÑÑ Ð¿Ð°ÑамеÑÑ wipe_heaptuple_on_delete в Ñайле конÑигÑÑаÑии postgresql.conf. ÐÑи ÑÑом пÑоÑеÑÑ VACUUM бÑÐ´ÐµÑ Ð½Ðµ ÑолÑко помеÑаÑÑ Ð¼ÐµÑÑо в ÑÑÑаниÑаÑ
как Ñвободное, но и заполнÑÑÑ ÐµÐ³Ð¾ нÑлевÑми байÑами.
30.1.3. ÐÑиÑÑка блоков памÑÑи в ÐÐУ #
Ðо вÑÐµÐ¼Ñ ÑабоÑÑ ÑеÑвеÑа опеÑаÑÐ¸Ð²Ð½Ð°Ñ Ð¿Ð°Ð¼ÑÑÑ (в ÐÐУ) поÑÑоÑнно вÑделÑеÑÑÑ Ð¸ оÑвобождаеÑÑÑ. Postgres Pro иÑполÑзÑÐµÑ ÑобÑÑвеннÑÑ Ð¿Ð¾Ð´ÑиÑÑÐµÐ¼Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑÑÑ, оÑнованнÑÑ Ð½Ð° конÑекÑÑÐ°Ñ , в коÑоÑой памÑÑÑ Ð²Ñегда вÑделÑеÑÑÑ Ð² одном из вложеннÑÑ ÐºÐ¾Ð½ÑекÑÑов. ÐÑи Ñдалении конÑекÑÑа оÑвобождаеÑÑÑ Ð²ÑÑ Ð¿Ð°Ð¼ÑÑÑ, вÑÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ð² нÑм и в ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½ÑÑ ÐºÐ¾Ð½ÑекÑÑÐ°Ñ . ÐÑÐ¾Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ позволÑÐµÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ ÑÑеÑек памÑÑи. Тем не менее вÑделением и оÑвобождением памÑÑи в конÑе конÑов занимаеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема. РобÑÑнÑÑ ÑÑловиÑÑ Ð¾ÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÐ¼Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ ÐÐУ возвÑаÑаеÑÑÑ Ð¾Ð¿ÐµÑаÑионной ÑиÑÑеме и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñделена дÑÑÐ³Ð¾Ð¼Ñ Ð¿ÑоÑеÑÑÑ.
ЧÑÐ¾Ð±Ñ Ð¸Ð· оÑвобождаемой облаÑÑи ÐÐУ ÑдалÑлиÑÑ Ð²Ñе даннÑе, вклÑÑиÑе ÑледÑÑÑие паÑамеÑÑÑ Ð² Ñайле конÑигÑÑаÑии postgresql.conf:
wipe_memctx_on_free â ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð²ÐºÐ»ÑÑÐ°ÐµÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ðµ нÑлевÑми байÑами оÑвобождаемой памÑÑи в каком-либо конÑекÑÑе.
wipe_mem_on_free â ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð²ÐºÐ»ÑÑÐ°ÐµÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ðµ нÑлевÑми байÑами оÑвобождаемой памÑÑи, не пÑинадлежаÑей Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¼Ñ ÐºÐ¾Ð½ÑекÑÑÑ. ХоÑÑ Postgres Pro вÑегда вÑделÑÐµÑ Ð¿Ð°Ð¼ÑÑÑ Ð² конÑекÑÑÐ°Ñ , Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе воÑполÑзоваÑÑÑÑ ÑÑим паÑамеÑÑом Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑей ÑвеÑенноÑÑи.
30.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 опиÑÑваеÑÑÑ Ð² Ðлаве 27.