Перейти к основному содержимому

3.08. Справочник по PostgreSQL

Разработчику Аналитику Тестировщику
Архитектору Инженеру

Справочник по PostgreSQL

1. Конфигурационные параметры (postgresql.conf)

PostgreSQL управляет поведением сервера через параметры, задаваемые в файле postgresql.conf или через SQL-команду SET. Параметры разделены на категории:

1.1. Общие параметры

ПараметрОписаниеВозможные значенияПо умолчанию
cluster_nameИмя кластера для мониторингастрока''
data_directoryКаталог с данными кластераабсолютный путь$PGDATA
config_fileПуть к основному конфигурационному файлуабсолютный путь$PGDATA/postgresql.conf
hba_fileФайл управления доступом клиентовабсолютный путь$PGDATA/pg_hba.conf
ident_fileФайл сопоставления пользователей ОС и PostgreSQLабсолютный путь$PGDATA/pg_ident.conf

1.2. Память

ПараметрОписаниеВозможные значенияПо умолчанию
shared_buffersОбъём разделяемой памяти для кэширования страниц128kB–8GB128MB
work_memПамять на одну операцию сортировки/хэширования64kB–2GB4MB
maintenance_work_memПамять для операций обслуживания (VACUUM, CREATE INDEX)1MB–2GB64MB
effective_cache_sizeОценка размера дискового кэша ОС128kB–8TB4GB
huge_pagesИспользование huge pageson, off, trytry

1.3. WAL (Write-Ahead Logging)

ПараметрОписаниеВозможные значенияПо умолчанию
wal_levelУровень детализации WALminimal, replica, logicalreplica
max_wal_sizeМаксимальный объём WAL перед контрольной точкой2MB–INT_MAX1GB
min_wal_sizeМинимальный объём WAL, сохраняемый между контрольными точками2MB–INT_MAX80MB
checkpoint_timeoutИнтервал между контрольными точками30s–1d5min
checkpoint_completion_targetДоля времени до следующей контрольной точки, отводимая на завершение текущей0.0–1.00.9
wal_keep_sizeОбъём WAL, сохраняемый для реплик0–INT_MAX0
archive_modeВключение архивации WALon, off, alwaysoff
archive_commandКоманда для архивации WAL-файловкоманда ОС''

1.4. Репликация

ПараметрОписаниеВозможные значенияПо умолчанию
max_replication_slotsМаксимальное число слотов репликации0–INT_MAX10
max_wal_sendersМаксимальное число процессов отправки WAL0–INT_MAX10
hot_standbyРазрешение чтения на standby-сервереon, offon
primary_conninfoСтрока подключения к первичному серверу (в standby)строка подключения''
recovery_target_timelineЦелевая временная линия при восстановлении'current', 'latest', номер'latest'

1.5. Параллелизм и фоновые процессы

ПараметрОписаниеВозможные значенияПо умолчанию
max_connectionsМаксимальное число одновременных подключений1–INT_MAX100
superuser_reserved_connectionsПодключения, зарезервированные для суперпользователей0–max_connections-13
max_worker_processesМаксимальное число фоновых рабочих процессов0–INT_MAX8
max_parallel_workers_per_gatherМаксимум параллельных рабочих на один запрос0–max_parallel_workers2
max_parallel_workersОбщее число параллельных рабочих0–max_worker_processes8

1.6. Журналирование

ПараметрОписаниеВозможные значенияПо умолчанию
log_destinationНазначение логовstderr, csvlog, syslog, eventlogstderr
logging_collectorВключение сборщика логовon, offoff
log_filenameШаблон имени файла логастрокаpostgresql-%Y-%m-%d_%H%M%S.log
log_statementУровень логирования SQL-запросовnone, ddl, mod, allnone
log_min_duration_statementМинимальная длительность запроса для логирования-1 (откл), 0–INT_MAX-1
log_line_prefixПрефикс каждой строки логастрока с переменными'%t [%p]: '

1.7. Безопасность и аутентификация

ПараметрОписаниеВозможные значенияПо умолчанию
password_encryptionАлгоритм хэширования паролейmd5, scram-sha-256scram-sha-256
sslВключение SSLon, offoff
ssl_cert_fileПуть к сертификатуабсолютный путьserver.crt
ssl_key_fileПуть к приватному ключуабсолютный путьserver.key
authentication_timeoutТаймаут ожидания аутентификации1s–600s1min

2. Системные представления (System Catalog Views)

PostgreSQL предоставляет множество системных представлений в схеме pg_catalog и information_schema.

2.1. Основные каталоги

ПредставлениеОписание
pg_databaseИнформация о всех базах данных
pg_namespaceСхемы (namespaces)
pg_classТаблицы, индексы, последовательности, представления
pg_attributeСтолбцы таблиц и представлений
pg_indexИнформация об индексах
pg_constraintОграничения (PRIMARY KEY, FOREIGN KEY, CHECK)
pg_procПроцедуры и функции
pg_typeТипы данных
pg_extensionУстановленные расширения
pg_settingsТекущие значения всех параметров конфигурации

2.2. Статистика и мониторинг

ПредставлениеОписание
pg_stat_databaseСтатистика по базам данных
pg_stat_user_tablesСтатистика по пользовательским таблицам
pg_stat_user_indexesСтатистика по индексам
pg_stat_bgwriterСтатистика фонового записывающего процесса
pg_stat_replicationСостояние репликации
pg_stat_activityТекущие активные сессии
pg_locksИнформация о блокировках
pg_prepared_xactsПодготовленные транзакции (двухфазный коммит)

2.3. WAL и репликация

ПредставлениеОписание
pg_stat_walСтатистика по WAL
pg_replication_slotsИнформация о слотах репликации
pg_stat_subscriptionСтатус подписок логической репликации
pg_stat_publicationСтатус публикаций

3. Типы данных

3.1. Числовые

ТипДиапазонЗанимаемое местоПримечание
smallint-32768 – 327672 байта16-битное целое
integer-2147483648 – 21474836474 байта32-битное целое
bigint-9223372036854775808 – 92233720368547758078 байт64-битное целое
numeric(p,s)до 131072 цифр до точки, до 16383 послепеременноеТочный десятичный
real6 десятичных знаков4 байтаIEEE 754 float
double precision15 десятичных знаков8 байтIEEE 754 double

3.2. Строковые

ТипОписание
textНеограниченная строка
varchar(n)Строка до n символов
char(n)Строка фиксированной длины n, дополняется пробелами

3.3. Временные

ТипОписание
timestampДата и время без часового пояса
timestamptzДата и время с часовым поясом
dateТолько дата
timeТолько время
timetzВремя с часовым поясом
intervalПромежуток времени

3.4. Логические

ТипЗначения
booleantrue, false, null

3.5. Специальные

ТипОписание
byteaБинарные данные
jsonJSON-данные (текстовое хранилище)
jsonbJSON-данные (бинарное, индексируемое)
uuidУниверсальный уникальный идентификатор
inetIPv4/IPv6 адрес
cidrCIDR-нотация сети
macaddrMAC-адрес
tsvectorВектор текста для полнотекстового поиска
tsqueryЗапрос для полнотекстового поиска
arrayМассив любого типа, например integer[]
rangeДиапазон значений (например, int4range, tsrange)

4. Встроенные функции

4.1. Строковые функции

ФункцияОписание
length(text)Длина строки
upper(text), lower(text)Преобразование регистра
trim(text), ltrim(text), rtrim(text)Удаление пробелов
substring(text from pattern)Извлечение подстроки
replace(text, from, to)Замена подстроки
concat(str1, str2, ...)Конкатенация строк
split_part(text, delimiter, field)Разделение строки и выбор части
regexp_replace(text, pattern, replacement)Замена по регулярному выражению

4.2. Числовые функции

ФункцияОписание
abs(x)Абсолютное значение
ceil(x), floor(x)Округление вверх/вниз
round(x, d)Округление до d знаков
random()Случайное число от 0 до 1
mod(dividend, divisor)Остаток от деления
power(base, exponent)Возведение в степень
sqrt(x)Квадратный корень

4.3. Функции даты и времени

ФункцияОписание
now()Текущая дата и время с часовым поясом
current_timestampТо же, что now()
clock_timestamp()Точное время выполнения (меняется внутри запроса)
date_part(field, timestamp)Извлечение части (год, месяц и т.д.)
age(timestamp)Разница между now() и timestamp
extract(field from timestamp)Альтернатива date_part
to_char(timestamp, format)Форматирование даты в строку
to_timestamp(text, format)Преобразование строки в timestamp

4.4. Агрегатные функции

ФункцияОписание
count(*)Число строк
sum(column)Сумма значений
avg(column)Среднее значение
min(column), max(column)Минимум и максимум
array_agg(column)Агрегация в массив
string_agg(column, delimiter)Конкатенация строк с разделителем
json_agg(row), jsonb_agg(row)Агрегация в JSON

4.5. Функции JSON

ФункцияОписание
jsonb_build_object(key, value, ...)Создание объекта JSONB
jsonb_array_elements(jsonb)Расщепление массива на строки
jsonb_extract_path(jsonb, VARIADIC path)Извлечение по пути
jsonb_set(target, path, new_value)Изменение значения по пути
jsonb_pretty(jsonb)Красивое форматирование JSONB

4.6. Функции полнотекстового поиска

ФункцияОписание
to_tsvector(config, document)Преобразование текста в tsvector
to_tsquery(config, query)Преобразование запроса в tsquery
plainto_tsquery(config, query)Простой запрос без операторов
phraseto_tsquery(config, phrase)Фразовый запрос
ts_rank(tsvector, tsquery)Ранжирование совпадений

5. Операторы

5.1. Логические

ОператорОписание
AND, OR, NOTЛогические операции
=, <>, <, <=, >, >=Сравнение
BETWEEN a AND bВ диапазоне
IN (val1, val2, ...)Совпадение со списком
LIKE, ILIKEСравнение с шаблоном (регистрозависимо/независимо)
~, ~*, !~, !~*Регулярные выражения (чувствительные/нечувствительные к регистру)

5.2. JSON

ОператорОписание
->Извлечение элемента по ключу (возвращает jsonb)
->>Извлечение как текст
#>Извлечение по массиву путей
#>>Извлечение по массиву путей как текст
@>Левый операнд содержит правый
<@Левый операнд содержится в правом
?Проверка наличия ключа
`?`
?&Проверка наличия всех ключей

5.3. Массивы

ОператорОписание
=, <>Сравнение массивов
@>, <@Содержание/содержится
&&Пересечение массивов
array[1,2,3]Литерал массива
ANY(array)Сравнение с любым элементом массива

6. Утилиты командной строки

PostgreSQL поставляется с набором утилит для администрирования, резервного копирования, миграции и диагностики.

6.1. Основные утилиты

УтилитаНазначение
psqlИнтерактивный клиент SQL, поддерживает мета-команды (\l, \d, \du, \dt, \x, \timing)
pg_dumpЛогический дамп одной базы данных в текстовом или кастомном формате
pg_dumpallДамп всех баз данных, включая глобальные объекты (роли, табличные пространства)
pg_restoreВосстановление из кастомного/тар-архива, созданного pg_dump -Fc
pg_basebackupФизическое резервное копирование всего кластера данных
pg_ctlУправление сервером: запуск, остановка, перезагрузка, проверка статуса
initdbИнициализация нового кластера данных
createdb / dropdbСоздание и удаление базы данных
createuser / dropuserСоздание и удаление роли (устаревшие, лучше использовать SQL)
vacuumdbЗапуск VACUUM из командной строки
reindexdbПерестроение индексов
clusterdbКластеризация таблиц по индексу
pg_isreadyПроверка доступности сервера

6.2. Расширенные утилиты

УтилитаНазначение
pg_receivewalПриём WAL-файлов от основного сервера (для архивации или репликации)
pg_receivexlogУстаревшее имя для pg_receivewal (до версии 10)
pg_archivecleanupУдаление старых WAL-файлов, не нужных для реплик или PITR
pg_checksumsВключение/отключение контрольных сумм на уровне страниц данных
pg_verifybackupПроверка целостности резервной копии (начиная с v13)
pg_waldumpДекодирование содержимого WAL-файлов в читаемый вид
pg_configОтображение путей и параметров сборки PostgreSQL

7. Административные команды SQL

7.1. Управление базами данных и ролями

-- Создание базы данных
CREATE DATABASE app_db OWNER app_user;

-- Создание роли с правами входа
CREATE ROLE app_user WITH LOGIN PASSWORD 'strongpass';

-- Назначение привилегий
GRANT CONNECT ON DATABASE app_db TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_user;

-- Отзыв привилегий
REVOKE ALL PRIVILEGES ON DATABASE app_db FROM app_user;

7.2. Обслуживание

-- Анализ статистики (для оптимизатора)
ANALYZE;

-- Полная очистка и анализ
VACUUM ANALYZE;

-- Принудительная очистка (может блокировать таблицу)
VACUUM FULL table_name;

-- Перестроение индекса
REINDEX TABLE table_name;
REINDEX INDEX index_name;

-- Кластеризация по индексу (физическая сортировка строк)
CLUSTER table_name USING index_name;

7.3. Управление расширениями

-- Установка расширения
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE EXTENSION IF NOT EXISTS "postgis";

-- Список установленных расширений
SELECT * FROM pg_extension;

7.4. Управление репликацией

-- Создание слота репликации
SELECT pg_create_physical_replication_slot('standby_slot');

-- Просмотр слотов
SELECT * FROM pg_replication_slots;

-- Отключение слота
SELECT pg_drop_replication_slot('standby_slot');

8. Резервное копирование и восстановление

8.1. Логическое резервное копирование

# Дамп одной БД в SQL
pg_dump -U user -h localhost app_db > app_db.sql

# Дамп в кастомный формат (поддерживает параллелизм и выборочное восстановление)
pg_dump -Fc -U user -h localhost app_db -f app_db.dump

# Восстановление
psql -U user -d new_db < app_db.sql
pg_restore -U user -d new_db app_db.dump

8.2. Физическое резервное копирование

# Горячее резервное копирование
pg_basebackup -h primary_host -U replicator -D /backup/pgdata -P -v -R

# Архивация WAL (в postgresql.conf)
archive_mode = on
archive_command = 'cp %p /wal_archive/%f'

8.3. Восстановление на момент времени (PITR)

  1. Остановить сервер.
  2. Заменить каталог данных на резервную копию.
  3. Создать файл recovery.signal.
  4. Настроить postgresql.auto.conf:
restore_command = 'cp /wal_archive/%f %p'
recovery_target_time = '2026-01-25 14:30:00'
  1. Запустить сервер — он восстановится до указанного момента.

9. Безопасность

9.1. Файл pg_hba.conf

Определяет правила аутентификации клиентов. Формат строки:

local   DATABASE  USER  METHOD  [OPTIONS]
host DATABASE USER ADDRESS METHOD [OPTIONS]

Примеры:

# Локальный суперпользователь — без пароля через peer
local all postgres peer

# Локальные пользователи — scram-sha-256
local all all scram-sha-256

# Удалённый доступ только с определённого IP
host app_db app_user 192.168.1.100/32 scram-sha-256

# Доступ с любого IP (осторожно!)
host all all 0.0.0.0/0 md5

После изменения требуется перезагрузка или pg_ctl reload.

9.2. Шифрование

  • Поддержка SSL/TLS: настраивается через ssl = on и сертификаты.
  • Расширение pgcrypto предоставляет функции шифрования (pgp_sym_encrypt, digest, gen_salt).
  • TDE (Transparent Data Encryption) не встроен, но реализуется через расширения (например, pg_tde в разработке).

10. Расширения (Extensions)

PostgreSQL легко расширяется. Популярные расширения:

РасширениеНазначение
uuid-osspГенерация UUID
pgcryptoКриптографические функции
postgisПоддержка геоданных и пространственных запросов
hstoreХранение пар «ключ-значение»
ltreeДеревья и иерархические пути
citextРегистронезависимые строки
pg_stat_statementsСбор статистики по выполненным запросам
auto_explainАвтоматический EXPLAIN для медленных запросов
pg_partmanУправление партициями
timescaledbМасштабирование временных рядов

Активация:

CREATE EXTENSION IF NOT EXISTS "pg_stat_statements";

Настройка в postgresql.conf:

shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all

11. Производительность и мониторинг

11.1. EXPLAIN и EXPLAIN ANALYZE

EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)
SELECT * FROM orders WHERE customer_id = 123;

Вывод показывает план выполнения, реальное время, использование буферов.

11.2. Ключевые метрики

  • seq_scan vs idx_scan — соотношение полных сканирований и индексных.
  • n_tup_ins, n_tup_upd, n_tup_del — активность по таблице.
  • blks_read vs blks_hit — эффективность кэша (blks_hit / (blks_read + blks_hit)).
  • wait_event в pg_stat_activity — причины ожидания (I/O, блокировки).

11.3. Инструменты мониторинга

  • Встроенные: pg_stat_statements, auto_explain.
  • Внешние: pgBadger (анализ логов), Prometheus + postgres_exporter, Zabbix, Datadog.

12. Продвинутые возможности

12.1. Партиционирование

Поддержка декларативного партиционирования (с v10):

CREATE TABLE measurements (
id serial,
logdate date not null,
value numeric
) PARTITION BY RANGE (logdate);

CREATE TABLE measurements_y2025m01
PARTITION OF measurements
FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');

12.2. Логическая репликация

Позволяет реплицировать отдельные таблицы:

-- На издателе
CREATE PUBLICATION sales_pub FOR TABLE sales;

-- На подписчике
CREATE SUBSCRIPTION sales_sub
CONNECTION 'host=publisher dbname=app_db user=replicator'
PUBLICATION sales_pub;
-- Создание tsvector-колонки
ALTER TABLE articles ADD COLUMN body_ts tsvector;
UPDATE articles SET body_ts = to_tsvector('russian', body);

-- Поиск
SELECT title FROM articles
WHERE body_ts @@ to_tsquery('russian', 'база & данных');

-- Индекс для ускорения
CREATE INDEX idx_fts_body ON articles USING GIN(body_ts);

12.4. JSON/JSONB

-- Поиск по ключу
SELECT data->>'name' FROM products WHERE data @> '{"category": "electronics"}';

-- Обновление
UPDATE products
SET data = jsonb_set(data, '{price}', '199.99')
WHERE id = 1;

13. Типовые конфигурации для разных сценариев

13.1. Разработка (локальная машина)

Цель: минимальные ресурсы, быстрый старт, удобство отладки.

shared_buffers = 128MB
work_mem = 16MB
maintenance_work_mem = 128MB
max_connections = 20
fsync = off # только для разработки!
synchronous_commit = off # только для разработки!
log_statement = 'all'
log_min_duration_statement = 0

Важно: fsync = off и synchronous_commit = off ускоряют операции, но делают систему уязвимой к потере данных при сбое. Никогда не используйте их в production.

13.2. Малый production-сервер (2–4 ядра, 8–16 ГБ RAM)

shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 64MB
maintenance_work_mem = 1GB
max_connections = 100
random_page_cost = 1.1 # для SSD
checkpoint_timeout = 30min
checkpoint_completion_target = 0.9
wal_level = replica
max_wal_senders = 5
max_replication_slots = 5
log_min_duration_statement = 1000 # логировать запросы >1 сек

13.3. Высоконагруженный OLTP-сервер (16+ ядер, 64+ ГБ RAM)

shared_buffers = 16GB
effective_cache_size = 48GB
work_mem = 256MB
maintenance_work_mem = 4GB
max_connections = 300
max_worker_processes = 16
max_parallel_workers_per_gather = 4
max_parallel_workers = 16
random_page_cost = 1.0
bgwriter_delay = 10ms
bgwriter_lru_maxpages = 1000
wal_buffers = 64MB
commit_delay = 10
commit_siblings = 5

13.4. Аналитический сервер (OLAP, тяжёлые агрегаты)

work_mem = 1GB              # много памяти на сортировку
shared_buffers = 8GB
effective_cache_size = 48GB
max_parallel_workers_per_gather = 8
jit = on # JIT-компиляция запросов
from_collapse_limit = 12
join_collapse_limit = 12

14. Диагностика и решение типовых проблем

14.1. Запросы выполняются медленно

  1. Проверьте план выполнения:
    EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
  2. Убедитесь, что используются индексы:
    SELECT * FROM pg_stat_user_indexes WHERE idx_scan = 0;
  3. Проверьте актуальность статистики:
    ANALYZE table_name;
  4. Увеличьте work_mem, если есть много сортировок на диске (Disk: ...kB в EXPLAIN).

14.2. Блокировки и зависшие транзакции

-- Текущие блокировки
SELECT blocked_locks.pid AS blocked_pid,
blocking_locks.pid AS blocking_pid,
blocked_activity.query AS blocked_query,
blocking_activity.query AS blocking_query
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity
ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks
ON blocking_locks.locktype = blocked_locks.locktype
AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity
ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.GRANTED;

Завершение зависшей транзакции:

SELECT pg_terminate_backend(pid);

14.3. Рост размера таблицы без удаления строк

PostgreSQL не освобождает место сразу после DELETE. Используйте:

  • VACUUM — помечает место как свободное.
  • VACUUM FULL — перезаписывает таблицу, освобождая место на диске (блокирует таблицу).
  • pg_repack — внешний инструмент для онлайн-дефрагментации без блокировки.

14.4. WAL-файлы не удаляются

Причина: активный слот репликации или отключённая архивация.

Проверка:

SELECT slot_name, active, restart_lsn FROM pg_replication_slots;

Решение:

  • Удалите неиспользуемый слот: SELECT pg_drop_replication_slot('name');
  • Настройте archive_cleanup_command или pg_archivecleanup.

15. Обновление и миграция

15.1. Обновление in-place (major version)

Используйте pg_upgrade:

# Остановите старый кластер
pg_ctl -D /old/data stop

# Инициализируйте новый кластер
initdb -D /new/data

# Запустите pg_upgrade
pg_upgrade \
--old-bindir=/usr/lib/postgresql/14/bin \
--new-bindir=/usr/lib/postgresql/16/bin \
--old-datadir=/old/data \
--new-datadir=/new/data \
--link # использует hard links для экономии места и времени

После успешного обновления запустите новый кластер и выполните analyze_new_cluster.sh.

15.2. Логическая миграция

Подходит при переходе между разными ОС или архитектурами:

pg_dumpall -h old_host -U user -f full_backup.sql
psql -h new_host -U user -f full_backup.sql

15.3. Минимизация downtime

  1. Настройте логическую репликацию на новую версию.
  2. Переключите приложение на новую базу.
  3. Отключите подписку.