PostgreSQL psql

Файловая структура PostgreSQL

# Каталог данных кластера
/var/lib/pgsql/data # на Linux
 
\Program Files\PostgreSQL\[version]\data # на Windows)

Конфигурация кластера ^conf-cluster-psql

# Основной системный каталог с конфигурацией кластеров, управляемый пакетным менеджером (Debian/Ubuntu)
/etc/postgresql
|	# Версия PostgreSQL (например, 18)
	└── 18
	|		# Имя кластера (по умолчанию — main); позволяет запускать несколько кластеров одной версии
		└── main
			├── conf.d			# Каталог для подключения дополнительных .conf-файлов (автоматически включаются в postgresql.conf)
			├── environment		# Файл с переменными окружения, которые будут загружены при старте кластера (например, LC_COLLATE, locale)
			├── pg_ctl.conf		# Конфигурация для утилиты pg_ctl (редко используется в дистрибутивах на основе systemd)
			|						# Это **простой текстовый файл**, содержащий **аргументы командной строки**, которые будут **автоматически переданы `pg_ctl`** при вызове без явного указания параметров.
			├── pg_hba.conf		# Файл контроля доступа: определяет, кто и как может подключаться к кластеру (host, local, методы аутентификации)									
			├── pg_ident.conf	# Файл отображения имён ОС-пользователей в роли PostgreSQL (используется с методом auth «ident»)
			├── postgresql.conf	# Основной конфигурационный файл СУБД: все параметры сервера (память, WAL, репликация, логирование и т.д.)
			└── start.conf		# Управление автозапуском кластера при загрузке ОС (значения: auto, manual, disabled)

/etc/psql/.../environment ^conf-cluster-environment

  • Содержимое файла — это переменные окружения, которые устанавливаются для процесса postmaster и всех его дочерних процессов (backend’ов, фоновых процессов и т.д.). Эти переменные:
  • Определят локаль кластера при инициализации (если не задана явно в initdb),
  • Влияют на сортировку, сравнение строк, формат даты внутри СУБД,
  • Используются только процессами PostgreSQL, запущенными от имени postgres.
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8

к содержанию


/etc/psql/.../pg_ctl.conf ^conf-cluster-pgctl-conf

  • В Debian/Ubuntu и большинстве современных систем кластер управляется через systemd (например, systemctl start postgresql@18-main).
  • В этом случае pg_ctl.conf полностью игнорируется.
  • Даже при ручном вызове pg_ctl, если вы явно указываете -D или -l, значения из pg_ctl.conf переопределяются.

к содержанию


/etc/psql/.../pg_hba.conf ^conf-cluster-pghba-conf

Файл pg_hba.conf (Host-Based Authentication) — это главный файл контроля доступа в PostgreSQL. Он определяет:

Кто, откуда и как может подключиться к каким базам данных в кластере. только авторизацию на этапе подключения

Он не управляет правами внутри БД (это делают GRANT/REVOKE), а .

# TYPE  DATABASE        USER            ADDRESS                 METHOD
 
# Разрешить локальному пользователю ОС "postgres" подключаться без пароля
local   all             postgres                                peer
# Разрешить всем локальным пользователям подключаться к любой БД своей ролью
local   all             all                                     peer
# Разрешить подключение с localhost по TCP с паролем (SCRAM)
host    all             all             127.0.0.1/32            scram-sha-256
# Разрешить подключение с внутренней сети с паролем
host    all             all             192.168.1.0/24          scram-sha-256
# Запретить всё остальное
host    all             all             0.0.0.0/0               reject
КолонкаОписание
TYPEТип подключения: local (Unix-сокет), host (TCP/IP), hostssl, hostnossl
DATABASEИмя БД или all, sameuser, samerole, replication
USERИмя роли (пользователя) или all, +группа
ADDRESSIP-адрес/сеть (для host) или пропускается для local
METHODМетод аутентификации: trust, md5, scram-sha-256, ident, peer, cert, ldap, и др.

Основные методы аутентификации (METHOD)

МетодПоведение
trustБез пароля! Любой, кто соответствует правилу, получает доступ. Опасен в production!
scram-sha-256Современный, безопасный метод (рекомендуется по умолчанию в PG ≥10)
md5Устаревший хэш-метод (всё ещё широко используется, но менее безопасен)
peerДля local: берёт имя пользователя ОС и сопоставляет с ролью в PostgreSQL
identДля host: запрашивает имя ОС-пользователя через ident-сервер (редко используется)
certИспользует клиентский SSL-сертификат для аутентификации
rejectЯвно запрещает подключение (полезно для чёрных списков)
Перезагрузка конфигурации ^reboot-conf-psql

Изменения в pg_hba.conf не требуют перезапуска, но требуют перезагрузки конфигурации:

SELECT pg_reload_conf();

или

systemctl reload postgresql@18-main

/etc/psql/.../pg_ident.conf ^conf-cluster-pgident-conf

Файл pg_ident.conf — это файл отображения имён пользователей ОС в роли PostgreSQL, используемый только при аутентификации методом ident (для TCP-подключений) или peer (для локальных Unix-сокетов, хотя для peer он обычно не нужен).

Он не используется при парольной аутентификации (md5, scram-sha-256 и т.д.).

В некоторых сценариях вы хотите, чтобы:

Пользователь ОС alice при подключении к PostgreSQL автоматически получал роль app_user,
даже если имя роли в БД отличается от имени в системе.

Именно для таких преобразований имён и служит pg_ident.conf.

# MAPNAME       SYSTEM-USERNAME         PG-ROLENAME
 
myusers         alice                   app_reader
myusers         bob                     app_writer
admins          root                    postgres
supermap        all                     guest
КолонкаОписание
MAPNAMEИмя правила (произвольное, например mymap)
SYSTEM-USERNAMEИмя пользователя ОС (или all)
PG-ROLENAMEИмя роли в PostgreSQL (или all)
Метод в pg_hba.confИспользует pg_ident.conf?Примечание
peer✅ Да (если указан map=...)Только для local
ident✅ Да (если указан map=...)Для host (TCP)
trust, scram-sha-256, md5❌ НетИмя роли берётся напрямую из запроса подключения

Если в pg_hba.conf указано просто peer (без map=...), то имя ОС напрямую сопоставляется с ролью в PostgreSQLpg_ident.conf не используется.

Как это работает вместе с pg_hba.conf

В pg_hba.conf вы указываете имя карты (MAPNAME) в колонке METHOD:

# TYPE  DATABASE  USER  ADDRESS      METHOD
local   all       all                peer map=myusers
host    all       all   192.168.1.0/24 ident map=admins
# Синтаксис: `peer map=имя_карты` или `ident map=имя_карты`

Пример потока аутентификации:

  1. Пользователь ОС alice запускает psql локально.
  2. Подключение идёт через Unix-сокет → срабатывает правило local ... peer map=myusers.
  3. PostgreSQL получает от ОС имя alice.
  4. Смотрит в pg_ident.conf по карте myusers → находит: alice → app_reader.
  5. Подключает пользователя как роль app_reader (без пароля).

Перезагрузка конфигурации: ^reboot-conf-psql к содержанию


/etc/psql/.../postgresql.conf ^psql-conf-file-postgresql-conf

Основной конфигурационный файл PostgreSQL

Это ядро конфигурации кластера, и почти всё, что управляет поведением СУБД, задаётся именно здесь (или через SQL-команду ALTER SYSTEM, которая вносит изменения в postgresql.auto.conf).

Этот файл читается при старте кластера и может быть частично перезагружен без перезапуска.

Поддерживаемые типы значений:

  • Числа: max_connections = 100
  • Строки (в кавычках, если есть пробелы): cluster_name = 'prod-db'
  • Булевы: fsync = on
  • Интервалы времени: wal_keep_size = 1GB или checkpoint_timeout = 15min
  • Списки: listen_addresses = 'localhost,192.168.1.10'

Более подробно здесь к содержанию


/etc/psql/.../conf.d ^psql-conf-confd-files

Директория дополнительных conf файлов postgres. Приоритет:

postgresql.conf   # Запускается первым
	conf.d/*.conf     # (если подключены через include_dir)
		postgresql.auto.conf   # наивысший приоритет

к содержанию


/etc/psql/.../start.conf ^conf-cluster-start-conf

Файл start.conf — это специфичный для дистрибутивов на основе Debian/Ubuntu файл, который управляет автозапуском кластера PostgreSQL при загрузке системы. Он не является частью ядра PostgreSQL и игнорируется при ручном запуске через pg_ctl или в других ОС (RHEL, CentOS, Alpine и т.д.).

Файл содержит ровно одно слово — режим автозапуска:

auto

Допустимые значения:

ЗначениеПоведение
autoКластер автоматически запускается при загрузке ОС (по умолчанию)
manualКластер не запускается автоматически, но может быть запущен вручную через pg_ctlcluster или systemctl
disabledКластер заблокирован от запуска (даже вручную через стандартные средства)
  • При установке пакета postgresql-18 система создаёт unit-файл systemd вида postgresql@18-main.service.
  • Скрипты управления (pg_ctlcluster, systemctl start postgresql@18-main) читают start.conf перед запуском.
  • Если значение disabled, запуск отклоняется с ошибкой.

Это удобный способ отключить кластер без удаления данных (например, для обслуживания или экономии ресурсов).

  • Не влияет на уже запущенный кластер — только на поведение при старте системы или ручном запуске через pg_ctlcluster.
  • Игнорируется, если вы запускаете PostgreSQL напрямую через pg_ctl с указанием -D.
  • Не существует в RHEL/CentOS/Fedora — там управление автозапуском делается через systemctl enable/disable.

к содержанию


Каталог данных кластера ^pgdata-cluster-cotalog-psql

# Основной каталог данных кластера (PGDATA), где хранятся все пользовательские и системные данные
/var/lib/postgresql
|	# Версия PostgreSQL
	└── 18
		|	# Имя кластера
			└── main
				├── base			# Каталоги с данными пользовательских баз данных (по одному подкаталогу на OID базы)
				│   ├── 1			# Служебная БД template1 (OID=1)
				│   │   ├── 112		# Файл таблицы или индекса (RELFILENODE = 112)
				│   │   ├── 1247_fsm	    # Free Space Map — карта свободного места для страниц файла 1247
				│   │   ├── 1247_vm	        # Visibility Map — битовая карта видимости для страниц файла 1247
				│   │   ├── pg_filenode.map	# Отображение RELFILENODE ↔ OID для нестандартных имён файлов
				│   │   ├── pg_internal.init	# Кэш системных каталогов для ускорения запуска
				│   │   └── PG_VERSION	    # Версия формата данных (совпадает с версией PostgreSQL)
				│   ├── 4			# Служебная БД postgres (OID=4, может отличаться)
				│   └── 5			# Пользовательская БД (например, ваша БД с OID=5)
				├── global		# Глобальные системные таблицы, общие для всего кластера
				│   ├── 2396		# Файл глобальной системной таблицы (например, pg_database)
				│   ├── 2396_fsm	# FSM для глобальной таблицы
				│   ├── 2396_vm		# VM для глобальной таблицы
				│   ├── pg_control	# Ключевой файл: метаданные кластера, LSN последнего checkpoint’а, состояние
				│   ├── pg_filenode.map	    # Отображение для глобальных отношений
				│   └── pg_internal.init	# Кэш глобальных каталогов
				├── pg_commit_ts	# Хранилище временных меток коммитов (если включено track_commit_timestamp)
				├── pg_dynshmem		# Файлы разделяемой памяти для динамических библиотек (например, расширений)
				├── pg_logical		# Данные для логической декодировки и логической репликации
				│   ├── mappings	# Отображения между XID и LSN для логической репликации
				│   ├── replorigin_checkpoint	# Точка восстановления для origin’ов репликации
				│   └── snapshots	# Сохранённые снимки (snapshots) для логической репликации
				├── pg_multixact	# Информация о мультитранзакциях (для совместных блокировок SHARE/KEY SHARE)
				│   ├── members		# Списки участников мультитранзакций
				│   └── offsets		# Смещения мультитранзакций
				├── pg_notify		# Очереди LISTEN/NOTIFY
				├── pg_replslot		# Слоты репликации (физические и логические) — предотвращают удаление нужного WAL
				├── pg_serial		# Данные для сериализуемой изоляции (отслеживание конфликтов)
				├── pg_snapshots	# Сохранённые снимки (через pg_export_snapshot)
				├── pg_stat			# Постоянные файлы статистики (начиная с PG 14 — вместо pg_stat_tmp)
				├── pg_stat_tmp		# Временные файлы статистики (в PG ≤13)
				├── pg_subtrans		# Информация о вложенных (sub) транзакциях
				├── pg_tblspc		# Символические ссылки на табличные пространства (если они созданы)
				├── pg_twophase		# Состояния двухфазных транзакций (PREPARE TRANSACTION)
				├── PG_VERSION		# Версия формата данных кластера (дублирует base/*/PG_VERSION)
				├── pg_wal			# Write-Ahead Log — журнал транзакций (по 16 МБ на файл)
				│   ├── 000000010000000000000001	# WAL-файл
				│   ├── archive_status	            # Флаги архивации (.ready, .done)
				│   └── summaries	# Сводные данные WAL для быстрого поиска (начиная с PG 17)
				├── pg_xact			# Commit Log (CLOG) — статусы транзакций (Committed/Aborted)
				│   └── 0000		# Сегмент CLOG
				├── postgresql.auto.conf	# Файл для ALTER SYSTEM — автоматически управляемый конфиг
				├── postmaster.opts	# Аргументы командной строки, с которыми был запущен postmaster
				└── postmaster.pid	# PID главного процесса и информация о сокете (существует только при запущенном кластере)

/var/lib/psql/…/postgresql.auto.conf

# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.

к содержанию


Другие каталоги ^other-cotalog-psql

Содержит PIF процесса postmaster

cat /var/run/postgresql/18-main.pid
	5455

как и

cat /var/lib/postgresql/18/main/postmaster.pid
	5455
	/var/lib/postgresql/18/main
	1766638926
	5432
	/var/run/postgresql
	localhost
	   132040         4
	ready

к содержанию