Современный инстанс PostgreSQL пишет подробные и детальные логи практически обо всём, что происходит с базой и запросами. Логи PostgreSQL — это не только основной инструмент для поиска и отладки критических ошибок, но и важный инструмент мониторинга производительности приложений.

В этой статье мы разберём настройку логирования в PostgreSQL — начиная с основ: что логировать, как настраивать нужное вам логирование и в конце посмотрим, как эти логи помогают реально ускорять работу базы. Документация PostgreSQL по логам отлично написана, поэтому обращайтесь к ней за самыми актуальными и полными конфигурациями. Эта статья дополняет официальные рекомендации практическими советами и настройками. 

Мы обсудим:

  • Настройку уровней логирования, логирование SQL, ротацию логов

  • Логирование для мониторинга производительности

  • Извлечение и парсинг логов для получения полезной информации

Примечание о WAL: в этой статье речь идёт только о сообщениях сервера и логах ошибок, а не о журнале предзаписи транзакций (Write Ahead Log, WAL). Хотя WAL тоже является журналом, его назначение — фиксировать все изменения данных и схемы для резервного копирования, восстановления после сбоев и потоковой репликации.

Инициализация логирования в PostgreSQL

По умолчанию PostgreSQL отправляет логи только в терминал. Чтобы включить запись логов в файлы, нужно активировать сборщик логов (logging collector).

logging_collector = on

В каком формате нужны логи?

Формат сообщений задаётся параметром log_destination, который может быть установлен в одно или несколько значений: stderr, csvlog, jsonlog и syslog. По умолчанию используется stderr. При указании нескольких вариантов используйте запятую для разделения:

-- настройка нескольких мест назначения логов  
log_destination = 'stderr,jsonlog'  

Если logging_collector = 'on', то вывод в stderr, csvlog и jsonlog будет записываться в файлы в каталоге, указанном в log_directory. Для форматов csv и json требуется включённый logging collector.

Есть множество причин хранить логи в нескольких форматах. Во многих хостинговых и управляемых системах логи доступны в разных форматах для использования различными инструментами. В Crunchy Bridge, например, у нас живые логи и «log tail» в CLI через syslog. Для внутренних логов мы часто используем jsonlog. На серверах syslog обычно используется для отправки логов на внешний хост.

Какой уровень логирования выбрать?

Сообщения в логах PostgreSQL имеют уровень серьёзности (severity). Они упорядочены от менее критичных к наиболее критичным:

  • DEBUG1–5 — отладочные сообщения разной детализации (обычно используются разработчиками и для диагностики).

  • INFO — информационные сообщения, не влияющие на работу (например, уведомления статистики, служебные детали).

  • NOTICE — полезные уведомления, не являющиеся ошибкой (например, DROP TABLE IF EXISTS при отсутствии таблицы).

  • WARNING — потенциальные проблемы: использование устаревших функций, подозрительные данные.

  • ERROR — ошибка в запросе, прерывает только текущую операцию, но не завершает сессию.

  • LOG — важные сообщения сервера: контрольные точки (checkpoints), autovacuum, запуск/остановка сервера.

  • FATAL — ошибка, приводящая к завершению сессии.

  • PANIC — критическая ошибка, сервер аварийно завершается и переходит в восстановление.

Примеры сообщений лога:

-- сбой фонового процесса  
ERROR:  background worker "logical replication launcher" crashed  

-- ошибка дискового ввода-вывода 
ERROR:  could not fsync file "pg_wal/0000000100000000000000A3": Input/output error  

-- нехватка места на диске для временных файлов  
ERROR:  could not create temporary file: No space left on device  

-- предупреждение от autovacuum  
WARNING:  relation "public.large_table" contains more than "autovacuum_vacuum_threshold" dead tuples

Параметр log_min_messages определяет, начиная с какого уровня сообщения будут попадать в лог.

По умолчанию используется значение warning, то есть логируются все сообщения уровня WARNING и выше (ERROR, LOG, FATAL, PANIC).

Для отладки можно временно снижать уровень, например до info или даже debug5, чтобы видеть больше служебных сообщений. В боевых системах обычно оставляют warning или error.

Пример:

log_min_messages = 'warning'

Логирование SQL в PostgreSQL

Помимо выбора уровня серьёзности, можно настроить логирование SQL-запросов с помощью параметра log_statement. Возможные значения:

  • none — ничего не логировать. По умолчанию SQL-запросы не пишутся в лог, но предупреждения и ошибки будут отображаться в зависимости от настройки log_min_messages.

  • ddl — логировать только изменения структуры данных (DDL): изменения таблиц, колонок и индексов.

  • mod — логировать изменения данных, включая все DDL, а также операции INSERT, UPDATE и DELETE.

  • all — логировать каждый SQL-запрос, включая все DDL (обычно не включают в продакшене).

Для продакшена чаще всего достаточно логировать только DDL.

log_statement = 'ddl' 

Операторы с синтаксическими ошибками или ошибки на этапе парсинга/планирования не попадают под действие параметра log_statement. Для них используется настройка log_min_error_statement, которую следует выставить на ERROR или ниже, чтобы такие ошибки логировались.

log_min_error_statement = 'error'  

Ошибки SQL в логах выглядят примерно так. Если есть подсказка, то рядом появится строка HINT. Если включено логирование самого запроса (log_min_error_statement = 'error'), то он будет отображаться последним:

2025-05-09 14:02:37 UTC [28561] ERROR:  operator does not exist: integer == integer at character 33  
2025-05-09 14:02:37 UTC [28561] HINT:  Perhaps you meant to use the standard operator "=".  
2025-05-09 14:02:37 UTC [28561] STATEMENT:  SELECT * FROM users WHERE id == 42;  

Логирование подготовленных выражений и чувствительных данных

Одна из распространённых задач — исключить из логов чувствительные данные, такие как номера банковских карт или персональные данные (PII). Параметры log_parameter_max_length и log_parameter_max_length_on_error позволяют ограничить длину записываемых значений параметров, подставляемых в подготовленные выражения, соответственно для обычных логов запросов и для логов ошибок. Эти настройки применяются как к именованным подготовленным выражениям (PREPARE / EXECUTE), так и к «безымянным» подготовленным выражениям, которые используют драйверы БД через протокол extended query.

По умолчанию стоит -1 — это значит, что логируются все параметры полностью. Чтобы отключить логирование параметров, установите 0:

log_parameter_max_length = 0  
log_parameter_max_length_on_error = 0

Если ограничение требуется только для отдельных запросов или транзакций, параметры можно задать «на лету» через SET SESSION и SET LOCAL. Также их можно устанавливать глобально: для всех запросов конкретного пользователя (ALTER ROLE), конкретной базы (ALTER DATABASE) или даже для определённого пользователя в конкретной базе.

Примеры:

-- для всей сессии  
SET SESSION log_parameter_max_length = 0;  
SET SESSION log_parameter_max_length_on_error = 0;  

-- для транзакции  
BEGIN;  
SET LOCAL log_parameter_max_length = 0;  
SET LOCAL log_parameter_max_length_on_error = 0;  
...  
COMMIT;  

-- для всех запросов пользователя bob  
ALTER ROLE bob SET log_parameter_max_length = 0;  
ALTER ROLE bob SET log_parameter_max_length_on_error = 0;  

-- для всей базы pii_db  
ALTER DATABASE pii_db SET log_parameter_max_length = 0;  
ALTER DATABASE pii_db SET log_parameter_max_length_on_error = 0;  

-- для всех запросов bob в базе pii_db  
ALTER ROLE bob IN DATABASE pii_db SET log_parameter_max_length = 0;  
ALTER ROLE bob IN DATABASE pii_db SET log_parameter_max_length_on_error = 0; 

Как форматировать записи в логах

По умолчанию записи PostgreSQL выглядят так:

2025-05-19 13:49:04.908 EDT [3108283] ERROR: column "asdfklasdf" does not exist at character 8  

Часть с временной меткой и идентификатором процесса формируется параметром log_line_prefix:

log_line_prefix = '%m [%p] '  

Часто советуют задать более информативный префикс, чтобы сразу видеть, от имени какого пользователя и в какой базе сработало сообщение:

log_line_prefix = '%m [%p]%q %u@%d ' 

Важно оставлять идентификатор процесса (%p), он здорово помогает при отладке: можно быстро найти и остановить конкретный процесс. %u добавит имя пользователя, %d — имя базы данных. Особенно удобно, если в инстансе несколько баз.

Полный список доступных printf-подобных спецификаторов есть в документации к log_line_prefix.

Параметр log_error_verbosity отвечает за степень подробности сообщений об ошибках:

  • terse — краткий формат с кодом состояния SQL и сокращёнными сообщениями,

  • default — ошибки и подсказки (hint) включены,

  • verbose — добавляет дополнительный контекст, включая источники и имена функций (не рекомендуется для продакшена, но удобно в разработке).

Пример настройки:

log_error_verbosity = 'default' 

Аудиторское логирование

Кроме обычных логов, можно вести аудит действий пользователей с помощью расширения PGAudit. PGAudit не входит в ядро PostgreSQL, однако пакеты для него есть в репозиториях всех основных дистрибутивов ОС.

Использование расширения PGAudit требует, чтобы параметр pgaudit был указан в shared_preload_libraries, расширение было создано в каждой базе данных, где нужен аудит, а параметр pgaudit.log был установлен в значение, отличное от none.

-- добавить в список предзагружаемых библиотек  
shared_preload_libraries = 'pgaudit'  

-- создать расширение  
CREATE EXTENSION pgaudit;  

-- включить pgaudit.log  
pgaudit.log = ddl  

Аудиторские логи фиксируют более детальные данные: кто выполнил действие, когда это произошло, какие именно изменения были внесены. Это позволяет отслеживать конкретные действия пользователей, включая INSERT, UPDATE, DELETE и административные команды. Возможные значения для pgaudit.log: read, write, role, ddl, misc.

ALTER ROLE audited_user SET pgaudit.log = 'read, write, ddl';  

Пример записи аудиторского лога (формат CSV):

2025-05-09 12:34:56.789 UTC [12345] myuser@mydb LOG:  AUDIT: SESSION,1,SELECT,pg_catalog.pg_stat_activity,SELECT * FROM pg_stat_activity;  

Да, обычные и аудиторские логи частично пересекаются — так и задумано. pgAudit предоставляет более детализированное логирование (включая данные о сессии, ролях и изменениях) в дополнение к встроенному логированию PostgreSQL. Если вам нужно фиксировать только DDL-операции и дополнительные возможности аудита не нужны, то достаточно параметра log_statement = 'ddl'.

В Crunchy Bridge мы ведём аудит всего, кроме роли приложения. Таким образом, по умолчанию аудит включён для вашей основной роли PostgreSQL и всех создаваемых пользовательских ролей.

Имена и расположение файлов логов

Параметр log_filename задаёт формат имён файлов журналов с помощью escape-шаблонов strftime. По умолчанию имя файла включает «postgresql» и временную метку.

log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'  

Обычно детализация до часов, минут и секунд избыточна, поэтому часто используют более простой формат:

log_filename = 'postgresql-%Y-%m-%d'

Файлы stderr будут иметь расширение .log, файлы csvlog — .csv, а jsonlog.json.

Файлы, записываемые PostgreSQL в формате stderr, csvlog и jsonlog, размещаются в каталоге, указанном в log_directory. Это может быть как абсолютный путь, так и путь, относительный к data_directory. Расположение файлов, пишущихся в syslog, зависит от конфигурации syslog на системе.

Примеры:

-- где на хосте находится каталог данных  
SHOW data_directory;  

-- где находится каталог логов  
SHOW log_directory;  

-- как выглядят имена файлов логов  
SHOW log_filename;  

-- точное расположение текущего файла лога  
SELECT pg_current_logfile();  

Ротация логов

Теперь у нас есть настроенные логи… Но если не настроить их ротацию, то диск очень быстро заполнится.

Пример настройки ротации раз в сутки:

log_rotation_age = '1d'  

Пример настройки ротации по размеру: если файл превысил 10 МБ раньше, чем прошло 24 часа:

log_rotation_size = '10MB'  

Если формат log_filename приведёт к повторному использованию одного и того же имени файла (например, postgresql-Mon.log будет использоваться каждый понедельник), параметр log_truncate_on_rotation заставит файл логов обнуляться перед каждым повторным использованием. Если log_truncate_on_rotation не включён, то данные будут дописываться в существующий файл, а не затираться.

log_truncate_on_rotation = 'on' 

Если используется формат имени файла, исключающий повторное использование (например, postgresql-%Y-%m-%d.log), рекомендуется задействовать внешний инструмент ротации логов, такой как Linux logrotate. Так можно удалять старые логи после архивации, чтобы не тратить лишнее место.

Отладка с помощью логов

Теперь, когда базовое логирование настроено, его можно использовать для диагностики проблем в системе. Обычно работа с логами выглядит так:

  • Кто-то замечает проблему: база тормозит, упала или сработали алерты.

  • Смотрим метрики: скачок CPU? I/O? Чем точнее определим время — тем проще искать.

  • Поднимаем логи за этот интервал, ищем ошибки, блокировки или странные сообщения.

  • Если виноват конкретный процесс — находим его PID. Запрос/блокировка? Пробуем прибить. Тяжёлая джоба душит систему? Разбираем последствия.

Логируем узкие места

Итак, если вы всё ещё читаете, значит у нас уже есть логи, мы понимаем их структуру и назначение, и можем использовать их для поиска критических ошибок. Но в идеале ошибки случаются редко — куда важнее ускорять запросы. Для этого и пригодится правильное логирование.

Логирование долгих запросов

Если вы хотите ловить в логах запросы, которые выполняются дольше заданного времени, используйте параметр log_min_duration_statement. Это порог логирования «медленных запросов» в PostgreSQL, который особенно полезен для отладки длительных операций.

Начав работать над оптимизацией производительности, самое полезное — логировать самые долгие запросы, чтобы понять, что тормозит.

log_min_duration_statement = '1s'  
Пример записи в лог для запроса, выполнявшегося более 1 секунды:
LOG:  duration: 2001.342 ms  statement: SELECT count(*) from orders;  

Логирование блокировок и ожидания блокировок

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

Включение этой опции практически не создаёт накладных расходов и абсолютно безопасно для рабочих баз данных. В кластерах Crunchy Bridge параметр включён по умолчанию:

log_lock_waits = 'on'  

Порог логирования ожиданий задаётся параметром deadlock_timeout. Например, если deadlock_timeout = '1s', то любой запрос, который ждёт блокировку 1 секунду и дольше, попадёт в лог.

Пример записи об ожидании блокировки:

2024-05-16 14:45:12.345 UTC [45678] user@database LOG:  process 45678 still waiting for ShareLock on transaction 123456 after 1000.001 ms
2024-05-16 14:45:12.345 UTC [45678] user@database DETAIL:  Process holding the lock: 12345. Wait queue: 45678, 45670.
2024-05-16 14:45:12.345 UTC [45678] user@database STATEMENT:  UPDATE orders SET status = 'shipped' WHERE id = 42;

Из этой записи видно:

  • PID процесса, для которого зафиксировано ожидание блокировки;

  • PID процесса, удерживающего блокировку;

  • список PID всех процессов, ожидающих блокировку, в порядке их запросов;

  • сам запрос, которому требуется блокировка.

Логирование временных файлов

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

Параметр log_temp_files позволяет логировать создание временных файлов. По умолчанию он выключен (-1). Если задать 0, PostgreSQL будет записывать в лог все операции создания временных файлов, что обычно избыточно.

Значение log_temp_files не обязательно должно совпадать с work_mem: один запрос может содержать несколько операций сортировки или хеша, и итоговый временный файл может быть как немного больше лимита, так и существенно его превышать. Поэтому обычно задают фиксированный порог (например, 1–10 МБ), чтобы фиксировать действительно тяжёлые запросы.

Если операция помещается в work_mem, временные файлы не создаются и логирование не требуется. Если лимит превышен, PostgreSQL создаёт временный файл соответствующего размера, и это помогает увидеть, какие запросы выходят за рамки выделенной памяти.

Пример настройки:

-- логировать временные файлы больше 4 МБ
ALTER SYSTEM SET log_temp_files = '4096';

Пример записи в логе:

2024-05-16 14:23:05.123 UTC [12345] user@database LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp1234.0", size 245760
2024-05-16 14:23:05.123 UTC [12345] user@database DETAIL:  Sort operation used temporary file because work_mem was exceeded

Логирование запросов с помощью auto_explain

auto_explain — это расширение Postgres, которое автоматически записывает планы выполнения запросов (EXPLAIN) в лог. Оно полезно для отладки и оптимизации производительности. Расширение auto_explain есть в PostgreSQL, но включается вручную.

-- добавить в список предзагружаемых библиотек
shared_preload_libraries = 'auto_explain'  

-- после перезапуска создать расширение  
CREATE EXTENSION IF NOT EXISTS auto_explain;  

-- после этого перезапустить PostgreSQL  

Можно настроить auto_explain так, чтобы в лог попадали планы запросов определённой продолжительности:

-- логировать планы для запросов, выполнявшихся дольше 1000 мс  
auto_explain.log_min_duration = '1000ms';  

У расширения есть и другие параметры, например, для отображения использования буферов. Подробности — в документации по auto_explain. Стоит учитывать, что auto_explain генерирует большое количество логов, поэтому использовать его нужно осторожно. Для очень тяжёлых запросов или запросов по секционированным таблицам планы могут быть огромными. Альтернативой постоянному включению auto_explain может быть его активация только для отдельной сессии.

Пример лога auto_explain:
LOG:  duration: 1008.035 ms  plan:  
May 17 02:42:06 z7j4asvir5dufokh5hpzoy postgres[43712]: [29-2]  
Query Text: select count(*) from page_hits limit 1000;  

Логирование autovacuum

Логировать autovacuum или нет — решает параметр log_autovacuum_min_duration. Начиная с PG15, он по умолчанию равен 10 минутам, а в предыдущих версиях был отключён (значение -1). Поскольку записи autovacuum содержат ту же информацию, что и VACUUM VERBOSE, многие администраторы снижают порог до одной-двух секунд для получения подробной информации о работе демона autovacuum, а иногда ставят 0, чтобы логировались все его действия.

log_autovacuum_min_duration = '1s'  

Пример записи о работе autovacuum (начиная с PostgreSQL 15):

[3506673][autovacuum worker][501/2614][0] LOG:  automatic vacuum of table "testdb.public.pgbench_accounts": index scans: 1
        pages: 0 removed, 327869 remain, 81969 scanned (25.00% of total)
        tuples: 0 removed, 14769015 remain, 2000000 are dead but not yet removable
        removable cutoff: 929, which was 3 XIDs old when operation ended
        new relfrozenxid: 929, which is 11 XIDs ahead of previous value
        frozen: 0 pages from table (0.00% of total) had 0 tuples frozen
        index scan needed: 49181 pages from table (15.00% of total) had 2999999 dead item identifiers removed
        index "pgbench_accounts_pkey": pages: 54840 in total, 8224 newly deleted, 8224 currently deleted, 0 reusable
        I/O timings: read: 174.219 ms, write: 0.000 ms
         avg read rate: 26.491 MB/s, avg write rate: 22.489 MB/s
         buffer usage: 276192 hits, 41175 misses, 34955 dirtied
         WAL usage: 123002 records, 57432 full page images, 75538789 bytes
         system usage: CPU: user: 0.64 s, system: 0.27 s, elapsed: 12.14 s

Пример записи из более ранних версий PostgreSQL:

[17656][autovacuum worker][5/463][0] LOG:  automatic vacuum of table "testdb.public.pgbench_accounts": index scans: 1
        pages: 0 removed, 327869 remain, 0 skipped due to pins, 0 skipped frozen
        tuples: 0 removed, 14740860 remain, 2000000 are dead but not yet removable, oldest xmin: 760
        index scan needed: 49181 pages from table (15.00% of total) had 2999999 dead item identifiers removed
        index "pgbench_accounts_pkey": pages: 54840 in total, 8224 newly deleted, 8224 currently deleted, 0 reusable
        I/O timings: read: 488.030 ms, write: 238.542 ms
        avg read rate: 55.609 MB/s, avg write rate: 21.009 MB/s
        buffer usage: 192958 hits, 124428 misses, 47008 dirtied
        WAL usage: 122981 records, 0 full page images, 19019531 bytes
         system usage: CPU: user: 1.14 s, system: 0.80 s, elapsed: 17.48 s

Как из логов выжать максимум

Для большинства приложений с большой нагрузкой рекомендуется не просто складывать их в папку ради галочки, а использовать их. Доступность и возможность поиска по логам критически важны для отладки и, как вы уже видели выше, очень полезны для анализа производительности. Логи похожи на страховку: они не нужны каждый день, но когда возникает проблема — вы рады, что они у вас есть.

pgBadger

Есть один open-source проект для анализа логов PostgreSQL — pgBadger. Если вам приходилось просматривать логи вручную, этот инструмент покажется настоящей магией. Он преобразует вывод PostgreSQL в HTML-страницу с интерактивными графиками.

Обычно его запускают периодически или по запросу, чтобы проанализировать логи PostgreSQL и сгенерировать отчёты в HTML.

Если вы используете управляемый облачный сервис PostgreSQL и у вас есть возможность выгружать логи в файл, можно применять pgBadger. В Crunchy Bridge, например, можно «подключить хвост» логов напрямую к pgBadger:

-- отправить логи CLI в локальный текстовый файл
cb logs qzyqhjdg3focnta3zvleomq > pglogs.txt

-- pgBadger читает текстовый файл и формирует html-отчёт
pgbadger -f syslog pglogs.txt -o out.html

Сторонние инструменты для сбора логов

Есть масса сервисов, которые берут на себя хранение, парсинг и быстрый поиск по логам. Наши клиенты успешно используют pganalyze, Datadog, Honeybadger и другие. Эти решения могут работать как агент, контейнер-под или сервис, экспортирующий логи. Для облачного хостинга такой подход особенно удобен.

-- настройка передачи логов в syslog  
log_destination = 'syslog';  

Хранилища данных для логов

В больших проектах логи сами по себе превращаются в отдельный проект. Некоторые команды выбирают самостоятельный хостинг и организацию запросов к логам. Системы вроде Snowflake, ClickHouse, Crunchy Data Warehouse и другие позволяют хранить и обрабатывать высоконагруженные логи средствами SQL. А если хранить их в object storage в виде файлов — получается довольно бюджетно.

Сводка рекомендуемых настроек логирования

Ниже — основные параметры из статьи. Но не копируйте вслепую: всё зависит от вашей нагрузки и окружения.

-- включить сборщик логов  
ALTER SYSTEM SET logging_collector = 'on';  

-- логировать системные ошибки  
ALTER SYSTEM SET log_min_messages = 'warning'; («в продакшене часто выставляют error, чтобы сократить шум»)

-- логировать все изменения структуры данных  
ALTER SYSTEM SET log_statement = 'ddl';  

-- логировать полный текст запросов при ошибках SQL  
ALTER SYSTEM SET log_min_error_statement = 'ERROR';  

-- имя файла лога  
ALTER SYSTEM SET log_filename = 'postgres-%Y-%m-%d';  

-- добавить в префикс имя БД и PID процесса  
ALTER SYSTEM SET log_line_prefix = '%m [%p] %q%u@%d ';  

-- ежедневная ротация логов  
ALTER SYSTEM SET log_rotation_age = '1d';  

-- включить pgaudit.log  
ALTER SYSTEM SET pgaudit.log = 'ddl';  

-- логировать запросы длиннее 1000 мс  
ALTER SYSTEM SET log_min_duration_statement = '1000';  

-- логировать ожидания блокировок  
ALTER SYSTEM SET log_lock_waits = 'on';  

-- логировать временные файлы больше 4 МБ
ALTER SYSTEM SET log_temp_files = '4096';  

-- логировать планы запросов дольше 1000 мс  
ALTER SYSTEM SET auto_explain.log_min_duration = '1000ms';  

-- настроить вывод логов в syslog или другой источник для поиска  
ALTER SYSTEM SET log_destination = 'syslog'; 

Заключение

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

Цена логов — в диске и деньгах. Они быстро разрастаются, если не следить. Баланс простой: храните то, что нужно, и выбрасывайте остальное.

Если цель — ускорение, смотрите на медленные запросы и их планы (через auto_explain), а ещё на временные файлы — они подскажут, где PostgreSQL упёрся в память.

Не забывайте про дев и стейдж: там логи позволяют поймать баги и проверить планы, не тратя ресурсы боевого контура.


Логи в PostgreSQL быстро убеждают: ошибки — это не только проблемы, но и подсказки для оптимизации. Если хочется глубже разобраться в администрировании, настройке и ускорении Postgres в боевых системах, обратите внимание на курс «PostgreSQL для администраторов баз данных и разработчиков» — один из самых востребованных для повышения квалификации. На странице курса можно пройти вступительный тест для оценки своих знаний.

А пока есть возможность заглянуть на бесплатные практические открытые уроки курса — в прямом эфире и с разбором реальных кейсов:

  • 27 августа в 20:00 — Инкрементальное бекапирование средствами PostgreSQL. Записаться

  • 9 сентября в 20:00 — Механизмы блокировок в PostgreSQL. Записаться

  • 24 сентября в 20:00 — Маленькие хитрости GROUP BY. Записаться

Комментарии (0)