Как устроен сервер баз данных и как привести его в рабочее состояние
pg_dumppg_ctlcluster и systemdpostgresql.conf, понимая контексты применения параметровpg_hba.confpsql и пользоваться метакомандамиPostgreSQL построен на процессах, а не на потоках. На каждое клиентское соединение операционная система создаёт отдельный процесс. Это решение объясняет и надёжность сервера, и стоимость соединения.
┌─────────────────────┐
клиент 1 ──────────▶│ backend процесс 1 │──┐
клиент 2 ──────────▶│ backend процесс 2 │──┤
клиент N ──────────▶│ backend процесс N │──┤
└─────────────────────┘ │
▼
postmaster ┌───────────────┐
(главный процесс, │ Shared Buffers│
принимает │ общая память │
соединения) └───────┬───────┘
│
фоновые процессы: ▼
background writer ──────────────▶ ┌─────────────┐
WAL writer ──────────────▶ │ файлы на │
checkpointer ──────────────▶ │ диске │
autovacuum launcher ──────────────▶ └─────────────┘
stats collector
max_connections нельзя ставить произвольно большим, и приложению нужен пул соединений. Открывать соединение на каждый HTTP-запрос — верный способ положить сервер.Shared Buffers — общая область памяти, через которую все процессы работают с данными. Запрос никогда не читает файл напрямую: страница сначала попадает в общий буфер, а изменения сначала пишутся в журнал (WAL), и только потом — в файлы данных. Отсюда правило: если сервер выключился внезапно, при старте PostgreSQL воспроизведёт журнал и восстановит согласованное состояние.
Четыре понятия, которые постоянно путают. В терминологии PostgreSQL они означают строго определённые вещи.
initdb.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.Курс рассчитан на 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
unattended-upgrades. PGDG нужен только тогда, когда требуется версия, которой в дистрибутиве ещё нет. Для учебных и большинства рабочих задач достаточно штатного пакета.Что установка сделала с системой:
postgres — от его имени работают все процессы сервера.initdb и создан кластер с именем main.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-файл |
SHOW config_file;, а не поиском по диску.Windows. На Windows PostgreSQL ставят установщиком EDB — файл вида postgresql-18.6-5-windows-x64.exe со страницы загрузки postgresql.org (Download → Windows). Установщик задаёт несколько вопросов.
postgres. Запишите: без него не создать ни роль, ни базу.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
\s отвечает, что в этой сборке история не поддерживается. Остальные метакоманды из пункта 07 работают так же, как в Linux.pgAdmin — графический клиент: в нём удобнее выполнять SQL с русскими данными и смотреть, что получилось. Окно, меню и работа в Query Tool — в пункте 10.
В 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
Основной файл конфигурации. Формат простой: параметр = значение, комментарии после #.
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 |
sighup | reload | log_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 сразу показывает, откуда взято действующее значение. Проверяйте его первым делом.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.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;
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, сортировка русского текста пойдёт по кодам символов: «Ёж» окажется после «Яблока».Значения по умолчанию у PostgreSQL намеренно скромные — они рассчитаны на то, чтобы сервер запустился где угодно. На типичном VPS их нужно поднимать; на очень маленьком — следить, чтобы сервер не съел всю память.
Пример расчёта для машины 1 CPU / 1 ГБ ОЗУ — распространённая конфигурация недорогого VPS:
| Параметр | По умолчанию | Для 1 ГБ | Обоснование |
|---|---|---|---|
shared_buffers | 128MB | 256MB | 25% ОЗУ |
effective_cache_size | 4GB | 512MB | подсказка планировщику, память не занимает |
work_mem | 4MB | 4MB | умножается на число операций — повышать опасно |
maintenance_work_mem | 64MB | 64MB | разово при VACUUM и построении индексов |
max_connections | 100 | 40 | остальное закрывается пулом соединений |
max_worker_processes | 8 | 2 | одно ядро |
max_parallel_workers_per_gather | 2 | 0 | параллелизм на одном ядре только вредит |
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
transaction позволяет сотне клиентов приложения работать через десяток реальных соединений к базе. Это дешевле, чем увеличивать max_connections, и почти всегда быстрее.Свежеустановленный PostgreSQL закрыт разумно, но первые же шаги по «настройке доступа» обычно эту защиту снимают.
listen_addresses = '*' без необходимости. Если приложение на той же машине — оставьте localhost. Порт 5432, открытый в интернет, сканируется в первые же часы.trust для сетевых подключений. Метод trust пускает вообще без проверки. Единственное его законное применение — восстановление доступа, когда забыт пароль суперпользователя, и то временно.nevabit_app с правами только на свою базу; о разграничении прав — раздел 6.scram-sha-256. Проверьте password_encryption и убедитесь, что в pg_hba.conf нет md5.ufw с разрешёнными 22, 80 и 443; порт базы наружу не выставляется.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).pgAdmin — графический клиент PostgreSQL. Данных он не хранит: подключается к серверу так же, как psql или приложение, и каждое его окно с запросами — отдельное соединение, то есть отдельный backend-процесс из пункта 01. Всё, что делается мышью, pgAdmin превращает в обычный SQL или в запуск pg_dump / pg_restore. Снимки ниже — pgAdmin 9.18 на учебном ПК с Windows 11; интерфейс английский. На телефоне снимок открывается в полном размере нажатием.
postgres.public → Tables → таблица → Columns, Constraints. На уровне сервера — ещё Login/Group Roles и Tablespaces. Дерево не обновляется само: после CREATE в Query Tool новый объект появится только после Refresh (в дереве — клавиша F5).postgres даёт права на весь сервер.| Меню | Главное |
|---|---|
| File | Preferences — настройки: клавиши, пути к утилитам (Paths → Binary paths) |
| Object | действия с выделенным в дереве объектом — то же, что его контекстное меню: Create, Refresh, Delete, Properties, подключение к серверу |
| Tools | Query 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 |
postgres/postgres@PostgreSQL 18 — база, пользователь, сервер. Щелчок по этой строке → < New Connection... > позволяет выбрать другую базу и другого пользователя (пункт 2 ниже).\dt, \conninfo) Query Tool не понимает: текст уходит на сервер, а сервер отвечает синтаксической ошибкой у символа \. Метакоманды — в SQL Shell (psql) или в Tools → PSQL Tool.Ниже — как в pgAdmin сделать каждый пункт самостоятельной работы «Начало работы с PostgreSQL». Имена — варианта 1 (база sklad, роль sklad_user, таблица tovary), подставьте свои.
Выделите базу 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.
В том же 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, — её и записывают на лист.
На снимке владелец — 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.
connection failed … failed: и дальше значки вместо букв. Это ответ сервера на попытку входа до ввода пароля — «пользователь не прошёл проверку подлинности». Сервер пишет его по-русски в кодировке 1251, а pgAdmin ждёт UTF-8, отсюда значки. Введите пароль роли и нажмите OK.\conninfo — метакоманда, она выполняется в psql: SQL Shell, на вопросы ответить localhost, sklad, 5432, sklad_user.
CREATE TABLE — в Query Tool под sklad_user. Чтобы таблица появилась в дереве: sklad → Schemas → public → Tables → правой кнопкой → Refresh. Вкладка SQL у таблицы покажет ограничения с именами, которые им дал сервер, — например tovary_nazvanie_key.INSERT и одним F5. Строку с ошибкой — отдельным INSERT, выделить и F5. Если выполнить всё вместе, ошибка отменит и верные строки: весь текст — одна транзакция.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.Только в 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.
На лист нужна команда pg_dump — её удобнее выполнить в PowerShell (пункт 03, «Утилиты в командной строке»). В pgAdmin то же самое делают диалоги.
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.Как указать путь: 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, поэтому под другой учётной записью её делают заново.
.dump для pg_restore), для текстового .sql выберите Plain. Role name оставьте пустым: это не пользователь копии, а роль, на которую pg_dump переключится после подключения (ключ --role). Копия снимается под тем пользователем, под которым подключён сервер в дереве, — поэтому база выделяется под вторым подключением, sklad_user. Кнопка Backup запускает pg_dump в фоне; об окончании сообщает уведомление справа внизу.pg_dump с ключами и журнал. Имени базы в этой строке нет — pgAdmin передаёт его не ключом; на лист допишите -d sklad. Путь к файлу pgAdmin показывает в коротком виде (DOCUME~1 вместо Documents) — это тот же каталог.DROP TABLE tovary; в Query Tool или правой кнопкой по таблице → Delete..dump, Role name — пусто. Это pg_restore; восстановление идёт под пользователем подключения..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./etc/postgresql/17/main/, данные в /var/lib/postgresql/17/main/; в Docker и PGDG — иначеSHOW config_file, а не поиском по дискуreload перечитывает конфигурацию без разрыва соединений; restart обрывает всеreloadALTER SYSTEM пишет в postgresql.auto.conf и перекрывает postgresql.conf; источник виден в pg_settings.sourcepg_hba.conf побеждает первое подходящее правило — порядок строк является логикойwork_mem выделяется на каждую операцию, а не на соединениеpsql, plain-копию восстанавливает тоже psql (в pgAdmin — Restore… → Plain); перед первой копией в pgAdmin 9.18 на Windows укажите Binary paths