# Занятие 01: Обзор базового инструментария / Установка и управление, psql

> Исходная страница в нативном Markdown: Обзор базового инструментария / Установка и управление, psql

---

Индекс LLMS: [llms.txt](/ru/llms.txt)

---

<!-- Generated by scripts/generate_skeleton.py. -->

> [!NOTE]
> Эта страница извлечена из официального PDF в нативный Markdown. Текст слайдов, код и комментарии сохранены в порядке чтения; исходные PDF и HTML остаются эталоном макета.
> **HTML source:** [dev1_01_tools_overview.html](https://edu.postgrespro.ru/16/dev1-16/dev1_01_tools_overview.html)
> **Archive:** [DEV1-handouts-16.zip](https://edu.postgrespro.ru/16/DEV1-handouts-16.zip)
> **Страниц PDF:** 20

## Page 1: Обзор базового инструментария / Установка и управление, psql {#source-page-001}

### Авторские права

© Postgres Professional, 2017–2024 Авторы: Егор Рогов, Павел Лузанов, Илья Баштанов, Игорь Гнатюк Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
### Использование материалов курса

Некоммерческое использование материалов курса (презентации, демонстрации) разрешается без ограничений. Коммерческое использование возможно только с письменного разрешения компании Postgres Professional. Запрещается внесение изменений в материалы курса.
### Обратная связь

Отзывы, замечания и предложения направляйте по адресу: edu@postgrespro.ru
### Отказ от ответственности

Компания Postgres Professional не несет никакой ответственности за любые повреждения и убытки, включая потерю дохода, нанесенные прямым или непрямым, специальным или случайным использованием материалов курса. Компания Postgres Professional не предоставляет каких-либо гарантий на материалы курса. Материалы курса предоставляются на основе принципа «как есть» и компания Postgres Professional не обязана предоставлять сопровождение, поддержку, обновления, расширения и изменения.

## Page 2: Темы {#source-page-002}

- Варианты установки PostgreSQL
- Управление сервером
- Журнал сообщений сервера
- Настройка параметров конфигурации
- Использование psql

## Page 3: Кластер БД, сервер, клиент {#source-page-003}

![Source slide page 3: Кластер БД, сервер, клиент](images/page-003.png){#source-figure-003 caption="Source slide page 3: Кластер БД, сервер, клиент"}

  - клиент

### Комментарии преподавателя

Начнем с основных понятий.

PostgreSQL — программа, которая относится к классу систем управления базами данных.

Когда эта программа выполняется, мы называем ее сервером PostgreSQL или экземпляром сервера. Пока сервер представляется для нас «черным ящиком», но постепенно мы познакомимся с тем, как он устроен.

Данные, которыми управляет PostgreSQL, хранятся в базах данных. Один экземпляр PostgreSQL одновременно работает с несколькими базами данных. Этот набор баз данных называется кластером баз данных. Подробнее мы будем говорить о базах данных в теме «Организация данных. Логическая структура».

С сервером взаимодействуют клиенты — внешние приложения, которые могут подключаться к одной из баз сервера и посылать запросы для выполнения.

Итак: кластер баз данных — это данные в файлах; сервер или экземпляр сервера — программа, управляющая кластером баз данных, а клиент — программа, позволяющая «общаться» с сервером.

## Page 4: Установка {#source-page-004}

**Варианты**
  - готовые пакеты (предпочтительный способ)
  - установка из исходных кодов
  - без установки — облачные сервисы
- Расширения
  - дополнительный функционал
  - устанавливаются отдельно
  - в поставке с сервером — модули и программы (~50 штук)

### Комментарии преподавателя

Предпочтительный вариант установки PostgreSQL — использование пакетных менеджеров (таких, как apt или rpm) и готовых пакетов. В этом случае получается понятная, поддерживаемая и легко обновляемая установка. Пакеты существуют для большинства операционных систем.

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

Готовые пакеты и исходные коды: <http://www.postgresql.org/download/>

Кроме того, можно использовать готовые облачные решения, что позволяет обойтись вообще без установки. Такую возможность дают многие ведущие зарубежные (Amazon RDS, Google Cloud SQL, Microsoft Azure) и отечественные (Yandex Cloud, Облако Mail.ru) платформы.

В курсе мы будем использовать виртуальную машину с ОС Xubuntu и сервер PostgreSQL 16, установленный из пакета для этой ОС. В этом случае сразу настраивается автоматический запуск и останов сервера PostgreSQL при запуске и останове операционной системы.

Для PostgreSQL существует большое количество расширений, которые подключают новый функционал к СУБД «на лету», без изменения ядра системы. В состав дистрибутива входит 50 расширений.

<https://postgrespro.ru/docs/postgresql/16/contrib>

<https://postgrespro.ru/docs/postgresql/16/contrib-prog>

Список доступных расширений и статус их установки можно посмотреть в представлении pg\_available\_extensions.

## Page 5: Управление сервером {#source-page-005}

**Утилита для управления**
  - pg\_ctlcluster
  - pg\_ctl
- Основные задачи
  - запуск сервера
  - останов сервера
  - обновление параметров конфигурации

### Комментарии преподавателя

К основным операциям управления сервером относятся начальная инициализация кластера баз данных, запуск и останов сервера, обновление конфигурации и некоторые другие. Для выполнения этих действий предназначена утилита pg\_ctl, входящая в состав PostgreSQL.

В пакетном дистрибутиве для Ubuntu доступ к утилите pg\_ctl осуществляется не напрямую, а через специальную обертку pg\_ctlcluster. Справку по использованию pg\_ctlcluster можно получить командой:

$ man pg\_ctlcluster

Также можно получить информацию об установленных кластерах и их текущем состоянии при помощи команд:

$ pg\_lsclusters

$ pg\_ctlcluster status

Более подробная информация об управлении сервером для администраторов баз данных:

<https://postgrespro.ru/docs/postgresql/16/app-pg-ctl>

<https://postgrespro.ru/docs/postgresql/16/runtime>

## Page 6: Установка и управление {#source-page-006}

В виртуальной машине курса установка выполнена из пакета. Каталог установки PostgreSQL:
```sh
student$ ls -l /usr/lib/postgresql/16
```
```text
total 8
drwxr-xr-x 2 root root 4096 ноя 25 17:25 bin
drwxr-xr-x 4 root root 4096 ноя 25 18:28 lib
```
Владелец ПО сервера — пользователь root.
Кластер баз данных автоматически инициализируется при установке из пакета и находится в каталоге /var/lib/postgresql/16/main.
В последующих темах мы будем ссылаться на этот каталог как PGDATA, по имени переменной ОС, которую можно установить для использования в некоторых утилитах сервера.
Владельцем каталога является пользователь postgres. Вот содержимое каталога:
```sh
student$ sudo ls -l /var/lib/postgresql/16/main
```
```text
total 96
drwx------ 1 postgres postgres 4096 апр 10 15:33 base
drwx------ 1 postgres postgres 4096 апр 10 15:33 global
drwx------ 2 postgres postgres 4096 ноя 25 18:28 pg_commit_ts
drwx------ 2 postgres postgres 4096 ноя 25 18:28 pg_dynshmem
drwx------ 4 postgres postgres 4096 ноя 25 18:29 pg_logical
drwx------ 4 postgres postgres 4096 ноя 25 18:28 pg_multixact
drwx------ 2 postgres postgres 4096 ноя 25 18:28 pg_notify
drwx------ 2 postgres postgres 4096 ноя 25 18:28 pg_replslot
drwx------ 2 postgres postgres 4096 ноя 25 18:28 pg_serial
drwx------ 2 postgres postgres 4096 ноя 25 18:28 pg_snapshots
drwx------ 1 postgres postgres 4096 апр 10 15:33 pg_stat
drwx------ 2 postgres postgres 4096 ноя 25 18:28 pg_stat_tmp
drwx------ 2 postgres postgres 4096 ноя 25 18:28 pg_subtrans
drwx------ 2 postgres postgres 4096 ноя 25 18:28 pg_tblspc
drwx------ 2 postgres postgres 4096 ноя 25 18:28 pg_twophase
-rw------- 1 postgres postgres    3 ноя 25 18:28 PG_VERSION
drwx------ 1 postgres postgres 4096 ноя 25 18:28 pg_wal
drwx------ 2 postgres postgres 4096 ноя 25 18:28 pg_xact
-rw------- 1 postgres postgres   88 ноя 25 18:28 postgresql.auto.conf
-rw------- 1 postgres postgres  130 апр 10 15:33 postmaster.opts
-rw------- 1 postgres postgres  109 апр 10 15:33 postmaster.pid
```
При установке из пакета в настройки запуска ОС добавляется автоматический запуск PostgreSQL. Поэтому после загрузки операционной системы отдельно стартовать PostgreSQL не нужно.
Можно явным образом управлять сервером с помощью следующих команд, которые выдаются от имени привилегированного пользователя ОС через sudo:
Остановить сервер:
```sh
student$ sudo pg_ctlcluster 16 main stop
```
Запустить сервер:
```sh
student$ sudo pg_ctlcluster 16 main start
```
Перезапустить:
```sh
student$ sudo pg_ctlcluster 16 main restart
```
Обновить конфигурацию:
```sh
student$ sudo pg_ctlcluster 16 main reload
```
Получить информацию о сервере:
```sh
student$ sudo pg_ctlcluster 16 main status
```
```text
pg_ctl: server is running (PID: 88989)
/usr/lib/postgresql/16/bin/postgres "-D" "/var/lib/postgresql/16/main" "-c"
"config_file=/etc/postgresql/16/main/postgresql.conf"
```
Список установленных экземпляров (можно без sudo):
```sh
student$ pg_lsclusters
```

## Page 7: Page 7 {#source-page-007}

```text
Ver Cluster Port Status Owner    Data directory              Log file
16  main    5432 online postgres /var/lib/postgresql/16/main
/var/log/postgresql/postgresql-16-main.log
```

## Page 8: Журнал сообщений {#source-page-008}

**В журнал записываются**
  - служебные сообщения сервера
  - сообщения пользовательских сеансов
  - сообщения приложений
- Настройка журнала
  - расположение
  - формат записей
  - какие события регистрировать

### Комментарии преподавателя

Информация о ходе работы СУБД записывается в журнал сообщений сервера. Сюда попадают сведения о запуске и останове сервера, различная служебная информация, в том числе сообщения о возникающих проблемах.

Также сюда могут выводиться сообщения о выполняющихся командах и времени их работы, о возникающих блокировках и тому подобное. Это позволяет выполнять трассировку пользовательских сеансов.

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

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

Например, вывод в форматах csv и json удобен для автоматизации анализа журнала.

<https://postgrespro.ru/docs/postgresql/16/runtime-config-logging>

## Page 9: Журнал сообщений сервера {#source-page-009}

Журнал сообщений сервера находится здесь:
```sh
student$ ls -l /var/log/postgresql/postgresql-16-main.log
```
```text
-rw-r----- 1 postgres adm 51181 апр 10 15:33 /var/log/postgresql/postgresql-16-main.log
```
Заглянем в конец журнала:
```sh
student$ tail -n 10 /var/log/postgresql/postgresql-16-main.log
```
```text
2026-04-10 15:33:20.897 MSK [82414] LOG:  background worker "logical replication
launcher" (PID 82420) exited with exit code 1
2026-04-10 15:33:20.898 MSK [82415] LOG:  shutting down
2026-04-10 15:33:20.912 MSK [82415] LOG:  checkpoint starting: shutdown immediate
2026-04-10 15:33:20.926 MSK [82415] LOG:  checkpoint complete: wrote 0 buffers (0.0%); 0
WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.029 s;
sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=3504 kB;
lsn=0/1D95E50, redo lsn=0/1D95E50
2026-04-10 15:33:20.937 MSK [82414] LOG:  database system is shut down
2026-04-10 15:33:21.808 MSK [88989] LOG:  starting PostgreSQL 16.11 (Ubuntu
16.11-1.pgdg24.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu
13.3.0-6ubuntu2~24.04) 13.3.0, 64-bit
2026-04-10 15:33:21.808 MSK [88989] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2026-04-10 15:33:21.824 MSK [88989] LOG:  listening on Unix socket
"/var/run/postgresql/.s.PGSQL.5432"
2026-04-10 15:33:21.843 MSK [88992] LOG:  database system was shut down at 2025-11-25
18:29:40 MSK
2026-04-10 15:33:21.872 MSK [88989] LOG:  database system is ready to accept connections
```

## Page 10: Параметры конфигурации {#source-page-010}

**Для всего экземпляра**
  - основной файл параметров — postgresql.conf
```sql
ALTER SYSTEM — postgresql.auto.conf
```
- Для текущего сеанса
```text
SET/RESET
set_config()
```
- Просмотр текущего значения
```text
SHOW
current_setting()
pg_settings
\dconfig
```

### Комментарии преподавателя

Сервер PostgreSQL настраивается с помощью разнообразных параметров конфигурации, которые позволяют управлять ресурсами, настраивать служебные процессы и пользовательские сеансы, управлять журналом сервера и решать многие другие задачи. Поэтому нужно знать, как проверить текущие значения параметров и установить новые.

Настройки всего сервера обычно задаются в конфигурационных файлах. Основной конфигурационный файл — postgresql.conf, он редактируется вручную. Второй конфигурационный файл — postgresql.auto.conf — предназначен для изменения специальной командой ALTER SYSTEM. Параметры, установленные через ALTER SYSTEM, имеют приоритет над параметрами в postgresql.conf.

Директивы включения файлов и каталогов include и include\_dir позволяют разделять сложные файлы postgresql.conf на части. Это может быть удобно, например, при управлении несколькими серверами с похожими конфигурациями.

Большинство параметров конфигурации допускает изменение значений в пользовательских сеансах прямо во время выполнения. Помимо системных, можно определять и пользовательские параметры и работать с ними с помощью этих же команд и функций.

Варианты установки и управления параметрами: <https://postgrespro.ru/docs/postgresql/16/config-setting> Текущие значения параметров доступны в представлении pg\_settings: <https://postgrespro.ru/docs/postgresql/16/view-pg-settings>

## Page 11: Параметры конфигурации {#source-page-011}

Основной файл конфигурации postgresql.conf расположен в этом каталоге:
```sh
student$ ls -l /etc/postgresql/16/main
```
```text
total 60
drwxr-xr-x 2 postgres postgres  4096 ноя 25 18:28 conf.d
-rw-r--r-- 1 postgres postgres   315 ноя 25 18:28 environment
-rw-r--r-- 1 postgres postgres   143 ноя 25 18:28 pg_ctl.conf
-rw-r----- 1 postgres postgres  5743 ноя 25 18:28 pg_hba.conf
-rw-r----- 1 postgres postgres  2640 ноя 25 18:28 pg_ident.conf
-rw-r--r-- 1 postgres postgres 29960 ноя 25 18:28 postgresql.conf
-rw-r--r-- 1 postgres postgres   317 ноя 25 18:28 start.conf
```
Здесь же находятся и другие конфигурационные файлы.
Проверим значение параметра work\_mem:
```text
=> SHOW work_mem;
```
```text
 work_mem
----------
 4MB
(1 row)
```
Параметр work\_mem задает объем памяти, который будет использоваться для внутренних операций сортировки и размещения хеш-таблиц, прежде чем будут задействованы временные файлы на диске.
4MB — это значение по умолчанию и оно слишком мало. Допустим, мы хотим увеличить его до 16MB для всего экземпляра. Для этого есть различные пути.
Во-первых, можно внести изменение в postgresql.conf, раскомментировав и изменив строку, где определяется параметр:
```sh
student$ grep '#work_mem' /etc/postgresql/16/main/postgresql.conf
```
```text
#work_mem = 4MB
# min 64kB
```
Во-вторых, можно поместить определение параметра в файл с суффиксом .conf в каталоге /etc/postgresql/16/main/conf.d или в пользовательский файл конфигурации, местоположение которого следует задать в директиве include основного конфигурационного файла postgresql.conf.
В-третьих, можно изменить значение параметра с помощью команды SQL — что мы и сделаем:
```sql
=> ALTER SYSTEM SET work_mem TO '16MB';
```
```sql
ALTER SYSTEM
```
Такое изменение попадает не в postgresql.conf, а в файл postgresql.auto.conf, который находится в каталоге PGDATA:
```sh
student$ sudo cat /var/lib/postgresql/16/main/postgresql.auto.conf
```
```sql
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
work_mem = '16MB'
```
Чтобы изменение вступило в силу, нужно перечитать конфигурационные файлы. Для этого можно воспользоваться pg\_ctlcluster, либо использовать функцию SQL:
```sql
=> SELECT pg_reload_conf();
```
```text
 pg_reload_conf
----------------
 t
(1 row)
```
Убедимся, что новое значение параметра применилось. Кроме команды SHOW, можно сделать это таким образом:
```sql
=> SELECT current_setting('work_mem');
```
```text
 current_setting
-----------------
 16MB
(1 row)
```
Чтобы восстановить значение параметра по умолчанию, достаточно вместо SET использовать команду RESET (и, конечно, перечитать конфигурационные файлы):

## Page 12: Page 12 {#source-page-012}

```sql
=> ALTER SYSTEM RESET work_mem;
```
```sql
ALTER SYSTEM
```
```sql
=> SELECT pg_reload_conf();
```
```text
 pg_reload_conf
----------------
 t
(1 row)
```
Большинству параметров можно установить новое значение для текущего сеанса прямо во время его выполнения. Например, если мы собираемся выполнить запрос, сортирующий большой объем данных, то для сеанса можно увеличить значение work\_mem:
```text
=> SET work_mem = '64MB';
```
```text
SET
```
Новое значение действует только в текущем сеансе или даже в текущей транзакции (при указании SET LOCAL).
Еще один способ проверить текущее значение — выполнить запрос к представлению:
```sql
=> SELECT name, setting, unit FROM pg_settings WHERE name = 'work_mem';
```
```text
   name   | setting | unit
----------+---------+------
 work_mem | 65536   | kB
(1 row)
```
Можно увидеть значение параметра и с помощью команды \\dconfig:
```text
=> \dconfig work_mem
```
```text
List of configuration parameters
 Parameter | Value
-----------+-------
 work_mem  | 64MB
(1 row)
```

## Page 13: Клиент psql {#source-page-013}

**Терминальный клиент для работы с PostgreSQL**
- Поставляется вместе с СУБД
- Используется администраторами и разработчиками для интерактивной работы и выполнения скриптов

### Комментарии преподавателя

Для работы с СУБД PostgreSQL существуют различные сторонние инструменты, рассмотрение которых не входит в рамки курса.

В курсе мы будем использовать терминальный клиент psql:

1. psql — это единственный клиент, поставляемый вместе с СУБД.

2. Навыки работы c psql пригодятся разработчикам и администраторам вне зависимости от того, с каким инструментом они будут работать.

Для интерактивной работы в psql встроена поддержка readline, программ постраничного просмотра результатов запросов (таких, как less и pspg), а также подключения внешних редакторов. Возможности psql позволяют взаимодействовать с ОС, просматривать содержимое системного каталога, создавать скрипты для автоматизации повторяющихся задач.

<https://postgrespro.ru/docs/postgresql/16/app-psql>

## Page 14: Подключение {#source-page-014}

При запуске psql нужно указать параметры подключения. К обязательным параметрам относятся:
имя базы данных, по умолчанию совпадает с именем пользователя; имя пользователя (роль), по умолчанию совпадает с именем пользователя ОС; узел (host), по умолчанию — локальное соединение; порт, по умолчанию — обычно 5432.
Параметры указываются так:
```sh
student$ psql -d база -U роль -h узел -p порт
```
Настройки, сделанные в виртуальной машине курса, позволяют подключаться к PostgreSQL без указания параметров:
```sh
student$ psql
```
Проверим текущее подключение:
```sql
=> \conninfo
```
```text
You are connected to database "student" as user "student" via socket in
"/var/run/postgresql" at port "5432".
```
Команда \\connect выполняет новое подключение, не покидая psql. Ее можно сократить до \\c. Мы будем указывать необязательную часть имени команды в квадратных скобках: \\c&#91;onnect&#93;.
### Справочная информация
Справку по psql можно получить не только в документации, но и прямо в системе. Команда
```sh
student$ psql --help
```
выдает справку по запуску. А если PostgreSQL устанавливался с документацией, то справочное руководство можно получить командой
```sh
student$ man psql
```
Утилита psql умеет выполнять команды SQL и свои собственные команды, которые начинаются с обратной косой черты, как \\conninfo. Команды psql всегда однострочные — в отличие от команд SQL.
Внутри psql есть возможность получить список и краткое описание его собственных команд:
\\? выдает список команд psql, \\h&#91;elp&#93; выдает список команд SQL, которые поддерживает сервер, а также синтаксис конкретной команды SQL.
### Форматирование вывода
Клиент psql умеет выводить результаты запросов в разных форматах:
формат с выравниванием значений; формат без выравнивания; расширенный формат.
Формат с выравниванием используется по умолчанию:
```sql
=> SELECT name, setting, unit FROM pg_settings LIMIT 7;
```
```text
            name            |  setting   | unit
----------------------------+------------+------
 allow_in_place_tablespaces | off        |
 allow_system_table_mods    | off        |
 application_name           | psql       |
 archive_cleanup_command    |            |
 archive_command            | (disabled) |
 archive_library            |            |
 archive_mode               | off        |
(7 rows)
```
Ширина столбцов выровнена по значениям. Также выводится строка заголовков и итоговая строка.
Команды psql для переключения режима выравнивания:
\\a — переключатель режима: с выравниванием/без выравнивания. \\t — переключатель отображения строки заголовка и итоговой строки.
Отключим выравнивание, заголовок и итоговую строку:
```text
=> \a \t
```
```text
Output format is unaligned.
Tuples only is on.
```
```sql
=> SELECT name, setting, unit FROM pg_settings LIMIT 7;
```
```text
allow_in_place_tablespaces|off|
allow_system_table_mods|off|
application_name|psql|
archive_cleanup_command||
archive_command|(disabled)|
archive_library||
archive_mode|off|
```

## Page 15: Page 15 {#source-page-015}

```text
=> \a \t
```
```text
Output format is aligned.
Tuples only is off.
```
Такой формат неудобен для просмотра, но может оказаться полезным для автоматической обработки результатов.
Расширенный формат удобен, когда нужно вывести много столбцов для одной или нескольких записей. Для этого вместо точки с запятой указываем в конце команды \\gx:
```sql
=> SELECT name, setting, unit, category, context, vartype,
    min_val, max_val, boot_val, reset_val
    FROM pg_settings
    WHERE name = 'work_mem' \gx
```
```text
-[ RECORD 1 ]----------------------
name      | work_mem
setting   | 4096
unit      | kB
category  | Resource Usage / Memory
context   | user
vartype   | integer
min_val   | 64
max_val   | 2147483647
boot_val  | 4096
reset_val | 4096
```
Если расширенный формат нужен не для одной команды, а постоянно, можно включить его переключателем \\x. Все возможности форматирования результатов запросов доступны через команду \\pset.
### Взаимодействие с ОС и выполнение скриптов
Из psql можно выполнять команды shell:
```text
=> \! pwd
```
```text
/home/student
```
С помощью запроса SQL можно сформировать несколько других запросов SQL и записать их в файл, используя команду \\o&#91;ut&#93;:
```text
=> \a \t \pset fieldsep ''
```
```text
Output format is unaligned.
Tuples only is on.
Field separator is "".
```
```text
=> \o dev1_tools.sql
```
```sql
=> SELECT format('SELECT %L AS tbl, count(*) FROM %I;', tablename, tablename)
FROM pg_tables LIMIT 3;
```
На экран (в стандартный вывод) ничего не попало. Посмотрим в файле:
```text
=> \! cat dev1_tools.sql
```
```sql
SELECT 'pg_statistic' AS tbl, count(*) FROM pg_statistic;
SELECT 'pg_type' AS tbl, count(*) FROM pg_type;
SELECT 'pg_foreign_table' AS tbl, count(*) FROM pg_foreign_table;
```
Вернем вывод на экран и восстановим форматирование по умолчанию.
```text
=> \o \t \a
```
```text
Tuples only is off.
Output format is aligned.
```
Выполним теперь эти команды из файла с помощью \\i&#91;nclude&#93;:
```text
=> \i dev1_tools.sql
```
```text
     tbl      | count
--------------+-------
 pg_statistic |   409
(1 row)
```
```text
   tbl   | count
---------+-------
 pg_type |   613
(1 row)
```
```text
       tbl        | count
------------------+-------
 pg_foreign_table |     0
(1 row)
```
Есть и другие способы выполнить команды, в том числе из файлов. После выполнения команд сеанс psql будет завершен:
psql < имя\_файла psql -f имя\_файла psql -c 'команда' (работает только для одной команды)
### Переменные psql
По аналогии с shell, psql имеет собственные переменные.
Установим переменную:

## Page 16: Page 16 {#source-page-016}

```text
=> \set TEST Hi!
```
Чтобы подставить значение переменной, надо предварить ее имя двоеточием:
```text
=> \echo :TEST
```
```text
Hi!
```
Значение переменной можно сбросить:
```text
=> \unset TEST
```
```text
=> \echo :TEST
```
```text
:TEST
```
Переменные можно использовать, например, для хранения текста часто используемых запросов. Вот запрос на получение списка пяти самых больших по размеру таблиц:
```sql
=> \set top5 'SELECT tablename, pg_total_relation_size(schemaname||''.''||tablename) AS bytes FROM pg_tables ORDER BY bytes DESC LIMIT 5;'
```
Для выполнения запроса достаточно набрать:
```text
=> :top5
```
```text
   tablename    |  bytes
----------------+---------
 pg_proc        | 1245184
 pg_rewrite     |  745472
 pg_attribute   |  720896
 pg_description |  630784
 pg_statistic   |  294912
(5 rows)
```
Присвоение значения переменной top5 удобно записать в стартовый файл .psqlrc в домашнем каталоге пользователя. Команды из .psqlrc будут автоматически выполняться каждый раз при старте psql.
Без параметров \\set выдает значения всех переменных, включая встроенные. Справку по встроенным переменным можно получить так:
```text
\? variables
```
Выйти из psql можно с помощью команд \\q&#91;uit&#93;, quit, exit или нажав Ctrl+D:
```sql
=> \q
```

## Page 17: Итоги {#source-page-017}

**Установка PostgreSQL из готовых пакетов — предпочтительный способ установки**
- Пакетные дистрибутивы учитывают особенности ОС, которые нужно знать
  - как запускать и останавливать сервер
  - расположение файлов конфигурации
  - расположение журнала сервера
- psql — клиент для работы с PostgreSQL

## Page 18: Практика {#source-page-018}

1. Установите для всех сеансов значение параметра work\_mem равным 8 Мбайт. Обновите конфигурацию и проверьте, что изменения вступили в силу. Восстановите значение по умолчанию. 2. Запишите в файл ddl.sql команду CREATE TABLE на создание любой таблицы. Запишите в файл populate.sql команды на вставку строк в эту таблицу. Выполните оба скрипта и проверьте, что таблица создалась и в ней появились записи. 3. Найдите в журнале сервера строки за сегодняшний день.

### Комментарии преподавателя

Для запуска psql в окне терминала наберите psql без параметров:

```text
student:~$ psql
```

Для выполнения заданий каждой темы удобно создавать отдельную базу данных:

```sql
student/student=# CREATE DATABASE tools_overview;
```

```sql
CREATE DATABASE
```

```sql
student/student=# \c tools_overview
You are now connected to database "tools_overview" as user
"student".
student/tools_overview=#
```

1. Воспользуйтесь командой ALTER SYSTEM.

2. Если результат запроса не помещается в окно терминала, psql передает его утилите less для постраничной выдачи. Чтобы вернуться в режим ввода команд, нажмите клавишу q.

## Page 19: 1. Параметры конфигурации {#source-page-019}

Подключаемся к базе данных:
```sh
student$ psql
```
Задаем значение параметра:
```sql
=> ALTER SYSTEM SET work_mem = '8MB';
```
```sql
ALTER SYSTEM
```
Обновляем конфигурацию:
```sql
=> SELECT pg_reload_conf();
```
```text
 pg_reload_conf
----------------
 t
(1 row)
```
Проверяем значение параметра:
```text
=> \dconfig work_mem
```
```text
List of configuration parameters
 Parameter | Value
-----------+-------
 work_mem  | 8MB
(1 row)
```
Вернем значение по умолчанию:
```sql
=> ALTER SYSTEM RESET work_mem;
```
```sql
ALTER SYSTEM
```
Применяем изменения:
```sql
=> SELECT pg_reload_conf();
```
```text
 pg_reload_conf
----------------
 t
(1 row)
```
### 2. Выполнение скриптов в psql
Запишем в файл ddl.sql команду на создание таблицы с ключевыми словами PostgreSQL (для этого можно использовать и любой текстовый редактор):
```sh
student$ cat > ~/ddl.sql <<EOF
CREATE TABLE keywords (
    word text,
    category text,
    description text
);
EOF
```
Запишем команды для заполнения таблицы keywords в файл populate.sql:
```sh
student$ cat > ~/populate.sql <<EOF
INSERT INTO keywords
    SELECT word, catcode, catdesc FROM pg_get_keywords();
EOF
```
Создаем базу данных и подключаемся к ней:
```sql
=> CREATE DATABASE tools_overview;
```
```sql
CREATE DATABASE
```
```sql
=> \c tools_overview
```
```text
You are now connected to database "tools_overview" as user "student".
```
Выполняем скрипты и проверяем записи в таблице:

## Page 20: Page 20 {#source-page-020}

```text
=> \i ddl.sql
```
```sql
CREATE TABLE
```
```text
=> \i populate.sql
```
```sql
INSERT 0 471
```
```sql
=> SELECT * FROM keywords LIMIT 10;
```
```text
   word    | category | description
-----------+----------+-------------
 abort     | U        | unreserved
 absent    | U        | unreserved
 absolute  | U        | unreserved
 access    | U        | unreserved
 action    | U        | unreserved
 add       | U        | unreserved
 admin     | U        | unreserved
 after     | U        | unreserved
 aggregate | U        | unreserved
 all       | R        | reserved
(10 rows)
```
### 3. Просмотр журнала
Журнал можно открыть любым текстовым редактором. Каждая запись в журнале начинается с даты, содержит номер серверного процесса (таковы настройки журнала после установки из пакета) и может состоять из нескольких строк. Последние записи будут в конце файла.
```sh
student$ tail /var/log/postgresql/postgresql-16-main.log
```
```sql
2026-04-10 15:42:47.674 MSK [131116] LOG:  database system is shut down
2026-04-10 15:42:48.608 MSK [133485] LOG:  starting PostgreSQL 16.11 (Ubuntu
16.11-1.pgdg24.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu
13.3.0-6ubuntu2~24.04) 13.3.0, 64-bit
2026-04-10 15:42:48.608 MSK [133485] LOG:  listening on IPv4 address "127.0.0.1", port
5432
2026-04-10 15:42:48.632 MSK [133485] LOG:  listening on Unix socket
"/var/run/postgresql/.s.PGSQL.5432"
2026-04-10 15:42:48.649 MSK [133488] LOG:  database system was shut down at 2025-11-25
18:29:40 MSK
2026-04-10 15:42:48.675 MSK [133485] LOG:  database system is ready to accept connections
2026-04-10 15:42:51.592 MSK [133485] LOG:  received SIGHUP, reloading configuration files
2026-04-10 15:42:51.594 MSK [133485] LOG:  parameter "work_mem" changed to "8MB"
2026-04-10 15:42:52.216 MSK [133485] LOG:  received SIGHUP, reloading configuration files
2026-04-10 15:42:52.217 MSK [133485] LOG:  parameter "work_mem" removed from
configuration file, reset to default
```
Созданную нами базу можно удалить, предварительно отключившись от нее (подробности будут в модуле «Организация данных»)
```sql
=> \c postgres
```
```text
You are now connected to database "postgres" as user "student".
```
```sql
=> DROP DATABASE tools_overview;
```
```sql
DROP DATABASE
```
