psql детально: метакоманды и работа в консоли

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

psql детально: метакоманды и работа в консоли

Сообщение 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
Урок 3. psql детально: метакоманды и работа в консоли

psql - это штатный текстовый клиент postgresql, и для администратора (DBA) он остается главным инструментом на каждый день. Через него вы подключаетесь к серверу, смотрите список баз и таблиц, гоняете запросы, запускаете SQL-скрипты и разбираетесь, что вообще происходит внутри. В этом уроке мы разберем, как соединиться с сервером разными способами, какие метакоманды экономят часы работы, как настроить вывод и поведение клиента под себя через psqlrc и переменные. Цель - чтобы консоль перестала пугать и стала удобной.

Изображение

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

psql - обычная клиентская программа: она открывает сетевое соединение к серверному процессу postgres и обменивается с ним сообщениями по протоколу. Все, что вы вводите, делится на две части. Строки, начинающиеся с обратной косой черты (\), - это метакоманды, их обрабатывает сам psql на вашей стороне. Все остальное - это SQL, который клиент отправляет на сервер и ждет ответ.

Чтобы соединиться, серверу нужно знать четыре вещи: адрес хоста, порт, имя пользователя и имя базы. Для этого есть флаги -h (host), -p (port), -U (user), -d (dbname). Если что-то не указать, psql берет значение по умолчанию: хост - локальный сокет, порт 5432, а имя пользователя и базы совпадают с вашим системным логином. Поэтому на своей машине часто хватает просто psql.

Важно понимать разницу между подключением через Unix-сокет и через TCP. Без -h psql идет в локальный сокет, и тут обычно работает аутентификация peer (сервер просто доверяет вашему системному пользователю). С -h localhost соединение идет уже по TCP, и сервер чаще требует пароль. Это типичная путаница у новичков: одна и та же команда то просит пароль, то нет.

Метакоманды осмотра (их называют backslash-команды) - это удобные обертки над системными каталогами. Когда вы пишете \dt, psql под капотом выполняет SELECT по pg_class и pg_namespace и красиво печатает результат. Можно запустить psql с флагом -E, и он будет показывать сам скрытый SQL каждой метакоманды - отличный способ научиться читать системные каталоги.

Пароль в открытую вводить неудобно и небезопасно. Для этого есть файл .pgpass в домашнем каталоге со строками формата host:port:database:user:password. psql сам подставит подходящий пароль. Файл обязан иметь права 0600, иначе клиент его проигнорирует. На современных серверах (PG 14+) метод хранения пароля по умолчанию - scram-sha-256, более стойкий, чем старый md5.

SQL и примеры

Подключение разными способами. Первая строка - полная форма с флагами, вторая - то же самое одной строкой подключения (connection URI):

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

psql -h db.local -p 5432 -U app_user -d demo
psql "postgresql://app_user@db.local:5432/demo?sslmode=require"
Базовые метакоманды осмотра. \l показывает список всех баз, \dt - таблицы текущей схемы, \d с именем - подробное описание объекта (колонки, типы, индексы, ограничения):

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

\l
\dt bookings.*
\d bookings.flights
Команда \d на таблице flights из демобазы Авиаперевозки выведет ее колонки (flight_id, flight_no, departure_airport и т.д.), типы данных, первичный ключ и связанные внешние ключи. Это первое, что делаешь, когда видишь незнакомую таблицу.

Осмотр пользователей, функций и схем. \du - роли и их атрибуты, \df - функции, \dn - схемы:

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

\du
\df bookings.*
\dn+
Реальный запрос к демобазе - топ аэропортов по числу вылетов. Заодно покажем, зачем нужен расширенный вывод:

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

SELECT a.airport_name, count(*) AS departures
FROM bookings.flights f
JOIN bookings.airports a ON a.airport_code = f.departure_airport
GROUP BY a.airport_name
ORDER BY departures DESC
LIMIT 5;
Если в строке много широких колонок, таблица расползается. Команда \x включает расширенный (вертикальный) вывод: каждая строка печатается как пары поле-значение. Удобно для разглядывания одной записи:

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

\x
SELECT * FROM bookings.tickets LIMIT 1;
\x
Запуск SQL-скрипта из файла и измерение времени. \i выполняет файл, \timing включает показ длительности каждого запроса:

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

\timing on
\i /home/dba/reports/daily.sql
Переменные psql и подстановка. Двоеточие подставляет значение, кавычки нужны для строк:

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

\set port_min 1000
SELECT count(*) FROM bookings.tickets WHERE ticket_no > :'port_min';
Файл ~/.psqlrc выполняется при каждом старте psql. Удобные настройки по умолчанию:

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

\set PROMPT1 '%n@%/%R%# '
\timing on
\pset null '(null)'
\set HISTSIZE 5000
История команд хранится в ~/.psql_history, листается стрелками вверх-вниз, а поиск по ней - Ctrl+R. На PG 16 и 17 набор метакоманд тот же, но добавились мелочи: например, в psql 16 появилась команда \drg для показа членства в ролях, а вывод \du стал компактнее (атрибут членства вынесли отдельно).

Частые грабли
  • Забыли точку с запятой - psql не отправляет запрос на сервер и молча ждет продолжения, показывая приглашение со скобкой или кавычкой. Кажется, что зависло, а на деле он ждет конца команды.
  • Путаница peer и password: psql без -h идет в сокет (часто peer, без пароля), а psql -h localhost - по TCP (просит пароль). Это не баг, это разные правила в pg_hba.conf.
  • Файл .pgpass с правами шире 0600 тихо игнорируется. Никакой ошибки, просто снова спрашивает пароль.
  • \d без аргумента показывает только объекты текущей схемы из search_path. Таблицу из другой схемы не видно - пишите \dt bookings.* или \dt *.* для всех схем.
  • \dt не показывает индексы, представления и последовательности. Для них свои буквы: \di, \dv, \ds. Буква s в конце (\dtS) добавляет системные объекты.
  • ON_ERROR_STOP по умолчанию выключен: скрипт через \i после ошибки продолжает выполняться дальше. Для миграций ставьте \set ON_ERROR_STOP on, иначе половина скрипта молча применится.
Мини-лаба
  • Подключитесь к своей базе двумя способами: через флаги -U -d и через строку подключения postgresql://. Сравните, у какого варианта спрашивается пароль.
  • Создайте файл ~/.pgpass с одной строкой под свой сервер, выставьте chmod 600 и проверьте, что пароль больше не спрашивается.
  • Запустите psql с флагом -E, выполните \dt и \du, прочитайте сгенерированный SQL к системным каталогам.
  • Выполните любой SELECT на одну строку, включите \x и повторите - сравните плоский и вертикальный вывод.
  • Сохраните пару запросов в файл script.sql, добавьте в начало \timing on и запустите его через \i.
  • Создайте ~/.psqlrc с настройкой \pset null '(null)' и убедитесь, что NULL теперь виден в выводе.
Контрольные вопросы
  • Чем отличается подключение через Unix-сокет от подключения по TCP с -h localhost и почему в одном случае пароль спрашивают, а в другом нет?
  • Какие метакоманды покажут таблицы, индексы, представления и роли, и как заставить их вывести объекты из конкретной схемы?
  • Зачем нужен флаг -E при запуске psql и чему он помогает научиться?
  • Какие требования к файлу .pgpass обязательны, чтобы psql его использовал?
  • Что делает \set ON_ERROR_STOP on и почему это критично при запуске миграций через \i?
  • В каком файле задаются настройки клиента по умолчанию и как через него включить \timing на каждом старте?
👍1 ❤️2 🔥3 😄 🤔1
Аватара пользователя
fottball
Сообщения: 1
Зарегистрирован: 16 май 2026, 04:53

Re: psql детально: метакоманды и работа в консоли

Сообщение fottball »

А почему у меня psql без -h не просит пароль, а с -h localhost сразу требует? одна же машина
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
vasya88
Сообщения: 1
Зарегистрирован: 17 май 2026, 16:24

Re: psql детально: метакоманды и работа в консоли

Сообщение vasya88 »

Совет про -E реально топ. Запустил \dt с ним и наконец понял что там просто селекты к pg_class идут, перестал бояться каталогов
👍1 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Установка и первый запуск: Linux, Windows, Docker
Следующая глава →
Демобаза Авиаперевозки Postgres Pro: структура и развёртывание

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

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

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

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

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