Установка и первый запуск: Linux, Windows, Docker

Рейтинг: 60.1% · 14 голосов
Подробный курс по PostgreSQL: SQL по демобазе, типы данных и JSONB, индексы, транзакции и MVCC, VACUUM, EXPLAIN и планировщик, роли и привилегии, репликация, бэкап, настройка под нагрузку и под 1С. Актуально на 2026.
Ответить
Аватара пользователя
Egor_DBA
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Установка и первый запуск: Linux, Windows, Docker

Сообщение Egor_DBA »

Оглавление курса (47)
  1. Что такое PostgreSQL: история, философия, где применяется
  2. Урок 1. Что нового в PostgreSQL 15 и далее (15 -> 16 -> 17)
  3. Установка и первый запуск: Linux, Windows, Docker (вы здесь)
  4. psql детально: метакоманды и работа в консоли
  5. Демобаза Авиаперевозки Postgres Pro: структура и развёртывание
  6. SELECT: проекция, фильтрация, сортировка
  7. Транзакции и ACID
  8. Уровни изоляции транзакций: Read Committed, Repeatable Read, Serializable
  9. Соединения таблиц (JOIN)
  10. Агрегация: GROUP BY, HAVING, GROUPING SETS
  11. Подзапросы и CTE (WITH), рекурсия
  12. Оконные функции
  13. Изменение данных: INSERT/UPDATE/DELETE, UPSERT, MERGE
  14. Числовые и булевы типы, NULL и трёхзначная логика
  15. Строки, текст, дата и время, таймзоны
  16. Массивы, диапазоны, enum, составные типы
  17. JSON и JSONB: операторы и индексация
  18. DDL: CREATE TABLE, схемы, ALTER
  19. Ограничения целостности
  20. Представления и материализованные представления
  21. Последовательности, IDENTITY, генерируемые столбцы
  22. Индексы: B-tree и когда индекс не используется
  23. Типы индексов: Hash, GiST, SP-GiST, GIN, BRIN
  24. Продвинутые индексы: частичные, по выражению, покрывающие
  25. Обслуживание индексов и таблиц: bloat, REINDEX, CONCURRENTLY
  26. Полнотекстовый поиск
  27. Роли и пользователи
  28. Привилегии: GRANT/REVOKE
  29. Row-Level Security и безопасность данных
  30. Подключение приложения: pg_hba.conf, SSL, пулы соединений
  31. Серверное программирование: функции и процедуры
  32. Триггеры и события
  33. Архитектура PostgreSQL: процессы и память
  34. MVCC: версии строк и видимость
  35. VACUUM, autovacuum, freeze и wraparound
  36. WAL, контрольные точки и долговечность
  37. Блокировки и взаимоблокировки
  38. Планировщик запросов
  39. EXPLAIN и EXPLAIN ANALYZE: чтение планов
  40. Конфигурация сервера: ключевые параметры
  41. Настройка под нагрузку и под 1С
  42. Параллельные запросы и партиционирование
  43. Резервное копирование и восстановление
  44. Репликация: потоковая и hot standby
  45. Логическая репликация и кластерные решения
  46. Внешние данные, расширения и сертификация
  47. Разбор планов запросов на explain.tensor.ru: глубокое чтение EXPLAIN ANALYZE
Урок 2. Установка и первый запуск: Linux, Windows, Docker

В прошлый раз мы разобрались, что такое postgresql и из чего состоит СУБД. Теперь ставим её руками и доводим до первого живого подключения. Задача урока - поставить сервер тремя разными способами (пакеты Linux, инсталлятор Windows, контейнер Docker), понять, где лежат данные, как запускается служба и почему в свежей системе уже есть базы template0, template1 и postgres. К концу вы откроете psql и выполните первый запрос.

Изображение

Как это работает

Сначала важно развести два понятия, которые новички путают. Есть исполняемые файлы сервера (postgres, initdb, pg_ctl, psql) - это сама программа. И есть кластер баз данных - каталог на диске, где живут данные. Один установленный сервер может обслуживать несколько кластеров, но обычно у вас один.

Кластер - это не про несколько машин, как в Kubernetes. В терминологии PostgreSQL кластер - это один каталог данных (PGDATA) и набор баз внутри него, которыми управляет один процесс-сервер на одном порту (по умолчанию 5432). Создаётся этот каталог утилитой initdb: она раскладывает служебные файлы, заводит системный каталог и три стартовые базы.

Базы template1 и template0 - это шаблоны. Когда вы делаете CREATE DATABASE, новая база физически копируется с template1. Поэтому всё, что вы добавите в template1 (расширение, схему, права), автоматически окажется во всех будущих базах. template0 - это нетронутый эталон на крайний случай: его не меняют, из него восстанавливают, если template1 случайно испортили, и из него создают базы с другой кодировкой. База postgres - просто рабочая база по умолчанию, чтобы было куда подключиться сразу после установки.

Суперпользователь СУБД создаётся при initdb и по умолчанию называется postgres. Это роль внутри сервера, не путать с системным пользователем ОС, хотя при пакетной установке в Linux заводится и одноимённый системный аккаунт. Современная аутентификация по паролю использует метод SCRAM-SHA-256 (в PG 15 это значение по умолчанию для password_encryption) - старый md5 считаем устаревшим.

После initdb каталог данных надо запустить как службу. В пакетных установках это делает systemd, в Windows - служба Windows, в Docker - процесс внутри контейнера. Сервер начинает слушать порт, и к нему можно подключиться клиентом psql.

SQL и примеры

Debian/Ubuntu, установка из официального репозитория PGDG (apt). Пакет postgresql-15 при установке сам вызывает initdb и поднимает службу:

Код: Выделить всё

sudo apt update
sudo apt install -y postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
sudo apt install -y postgresql-15
systemctl status postgresql@15-main
В Debian каталог данных по умолчанию: /var/lib/postgresql/15/main, конфиги отдельно в /etc/postgresql/15/main. Это особенность Debian - на RHEL пути другие.

RHEL/Fedora (dnf). Здесь после установки кластер нужно инициализировать вручную, служба сама не стартует:

Код: Выделить всё

sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql15-server
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
sudo systemctl enable --now postgresql-15
На RHEL данные лежат в /var/lib/pgsql/15/data, и конфиги там же, внутри PGDATA.

Первое подключение в Linux. Пакеты настроены на peer-аутентификацию: системный пользователь postgres заходит без пароля:

Код: Выделить всё

sudo -u postgres psql
Внутри psql смотрим версию и список баз. Команда \l (или \l+) показывает базы кластера - там вы увидите template0, template1 и postgres:

Код: Выделить всё

SELECT version();
\l
\conninfo
Зададим пароль суперпользователю - он сохранится уже в виде SCRAM-хеша:

Код: Выделить всё

ALTER ROLE postgres WITH PASSWORD 'StrongPass2026';
SHOW password_encryption;
Windows. Берём установщик EDB (графический мастер). Он ставит сервер, делает initdb, регистрирует службу и спрашивает пароль для postgres. Каталог данных по умолчанию - C:\Program Files\PostgreSQL\15\data. После установки запускаем SQL Shell (psql) из меню и логинимся паролем. Управление службой:

Код: Выделить всё

pg_ctl status -D "C:\Program Files\PostgreSQL\15\data"
Docker (официальный образ). Главное правило - данные кладём в volume, иначе при удалении контейнера потеряете всё. Каталог данных внутри образа: /var/lib/postgresql/data.

Код: Выделить всё

docker volume create pgdata
docker run -d --name pg15 \
  -e POSTGRES_PASSWORD=StrongPass2026 \
  -e POSTGRES_DB=demo \
  -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  postgres:15
Подключаемся к контейнеру и проверяем кодировку с локалью кластера:

Код: Выделить всё

docker exec -it pg15 psql -U postgres -d demo -c "\l"
docker exec -it pg15 psql -U postgres -c "SHOW server_encoding;"
В PG 16 и 17 эти команды те же; в 16 добавился встроенный провайдер локали builtin и параметр --locale-provider у initdb, а в 17 у образа появилось больше переменных окружения для тонкой настройки initdb. На практике для русского текста ставьте кодировку UTF8.

Частые грабли
  • Удалили Docker-контейнер без volume - данные пропали. Always монтируйте том на /var/lib/postgresql/data.
  • На RHEL/Fedora забыли postgresql-15-setup initdb и пытаются стартовать службу - она падает, потому что кластер не создан.
  • Путают системного пользователя ОС postgres и роль СУБД postgres. Это разные сущности, просто с одинаковым именем.
  • Меняют template0 - так делать нельзя, это эталон. Кастомизируйте template1.
  • Connection refused при подключении с другой машины - сервер слушает только localhost. Нужно править listen_addresses в postgresql.conf и добавлять запись в pg_hba.conf.
  • На свежей установке нет пароля у postgres и не понимают, как зайти - в Linux это peer-аутентификация через sudo -u postgres.
  • Ставят несколько мажорных версий и обращаются не к тому порту (5432 у первой, 5433 у второй).
Мини-лаба
  • Поставьте PostgreSQL 15 любым удобным способом (пакеты, инсталлятор или Docker).
  • Подключитесь через psql и выполните SELECT version(); запишите точную версию.
  • Командой \l выведите список баз и найдите там template0, template1, postgres.
  • Узнайте каталог данных: SHOW data_directory; и SHOW config_file;
  • Создайте свою базу: CREATE DATABASE sandbox; подключитесь к ней через \c sandbox
  • Проверьте метод аутентификации: SHOW password_encryption; убедитесь, что это scram-sha-256.
  • Создайте таблицу с первичным ключом через GENERATED ALWAYS AS IDENTITY и вставьте пару строк.
Контрольные вопросы
  • Чем кластер баз данных в PostgreSQL отличается от кластера в смысле нескольких серверов?
  • Зачем нужны две базы-шаблона template0 и template1 и в чём разница между ними?
  • Что делает утилита initdb и почему на RHEL её надо вызывать вручную, а на Debian нет?
  • Почему при работе с Docker критично монтировать volume на каталог данных?
  • Чем системный пользователь postgres в ОС отличается от роли postgres внутри сервера?
  • Какой метод шифрования пароля используется по умолчанию в PG 15 и чем он лучше md5?
👍7 ❤️1 🔥1 😄 🤔
Аватара пользователя
golang91
Сообщения: 1
Зарегистрирован: 11 май 2026, 02:20

Re: Установка и первый запуск: Linux, Windows, Docker

Сообщение golang91 »

Поставил через docker на маке, подключаюсь снаружи через psql -h localhost -p 5432 -U postgres, пароль из POSTGRES_PASSWORD - работает. А вот без -v том реально слетел после docker rm, проверил на себе.
👍1 ❤️ 🔥 😄 🤔1
Аватара пользователя
async2026
Сообщения: 1
Зарегистрирован: 20 май 2026, 15:16

Re: Установка и первый запуск: Linux, Windows, Docker

Сообщение async2026 »

А зачем держать postgres И template1, если новые базы и так копируются с template1? К postgres просто чтобы было куда коннектиться первым делом, или у неё ещё роль есть?
👍1 ❤️ 🔥1 😄 🤔
Ответить
← Предыдущая глава
Урок 1. Что нового в PostgreSQL 15 и далее (15 -> 16 -> 17)
Следующая глава →
psql детально: метакоманды и работа в консоли

Все главы курса «PostgreSQL: от первого запроса до продакшена»

Поделиться темой: ✈ Telegram VK

Вернуться в «PostgreSQL: от первого запроса до продакшена»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя