Раздел 5 — PostgreSQL: установка и первоначальная настройка

Как устроен сервер баз данных и как привести его в рабочее состояние

Прогресс курса Раздел 5 из 13

Что вы освоите в этом разделе

6 академических часов: 2 часа теории, 4 часа практики. С этого раздела и до конца курса нужен локально установленный PostgreSQL 18 и pgAdmin, а также доступ к командной строке той машины, где он стоит. Онлайн-тренажёры здесь не подойдут — вы будете править файлы конфигурации и перезапускать службу.
01

Процессная архитектура PostgreSQL

PostgreSQL построен на процессах, а не на потоках. На каждое клиентское соединение операционная система создаёт отдельный процесс. Это решение объясняет и надёжность сервера, и стоимость соединения.

                        ┌─────────────────────┐
   клиент 1  ──────────▶│  backend процесс 1  │──┐
   клиент 2  ──────────▶│  backend процесс 2  │──┤
   клиент N  ──────────▶│  backend процесс N  │──┤
                        └─────────────────────┘  │
                                                 ▼
     postmaster                          ┌───────────────┐
   (главный процесс,                     │ Shared Buffers│
    принимает                            │  общая память │
    соединения)                          └───────┬───────┘
                                                 │
   фоновые процессы:                             ▼
     background writer   ──────────────▶  ┌─────────────┐
     WAL writer          ──────────────▶  │  файлы на   │
     checkpointer        ──────────────▶  │    диске    │
     autovacuum launcher ──────────────▶  └─────────────┘
     stats collector

Кто чем занят

  • postmaster — главный процесс. Слушает порт, принимает соединения, порождает backend-процессы, следит за фоновыми. Именно его запускает systemd.
  • backend — обслуживает одно клиентское соединение от начала до конца. Разбирает запрос, планирует, выполняет, отдаёт результат.
  • background writer — постепенно сбрасывает изменённые страницы из общей памяти на диск, чтобы не копить их к моменту контрольной точки.
  • WAL writer — пишет журнал предзаписи. Именно он обеспечивает букву D в ACID.
  • checkpointer — выполняет контрольные точки: гарантирует, что все изменения до определённого момента записаны на диск.
  • autovacuum launcher — запускает процессы очистки, убирающие «мёртвые» версии строк.
Почему это важно на практике. Процесс дороже потока: каждое соединение занимает несколько мегабайт памяти даже в простое. Отсюда два следствия — max_connections нельзя ставить произвольно большим, и приложению нужен пул соединений. Открывать соединение на каждый HTTP-запрос — верный способ положить сервер.

Shared Buffers — общая область памяти, через которую все процессы работают с данными. Запрос никогда не читает файл напрямую: страница сначала попадает в общий буфер, а изменения сначала пишутся в журнал (WAL), и только потом — в файлы данных. Отсюда правило: если сервер выключился внезапно, при старте PostgreSQL воспроизведёт журнал и восстановит согласованное состояние.

02

Кластер, каталог данных, база, схема

Четыре понятия, которые постоянно путают. В терминологии PostgreSQL они означают строго определённые вещи.

Иерархия

  • Экземпляр (instance) — запущенный набор процессов PostgreSQL, обслуживающий один кластер.
  • Кластер баз данных (cluster) — набор баз, управляемых одним экземпляром и лежащих в одном каталоге данных. К кластеризации в смысле отказоустойчивости отношения не имеет — термин исторический и сбивает с толку.
  • Каталог данных (PGDATA) — каталог на диске, где кластер физически живёт. Создаётся программой initdb.
  • База данных (database) — изолированный набор схем внутри кластера. Из одного соединения работать с двумя базами нельзя.
  • Схема (schema) — пространство имён внутри базы. Таблицы лежат в схемах; по умолчанию — в схеме public.
Сервер (машина)
└── Экземпляр PostgreSQL (порт 5432)
    └── Кластер = /var/lib/postgresql/17/main
        ├── База postgres      (служебная)
        ├── База template0     (эталон, не трогать)
        ├── База template1     (шаблон для новых баз)
        └── База nevabit
            ├── Схема public
            │   ├── Таблица users
            │   └── Таблица posts
            └── Схема reports
                └── Представление monthly_activity

На одной машине можно запустить несколько экземпляров — разных версий или с разными настройками. Каждый займёт свой порт и свой каталог данных. В Debian это штатный сценарий, поддержанный инструментами.

Каталог данных нельзя копировать обычным cp у работающего сервера и нельзя открывать сторонними программами. Файлы внутри — не самостоятельные документы, а часть согласованного состояния, зависящего от журнала. Для копирования есть pg_dump и pg_basebackup; о них в разделе 6.
03

Установка на Debian 13 и Windows

Курс рассчитан на PostgreSQL 18 — эта версия стоит на учебных ПК с Windows. Debian 13 (Trixie) содержит в основном репозитории PostgreSQL 17, и примеры для Debian ниже — на ней. Команды курса в 17 и 18 одинаковы, отличается местами только вид вывода: например, \conninfo в 18 печатает таблицу, а не одну строку. Установка штатной версии сводится к одной команде.

# Обновить список пакетов и установить сервер с клиентом
sudo apt update
sudo apt install postgresql postgresql-client

# Проверить, что установилось
psql --version
# psql (PostgreSQL) 17.x

PostgreSQL 18 на Debian ставят из официального репозитория проекта — PGDG. Тогда во всех путях и командах этого раздела вместо 17 будет 18: /etc/postgresql/18/main/, pg_ctlcluster 18 main.

# Репозиторий PostgreSQL Global Development Group
sudo apt install curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \
     --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc

echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] \
https://apt.postgresql.org/pub/repos/apt trixie-pgdg main" \
  | sudo tee /etc/apt/sources.list.d/pgdg.list

sudo apt update
sudo apt install postgresql-18
Пакет из основного репозитория Debian получает обновления безопасности вместе с системой и совместим с unattended-upgrades. PGDG нужен только тогда, когда требуется версия, которой в дистрибутиве ещё нет. Для учебных и большинства рабочих задач достаточно штатного пакета.

Что установка сделала с системой:

Результат установки

  • Создан системный пользователь postgres — от его имени работают все процессы сервера.
  • Выполнен initdb и создан кластер с именем main.
  • Кластер запущен и добавлен в автозагрузку через systemd.
  • Создана база postgres и роль суперпользователя postgres.
  • Сервер слушает localhost:5432 — снаружи недоступен.

Debian раскладывает файлы иначе, чем это делает initdb по умолчанию: конфигурация отделена от данных.

ПутьЧто там
/etc/postgresql/17/main/postgresql.conf, pg_hba.conf, pg_ident.conf
/var/lib/postgresql/17/main/каталог данных: файлы таблиц, WAL, служебные каталоги
/var/log/postgresql/журналы сервера
/usr/lib/postgresql/17/bin/исполняемые файлы: postgres, initdb, pg_dump
/var/run/postgresql/сокет и pid-файл
В сборках от PGDG и в официальном Docker-образе раскладка другая: конфигурация лежит внутри каталога данных, как задумано разработчиками PostgreSQL. Поэтому инструкции из интернета часто не совпадают с тем, что вы видите на Debian. Проверять расположение нужно запросом SHOW config_file;, а не поиском по диску.

Windows. На Windows PostgreSQL ставят установщиком EDB — файл вида postgresql-18.6-5-windows-x64.exe со страницы загрузки postgresql.org (Download → Windows). Установщик задаёт несколько вопросов.

Что выбрать в установщике

  • Компоненты. PostgreSQL Server и Command Line Tools нужны обязательно. pgAdmin 4 — если он не ставится отдельным установщиком. Stack Builder для курса не нужен.
  • Пароль суперпользователя postgres. Запишите: без него не создать ни роль, ни базу.
  • Порт — 5432, если на компьютере нет другого сервера PostgreSQL.
  • Локаль — по умолчанию. Кластер создаётся в кодировке UTF8 с локалью системы: на русской Windows это Russian_Russia.1251, и CREATE DATABASE … ENCODING 'UTF8' проходит без ошибок.

После установки сервер работает как служба Windows postgresql-x64-18 (число — версия) и запускается вместе с компьютером. Всё лежит в C:\Program Files\PostgreSQL\18\, а конфигурация — внутри каталога данных, как задумано разработчиками.

КаталогЧто там
bin\программы: psql.exe, pg_dump.exe, pg_restore.exe
data\каталог данных, в нём же postgresql.conf и pg_hba.conf

В отличие от Debian, сервер на Windows по умолчанию слушает все сетевые адреса (listen_addresses = '*') и пускает только по паролю (scram-sha-256), SSL выключен. Службой управляют в оснастке «Службы» (Win+R → services.msc) или из PowerShell, запущенного от имени администратора:

# Состояние службы
Get-Service postgresql*

# Перезапуск — для параметров с контекстом postmaster
Restart-Service postgresql-x64-18

# Перечитать конфигурацию без перезапуска — из psql или Query Tool
SELECT pg_reload_conf();

Утилиты в командной строке. Установщик не добавляет каталог bin в переменную PATH, поэтому команда pg_dump в PowerShell отвечает, что такой программы нет. Её запускают по полному пути или добавляют каталог в PATH на время сеанса:

# PowerShell: полный путь, перед ним — знак &
& "C:\Program Files\PostgreSQL\18\bin\pg_dump.exe" -U nevabit_app -d nevabit -f nevabit.sql

# Или один раз добавить каталог в PATH до закрытия окна
$env:Path += ";C:\Program Files\PostgreSQL\18\bin"
pg_dump -U nevabit_app -d nevabit -f nevabit.sql

# Размер получившегося файла в байтах
(Get-Item nevabit.sql).Length

SQL Shell (psql)

  • Запускается из меню «Пуск» → PostgreSQL 18 → SQL Shell (psql).
  • По очереди спрашивает сервер, базу, порт и пользователя; в квадратных скобках — значение по умолчанию, Enter его принимает. Затем пароль — символы при вводе не показываются.
  • Консоль Windows работает в кодовой странице 866, а сам Windows — в 1251. psql предупреждает об этом, и русские буквы в выводе могут превратиться в непонятные символы. SQL с русскими данными удобнее выполнять в Query Tool pgAdmin, а psql — для метакоманд.
  • Истории команд в psql для Windows нет: \s отвечает, что в этой сборке история не поддерживается. Остальные метакоманды из пункта 07 работают так же, как в Linux.

pgAdmin — графический клиент: в нём удобнее выполнять SQL с русскими данными и смотреть, что получилось. Окно, меню и работа в Query Tool — в пункте 10.

04

Управление кластером

В Debian есть свой слой управления кластерами — пакет postgresql-common. Он позволяет держать несколько версий и несколько кластеров одновременно.

# Список всех кластеров на машине
pg_lsclusters
# Ver Cluster Port Status Owner    Data directory              Log file
# 17  main    5432 online postgres /var/lib/postgresql/17/main /var/log/...

# Управление конкретным кластером: версия, имя, действие
sudo pg_ctlcluster 17 main start
sudo pg_ctlcluster 17 main stop
sudo pg_ctlcluster 17 main restart
sudo pg_ctlcluster 17 main reload    # перечитать конфигурацию без разрыва соединений

# Создать второй кластер на другом порту
sudo pg_createcluster 17 test --port=5433 --start

Параллельно работает обычное управление через systemd:

sudo systemctl status postgresql@17-main
sudo systemctl restart postgresql@17-main
sudo systemctl enable postgresql@17-main    # автозапуск

# postgresql.service — это обёртка, управляющая всеми кластерами сразу
sudo systemctl restart postgresql
Разница между restart и reload существенна. reload заставляет сервер перечитать конфигурацию, не разрывая соединений и не прерывая работу приложения. restart обрывает все соединения. На рабочем сервере всегда сначала пробуйте reload — большинство параметров этого достаточно.

Если сервер не поднимается — смотреть нужно журнал, а не гадать:

sudo tail -n 50 /var/log/postgresql/postgresql-17-main.log
sudo journalctl -u postgresql@17-main -n 50 --no-pager
05

postgresql.conf: параметры сервера

Основной файл конфигурации. Формат простой: параметр = значение, комментарии после #.

Параметры, которые настраивают в первую очередь

  • listen_addresses — на каких адресах слушать. 'localhost' по умолчанию, '*' — на всех интерфейсах.
  • port — порт, по умолчанию 5432.
  • max_connections — предел одновременных соединений. Каждое стоит памяти.
  • shared_buffers — размер общего буферного кэша. Ориентир — 25% ОЗУ.
  • effective_cache_size — подсказка планировщику, сколько памяти суммарно доступно под кэш (включая кэш ОС). Память не выделяет, влияет только на выбор плана. Ориентир — 50–75% ОЗУ.
  • work_mem — память на одну операцию сортировки или хеширования. Выделяется на операцию, а не на соединение: сложный запрос может занять несколько порций.
  • maintenance_work_mem — память под VACUUM, CREATE INDEX, ALTER TABLE.
  • wal_level — объём информации в журнале: replica по умолчанию, logical для логической репликации.
  • log_min_duration_statement — писать в журнал запросы дольше указанного времени в миллисекундах. Главный инструмент поиска медленных запросов.
  • password_encryption — scram-sha-256 начиная с PostgreSQL 14.

Контексты применения

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

КонтекстЧто требуетсяПримеры
postmasterперезапуск сервераshared_buffers, max_connections, listen_addresses, port
sighupreloadlog_min_duration_statement, autovacuum
superuserизменение в сессии суперпользователемlog_statement
userизменение в своей сессии любым пользователемwork_mem, search_path
internalзадаётся при сборке или initdb, изменить нельзяblock_size, lc_collate
-- Узнать текущее значение и контекст параметра
SHOW shared_buffers;

SELECT name, setting, unit, context, source
FROM   pg_settings
WHERE  name IN ('shared_buffers', 'work_mem', 'max_connections');

-- Какие параметры изменены относительно умолчаний
SELECT name, setting, source
FROM   pg_settings
WHERE  source NOT IN ('default', 'override');

-- Где лежат файлы конфигурации
SHOW config_file;
SHOW hba_file;
SHOW data_directory;

Три способа задать параметр

Способы и приоритет

  • Правка postgresql.conf — базовый способ, файл под контролем администратора и системы конфигурации.
  • Файлы в conf.d/ — если в основном файле есть include_dir 'conf.d'. Удобно: свои настройки лежат отдельно от дистрибутивных и переживают обновление пакета.
  • ALTER SYSTEM — команда SQL, пишет в postgresql.auto.conf. Этот файл читается последним и перекрывает всё остальное.
-- Изменить параметр из SQL
ALTER SYSTEM SET log_min_duration_statement = '500ms';
SELECT pg_reload_conf();

-- Отменить своё изменение и вернуться к значению из postgresql.conf
ALTER SYSTEM RESET log_min_duration_statement;
SELECT pg_reload_conf();
Классическая потеря времени: администратор правит postgresql.conf, перезапускает сервер, а значение не меняется — потому что тот же параметр когда-то задали через ALTER SYSTEM, и он лежит в postgresql.auto.conf. Столбец source в pg_settings сразу показывает, откуда взято действующее значение. Проверяйте его первым делом.
06

pg_hba.conf: кто и как подключается

HBA расшифровывается как Host-Based Authentication. Этот файл решает, кому разрешено подключаться и каким способом он должен доказать, что он — это он.

Формат строки — пять или шесть полей:

# ТИП    БАЗА     ПОЛЬЗОВАТЕЛЬ  АДРЕС            МЕТОД

local    all      postgres                       peer
local    all      all                            peer
host     all      all           127.0.0.1/32     scram-sha-256
host     all      all           ::1/128          scram-sha-256
host     nevabit  nevabit_app   10.0.0.0/24      scram-sha-256
hostssl  nevabit  nevabit_app   0.0.0.0/0        scram-sha-256
host     all      all           0.0.0.0/0        reject

Поля

  • ТИП: local — через Unix-сокет; host — по TCP с шифрованием или без; hostssl — только с TLS; hostnossl — только без TLS.
  • БАЗА: имя базы, список через запятую или all.
  • ПОЛЬЗОВАТЕЛЬ: имя роли, +имя_группы или all.
  • АДРЕС: адрес или подсеть в формате CIDR. Для local не указывается.
  • МЕТОД: способ проверки подлинности.
МетодКак проверяетКогда применять
scram-sha-256пароль по протоколу SCRAMосновной метод для сетевых подключений
peerимя системного пользователя ОСлокальные подключения через сокет
identвнешняя служба identпрактически не используется
md5устаревшее хеширование паролятолько для старых клиентов
certклиентский TLS-сертификатсервис-сервис без паролей
trustпускает без проверкиникогда вне изолированного стенда
rejectотказывает всегдаявный запрет в конце файла
Правила читаются сверху вниз, побеждает первое подходящее. Если оно отказало — подключение отклоняется, до следующих строк дело не доходит. Отсюда две ошибки: разрешающее правило поставили ниже запрещающего, или широкое правило all all перекрыло узкое. Порядок строк здесь — часть логики, а не оформление.

Метод peer объясняет, почему сразу после установки работает такая команда:

# Переключиться на системного пользователя postgres и войти в psql
sudo -u postgres psql

Пароль не спрашивается: PostgreSQL спрашивает у ядра, от чьего имени пришло соединение через сокет, видит системного пользователя postgres и пускает его в роль с тем же именем.

После правки pg_hba.conf достаточно reload — перезапуск не нужен. Проверить, какое правило сработало для действующих соединений, можно запросом к pg_hba_file_rules: он же покажет строки с синтаксическими ошибками до того, как вы их примените.
-- Проверить файл на ошибки, не перезагружая конфигурацию
SELECT line_number, type, database, user_name, address, auth_method, error
FROM   pg_hba_file_rules
WHERE  error IS NOT NULL;
07

Первое подключение и psql

psql — штатный клиент командной строки. Он не только выполняет SQL, но и умеет исследовать структуру базы метакомандами, начинающимися с обратной косой черты.

# Подключение: пользователь, база, хост, порт
psql -U nevabit_app -d nevabit -h localhost -p 5432

# Строка подключения одним аргументом
psql "postgresql://nevabit_app@localhost:5432/nevabit"

# Выполнить один запрос и выйти
psql -U postgres -c "SELECT version();"

# Выполнить файл
psql -U nevabit_app -d nevabit -f socialnet_db.sql

Метакоманды, которые нужны сразу

  • \l — список баз данных
  • \c имя_базы — переключиться на другую базу
  • \dt — таблицы текущей схемы
  • \d имя_таблицы — структура таблицы: столбцы, типы, индексы, ограничения
  • \d+ имя_таблицы — то же плюс размер и описания
  • \du — список ролей и их атрибутов
  • \dn — список схем
  • \di — индексы
  • \x — расширенный вывод: строки печатаются по вертикали, спасает на широких таблицах
  • \timing — показывать время выполнения каждого запроса
  • \e — открыть текущий запрос в редакторе
  • \i файл.sql — выполнить файл
  • \conninfo — параметры текущего соединения
  • \? — справка по метакомандам, \h SELECT — справка по синтаксису команды
  • \q — выход

Создание рабочей базы и пользователя приложения — минимальный сценарий после установки:

-- От имени postgres
CREATE ROLE nevabit_app LOGIN PASSWORD 'смените_этот_пароль';
CREATE DATABASE nevabit OWNER nevabit_app ENCODING 'UTF8';

-- Проверка
\l
\du
Кодировка и правила сортировки задаются при создании базы и не меняются потом — только пересозданием с переносом данных. Для русского языка правильный выбор — ENCODING 'UTF8' и локаль ru_RU.UTF-8. Если создать базу с локалью C, сортировка русского текста пойдёт по кодам символов: «Ёж» окажется после «Яблока».
08

Настройка под сервер с малыми ресурсами

Значения по умолчанию у PostgreSQL намеренно скромные — они рассчитаны на то, чтобы сервер запустился где угодно. На типичном VPS их нужно поднимать; на очень маленьком — следить, чтобы сервер не съел всю память.

Пример расчёта для машины 1 CPU / 1 ГБ ОЗУ — распространённая конфигурация недорогого VPS:

ПараметрПо умолчаниюДля 1 ГБОбоснование
shared_buffers128MB256MB25% ОЗУ
effective_cache_size4GB512MBподсказка планировщику, память не занимает
work_mem4MB4MBумножается на число операций — повышать опасно
maintenance_work_mem64MB64MBразово при VACUUM и построении индексов
max_connections10040остальное закрывается пулом соединений
max_worker_processes82одно ядро
max_parallel_workers_per_gather20параллелизм на одном ядре только вредит
Самая частая ошибка на маленьком сервере — задрать work_mem. Параметр выделяется на каждую операцию сортировки или хеширования в каждом запросе. При work_mem = 64MB, сорока соединениях и трёх сортировках на запрос теоретический предел — почти 8 ГБ. Сервер уйдёт в swap или будет убит OOM-killer'ом.

Настройки уровня операционной системы, без которых маленький сервер живёт хуже:

# Swap обязателен даже при быстром диске — как страховка от OOM
# Но обращаться к нему система должна неохотно
sudo sysctl -w vm.swappiness=10
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf

# Посмотреть, сколько памяти реально занято
free -h
ps -o pid,rss,cmd -C postgres
Пул соединений на маленьком сервере важнее любой настройки памяти. PgBouncer в режиме transaction позволяет сотне клиентов приложения работать через десяток реальных соединений к базе. Это дешевле, чем увеличивать max_connections, и почти всегда быстрее.
09

Безопасность первичной настройки

Свежеустановленный PostgreSQL закрыт разумно, но первые же шаги по «настройке доступа» обычно эту защиту снимают.

Что проверить сразу

  • Не открывайте listen_addresses = '*' без необходимости. Если приложение на той же машине — оставьте localhost. Порт 5432, открытый в интернет, сканируется в первые же часы.
  • Никакого trust для сетевых подключений. Метод trust пускает вообще без проверки. Единственное его законное применение — восстановление доступа, когда забыт пароль суперпользователя, и то временно.
  • Приложение работает не суперпользователем. Роль nevabit_app с правами только на свою базу; о разграничении прав — раздел 6.
  • Пароли — только scram-sha-256. Проверьте password_encryption и убедитесь, что в pg_hba.conf нет md5.
  • Файрвол. ufw с разрешёнными 22, 80 и 443; порт базы наружу не выставляется.
  • TLS для внешних подключений. Если база всё же доступна по сети — hostssl вместо host, чтобы незашифрованное соединение просто не устанавливалось.
  • Пароль суперпользователя postgres. После установки его нет: роль доступна только через peer. Задавать пароль стоит лишь тогда, когда он действительно нужен.
# Проверить, что снаружи порт закрыт
sudo ss -tlnp | grep 5432
# LISTEN 127.0.0.1:5432 — хорошо
# LISTEN 0.0.0.0:5432   — открыт на всех интерфейсах, проверьте файрвол

sudo ufw status
Совет «поставьте host all all 0.0.0.0/0 trust, чтобы заработало» встречается в интернете постоянно и означает: любой, кто дотянулся до порта, получает права суперпользователя базы. Если подключение не работает — читайте журнал сервера: там написана точная причина отказа, а при неверном пароле — ещё и сработавшая строка pg_hba.conf с номером (DETAIL: Connection matched file … line 128).
10

pgAdmin

pgAdmin — графический клиент PostgreSQL. Данных он не хранит: подключается к серверу так же, как psql или приложение, и каждое его окно с запросами — отдельное соединение, то есть отдельный backend-процесс из пункта 01. Всё, что делается мышью, pgAdmin превращает в обычный SQL или в запуск pg_dump / pg_restore. Снимки ниже — pgAdmin 9.18 на учебном ПК с Windows 11; интерфейс английский. На телефоне снимок открывается в полном размере нажатием.

Окно

  • Сервер уже в списке. pgAdmin сам находит PostgreSQL, установленный на этом ПК, и добавляет сервер «PostgreSQL 18» — даже если pgAdmin ставили отдельно. При первом раскрытии pgAdmin спрашивает пароль пользователя postgres.
  • Дерево объектов (Object Explorer) слева. Servers → сервер → Databases → база → Schemas → public → Tables → таблица → Columns, Constraints. На уровне сервера — ещё Login/Group Roles и Tablespaces. Дерево не обновляется само: после CREATE в Query Tool новый объект появится только после Refresh (в дереве — клавиша F5).
  • Кнопки над деревом — для выделенного объекта: Query Tool, просмотр данных таблицы, поиск объектов, PSQL Tool. Узкая полоса значков у левого края переключает рабочие области: дерево, все открытые Query Tool, все PSQL Tool, Schema Diff; шестерёнка внизу — настройки.
  • Правая часть сначала пустая. Сведения о выделенном объекте открываются кнопкой «⋮» в правом верхнем углу → Open: Dashboard — активность сервера и сеансы; Properties — свойства; SQL — команда, которой объект можно создать заново, по ней видно, какие ограничения и с какими именами получились; Statistics; Dependencies / Dependents — от чего объект зависит и что зависит от него; Processes — фоновые задачи (копия, восстановление) и их журнал.
  • Контекстное меню — правая кнопка по объекту в дереве. В нём то, что подходит к этому объекту: у Databases — Create → Database…, у Login/Group Roles — Create → Login/Group Role…, у любого узла — Refresh. Основной способ работы.
Первое подключение: пароль postgres
Окно Connect to Server: Please enter the password for the user postgres to connect the server PostgreSQL 18, поле пароля, флажок Save Password не отмечен, кнопки Cancel и OK
При подключении pgAdmin предлагает сохранить пароль (Save Password). На общем компьютере в классе не сохраняйте: следующий, кто сядет за этот ПК, откроет вашу базу без пароля, а пароль postgres даёт права на весь сервер.
Дерево объектов и меню «⋮» → Open
Окно pgAdmin: слева дерево Servers, PostgreSQL 18, Databases, postgres с вложенными Casts, Catalogs, Schemas и другими узлами, ниже Login/Group Roles и Tablespaces; справа открыто меню Open со списком Dashboard, Properties, SQL, Statistics, Dependencies, Dependents, Processes
МенюГлавное
FilePreferences — настройки: клавиши, пути к утилитам (Paths → Binary paths)
Objectдействия с выделенным в дереве объектом — то же, что его контекстное меню: Create, Refresh, Delete, Properties, подключение к серверу
ToolsQuery Tool (Alt+Shift+Q) — окно для SQL; PSQL Tool — psql внутри pgAdmin; Backup… и Restore… — pg_dump и pg_restore в виде диалога; Import/Export Data — \copy; Maintenance — VACUUM, ANALYZE, REINDEX; Search Objects — поиск по имени; ERD Tool — схема таблиц; Schema Diff — сравнение двух баз; Grant Wizard — выдача прав
Edit, View, Windowправка текста, вид и расположение панелей; для работы по курсу не нужны
Helpдокументация pgAdmin и PostgreSQL
Меню Tools
Раскрытое меню Tools: ERD Tool, Grant Wizard, PSQL Tool, Query Tool с клавишами Alt+Shift+Q, Schema Diff, Server, Restore, Backup Globals, Backup Server, Backup, Export Data Using Query, Import/Export Data, Import/Export Servers, Maintenance, Search Objects, AI Reports

Query Tool

  • Открывается так: выделите в дереве базу → Tools → Query Tool. Окно подключается к выделенной базе под тем пользователем, с которым зарегистрирован сервер. Подключение написано на вкладке и в строке под ней, например postgres/postgres@PostgreSQL 18 — база, пользователь, сервер. Щелчок по этой строке → < New Connection... > позволяет выбрать другую базу и другого пользователя (пункт 2 ниже).
  • Кнопка ▶ или F5 выполняет весь текст, а если что-то выделено — только выделенное. F7 — план запроса (EXPLAIN, раздел 11).
  • Результат последнего SELECT — на вкладке Data Output, под именем столбца — его тип. Сообщения сервера и ошибки — на вкладке Messages. Внизу — число строк и время выполнения. Значение из сетки копируется Ctrl+C.
  • Автофиксация включена: каждая команда сразу фиксируется. Но весь текст, выполненный одним нажатием F5, уходит на сервер одним пакетом и выполняется как одна транзакция. Если в нём упала последняя команда, отменяются и все предыдущие.
  • Метакоманды (\dt, \conninfo) Query Tool не понимает: текст уходит на сервер, а сервер отвечает синтаксической ошибкой у символа \. Метакоманды — в SQL Shell (psql) или в Tools → PSQL Tool.
Query Tool: запрос и результат
Query Tool на базе postgres под пользователем postgres: в редакторе SELECT version(); на вкладке Data Output столбец version типа text со строкой PostgreSQL 18.6 on x86_64-windows, внизу Total rows: 1 и Query complete

Ниже — как в pgAdmin сделать каждый пункт самостоятельной работы «Начало работы с PostgreSQL». Имена — варианта 1 (база sklad, роль sklad_user, таблица tovary), подставьте свои.

1. Параметры сервера

Выделите базу postgres под сервером «PostgreSQL 18» (он подключён как postgres), откройте Query Tool и выполните запросы по одному — выделяя строку и нажимая F5, иначе в Data Output останется только результат последнего.

SELECT version();
SHOW shared_buffers;

-- Несколько параметров и их контекст одним запросом
SELECT name, setting, unit, context
FROM pg_settings
WHERE name IN ('shared_buffers', 'work_mem', 'port');

SHOW выводит память в понятных единицах (128MB), pg_settings — числом в единицах из столбца unit (16384 × 8kB). Это одно и то же значение. Те же параметры видны у сервера: выделите в дереве «PostgreSQL 18» → «⋮» → Open → Dashboard → вкладка Configuration, в поле поиска — имя параметра. Значение там как в pg_settings — числом и единицей (16384, 8kB), а столбца context нет, его смотрят запросом. Что означает контекст — пункт 05.

Dashboard → Configuration
Вкладка Dashboard сервера PostgreSQL 18, подвкладки Activity, State, Configuration, Logs, System; на Configuration в поиске shared_buffers, строка: Name shared_buffers, Category Resource, Value 16384, Unit 8kB, Description

2. Роль и база

В том же Query Tool под postgres. CREATE DATABASE нельзя выполнять внутри транзакции, поэтому каждую команду — отдельным F5: выделить и выполнить.

CREATE ROLE sklad_user LOGIN PASSWORD 'придумайте_пароль';
CREATE DATABASE sklad OWNER sklad_user ENCODING 'UTF8';

То же мышью. Роль: правой кнопкой по Login/Group Roles → Create → Login/Group Role… → General: Name; Definition: Password; Privileges: Can login? — включить, остальные переключатели не трогать. База: правой кнопкой по Databases → Create → Database… → General: Database и Owner (выбрать свою роль — список ролей берётся с сервера, поэтому роль создают первой); Definition: Encoding — там уже стоит UTF8. В каждом диалоге есть вкладка SQL с командой, которую pgAdmin выполнит по кнопке Save, — её и записывают на лист.

Создание роли: вкладка Privileges
Окно создания роли с вкладками General, Definition, Privileges, Membership, Parameters, Security, SQL; на вкладке Privileges включены Can login и Inherit rights from the parent roles, выключены Superuser, Create roles, Create databases, репликация и Bypass RLS
Создание базы: вкладка SQL
Окно Create - Database на вкладке SQL: CREATE DATABASE sklad WITH OWNER = postgres ENCODING = 'UTF8' LOCALE_PROVIDER = 'libc' CONNECTION LIMIT = -1 IS_TEMPLATE = False

На снимке владелец — postgres: так диалог заполняет поле по умолчанию. В работе выберите в Owner свою роль, и в команде будет OWNER = sklad_user.

Подключение под новой ролью: правой кнопкой по Servers → Register → Server…; General → Name, например sklad_user; Connection → Host localhost, Port 5432, Maintenance database sklad, Username sklad_user и пароль роли. В дереве будет два сервера — это два подключения к одному и тому же PostgreSQL. Дальше Query Tool открывайте на базе sklad под этим вторым подключением. Проверка — запрос SELECT current_user, current_database();.

Быстрее — в уже открытом Query Tool, без второго сервера в дереве: щелчок по строке подключения → < New Connection... > → окно Add New Connection: Database — sklad, User — sklad_user, Role не заполнять → Save. pgAdmin предупредит, что несохранённый текст запроса пропадёт, — Yes. Затем спросит пароль роли. Строка подключения станет sklad/sklad_user@PostgreSQL 18.

Query Tool: новое подключение
Окно Add New Connection поверх Query Tool: Server PostgreSQL 18, Database sklad, User sklad_user, кнопки Close, Reset и Save
В окне пароля сразу может быть красная рамка: connection failed … failed: и дальше значки вместо букв. Это ответ сервера на попытку входа до ввода пароля — «пользователь не прошёл проверку подлинности». Сервер пишет его по-русски в кодировке 1251, а pgAdmin ждёт UTF-8, отсюда значки. Введите пароль роли и нажмите OK.
Пароль роли и нечитаемое сообщение сервера
Окно Connect to Server: Please enter the password for the user sklad_user, флажок Save Password, ниже красная рамка connection failed с нечитаемыми символами вместо русского текста

\conninfo — метакоманда, она выполняется в psql: SQL Shell, на вопросы ответить localhost, sklad, 5432, sklad_user.

3. Таблица, ошибка, запрос

  • CREATE TABLE — в Query Tool под sklad_user. Чтобы таблица появилась в дереве: sklad → Schemas → public → Tables → правой кнопкой → Refresh. Вкладка SQL у таблицы покажет ограничения с именами, которые им дал сервер, — например tovary_nazvanie_key.
  • Четыре верных строки — одним INSERT и одним F5. Строку с ошибкой — отдельным INSERT, выделить и F5. Если выполнить всё вместе, ошибка отменит и верные строки: весь текст — одна транзакция.
  • Ошибка — на вкладке Messages, и pgAdmin выводит её дважды. Сначала ERROR: duplicate key value violates unique constraint "tovary_nazvanie_key" и строка Key (nazvanie)=(Гайка М8) already exists.; потом то же с ОШИБКА: в начале, код SQL state: 23505 и Detail: Key …. По-русски в pgAdmin только слово ОШИБКА, текст — английский. В SQL Shell то же сообщение целиком по-русски: ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности … и ПОДРОБНОСТИ: Ключ "(nazvanie)=(Гайка М8)" уже существует. Переписывайте как на экране — обе строки: саму ошибку и подробности.
  • Номер в Failing row contains (5, …) («Ошибочная строка содержит») вырастет при повторной попытке: каждая неудачная вставка расходует номер IDENTITY. Это не ошибка.
  • Запрос с sum, max, avg — в Query Tool, ответ в Data Output: столбец назван по функции, значение — как вывел сервер, без округления. Всю таблицу можно посмотреть правой кнопкой по таблице → View/Edit Data → All Rows.
Ошибка уникальности на вкладке Messages
Query Tool под sklad_user: в редакторе CREATE TABLE tovary, INSERT четырёх строк и выделенный отдельный INSERT строки Гайка М8; на вкладке Messages ERROR duplicate key value violates unique constraint tovary_nazvanie_key, Key (nazvanie)=(Гайка М8) already exists, затем ОШИБКА с тем же текстом, SQL state 23505 и Detail
Таблица в дереве и её вкладка SQL
Дерево: Tables, tovary, Columns с id integer, nazvanie text, kolvo integer, cena numeric(10,2), Constraints с tovary_cena_check, tovary_kolvo_check, tovary_nazvanie_key, tovary_pkey; справа вкладка SQL с CREATE TABLE IF NOT EXISTS public.tovary и ограничениями с этими именами, в конце OWNER to sklad_user

4. Метакоманды

Только в psql: SQL Shell или Tools → PSQL Tool (откроется psql, уже подключённый к выделенной в дереве базе). Список всех метакоманд — \?, справка по SQL-команде — \h; подробно — пункт 07. Если русские буквы в SQL Shell выводятся непонятными символами — пункт 03, про кодовую страницу.

PSQL Tool — это окно командной строки Windows, в котором pgAdmin запускает psql.exe из каталога утилит (Binary paths, пункт 5) под пользователем сервера в дереве, обычно postgres. Русские буквы в нём нечитаемы: и подписи самого psql, и данные. Данные исправляет команда \encoding WIN866 — после неё SELECT выводит названия по-русски; подписи psql (\conninfo, «(4 строки)») так и остаются значками. Метакоманды в PSQL Tool работают, а запросы с русскими данными удобнее выполнять в Query Tool.

PSQL Tool: \conninfo и русские данные до и после \encoding WIN866
Вкладка PSQL Tool sklad/postgres: вывод conninfo с нечитаемыми подписями и значениями sklad, postgres, localhost, 5432; SELECT nazvanie FROM tovary выводит значки вместо названий; после encoding WIN866 тот же запрос выводит Болт М8, Гайка М8, Шайба 8, Саморез 4x40

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

На лист нужна команда pg_dump — её удобнее выполнить в PowerShell (пункт 03, «Утилиты в командной строке»). В pgAdmin то же самое делают диалоги.

Сначала, один раз, — путь к утилитам. pgAdmin 9.18 по умолчанию запускает pg_dump, pg_restore и psql из своей папки C:\Program Files\pgAdmin 4\runtime, а на Windows они там не стартуют: им не хватает библиотеки gssapi64.dll, которой в поставке pgAdmin нет. Backup… сразу заканчивается уведомлением Process failed, а в View details — pg_dump: error: Unable to find a dll needed by the utility.
Backup без настройки: утилита из папки pgAdmin не запускается
Окно Process Watcher: команда C:\Program Files\pgAdmin 4\runtime\pg_dump.exe с ключами --file, --host, --port, --username postgres, --format=p; ниже красным pg_dump: error: Unable to find a dll needed by the utility и Failed (exit code: 3221225781)

Как указать путь: File → Preferences (или шестерёнка внизу слева) → Paths → Binary paths. В таблице PostgreSQL Binary Path, в строке PostgreSQL 18, впишите C:\Program Files\PostgreSQL\18\bin и нажмите значок проверки справа от поля — откроется окно с версиями pg_dump, pg_restore, psql: 18.6. Затем Save — значок дискеты вверху вкладки. Без Save путь не запоминается. Строку PostgreSQL 13 с $DIR/../runtime и отметку Set as default не трогайте: для сервера 18 pgAdmin берёт путь из строки 18. Настройка хранится в профиле пользователя Windows, поэтому под другой учётной записью её делают заново.

Preferences → Paths → Binary paths
Вкладка Preferences, раздел Paths, Binary paths: таблица PostgreSQL Binary Path, в строке PostgreSQL 13 отмечено Set as default и путь $DIR/../runtime, в строке PostgreSQL 18 вписан путь C:\Program Files\PostgreSQL\18\bin; вверху кнопка Save

Backup… и Restore…

  • Копия. Правой кнопкой по базе → Backup… → General: Filename — полный путь и имя файла (можно вписать, можно выбрать значком папки), Format — по умолчанию стоит Custom (.dump для pg_restore), для текстового .sql выберите Plain. Role name оставьте пустым: это не пользователь копии, а роль, на которую pg_dump переключится после подключения (ключ --role). Копия снимается под тем пользователем, под которым подключён сервер в дереве, — поэтому база выделяется под вторым подключением, sklad_user. Кнопка Backup запускает pg_dump в фоне; об окончании сообщает уведомление справа внизу.
  • Какая команда выполнилась. «⋮» → Open → Processes → значок листа в строке задачи (View details): командная строка pg_dump с ключами и журнал. Имени базы в этой строке нет — pgAdmin передаёт его не ключом; на лист допишите -d sklad. Путь к файлу pgAdmin показывает в коротком виде (DOCUME~1 вместо Documents) — это тот же каталог.
  • Удаление таблицы — DROP TABLE tovary; в Query Tool или правой кнопкой по таблице → Delete.
  • Восстановление custom-копии. Правой кнопкой по базе → Restore… → Format: Custom or tar, Filename — файл .dump, Role name — пусто. Это pg_restore; восстановление идёт под пользователем подключения.
  • Восстановление plain-копии. Restore… → Format: Plain, Filename — файл .sql. pgAdmin выполняет его через psql. В журнале будут две строки с ошибка про \restrict и \unrestrict — их пишет pg_dump 17.6 и новее как защиту файла, на данные они не влияют: итог — Successfully completed. Через Query Tool plain-копию не выполнить: метакоманды \restrict понимает только psql. Без pgAdmin — psql -f в PowerShell или \i в SQL Shell, путь с прямыми слэшами: \i 'C:/Users/student/sklad.sql'.
  • Проверка — SELECT count(*) FROM tovary;: должно быть 4. Размер файла копии — в Проводнике (правой кнопкой → Свойства → Размер, в байтах) или (Get-Item sklad.sql).Length в PowerShell.
Backup…: файл и формат Plain
Окно Backup (Database: sklad), вкладка General: Filename C:\Users\Nevabit.RU\Documents\sklad.sql, Format Plain, поля Compression ratio, Encoding, Number of jobs и Role name пустые; кнопки Close, Reset, Backup
Processes → View details: команда и журнал
Окно Process Watcher: команда C:\Program Files\PostgreSQL\18\bin\pg_dump.exe --file sklad.sql --host localhost --port 5432 --username postgres --no-password --format=p --verbose; журнал pg_dump по-русски: создаётся TABLE public.tovary, выгрузка содержимого таблицы, создаётся CONSTRAINT; внизу Successfully completed
Restore… plain-копии
Окно Process Watcher - Restoring backup: команда C:\Program Files\PostgreSQL\18\bin\psql.exe -c \restrict … --file sklad.sql; в журнале ALTER TABLE и две строки ошибка про команды с обратной косой чертой и \unrestrict; внизу Successfully completed

Ключевые выводы раздела

Запомните главное

  • PostgreSQL — процессная архитектура: соединение стоит памяти, поэтому нужен пул
  • Кластер — набор баз в одном каталоге данных под одним экземпляром, к отказоустойчивости отношения не имеет
  • В Debian конфигурация в /etc/postgresql/17/main/, данные в /var/lib/postgresql/17/main/; в Docker и PGDG — иначе
  • Расположение файлов узнаётся запросом SHOW config_file, а не поиском по диску
  • reload перечитывает конфигурацию без разрыва соединений; restart обрывает все
  • У параметра есть контекст: часть требует перезапуска, часть — только reload
  • ALTER SYSTEM пишет в postgresql.auto.conf и перекрывает postgresql.conf; источник виден в pg_settings.source
  • В pg_hba.conf побеждает первое подходящее правило — порядок строк является логикой
  • work_mem выделяется на каждую операцию, а не на соединение
  • Кодировка и локаль базы задаются при создании и потом не меняются
  • pgAdmin — обычный клиент: Query Tool выполняет SQL, метакоманды понимает только psql, plain-копию восстанавливает тоже psql (в pgAdmin — Restore… → Plain); перед первой копией в pgAdmin 9.18 на Windows укажите Binary paths
Практические задания — на учебном портале. Задания, критерии оценивания, сдача работ и оценки преподавателя — в курсе на portal.nevabit.ru. Учётную запись выдаёт преподаватель.
Раздел 4: Нормализация Все разделы Раздел 6: Администрирование