С чего начать Первые шаги трек · 15 ступеней
Linux Labs
К статье

PostgreSQL — доступ, pg_hba.conf, дамп и восстановление

шпаргалка · Ubuntu 24.04 · PostgreSQL 16 https://lab.dimsanych.ru/ru/wiki/postgresql/

Шпаргалка

  • sudo systemctl start postgresql в лабах служба выключена
  • pg_lsclusters версия, порт, статус
  • sudo -u postgres psql консоль суперпользователя
  • psql -h 127.0.0.1 -U appuser -d appdb вход по TCP с паролем
  • sudo -u postgres psql -c 'TABLE pg_hba_file_rules' правила доступа
  • sudo ss -tlnp | grep 5432 на каком адресе слушает
  • sudo -u postgres pg_dump -Fc -f /tmp/appdb.dump appdb
  • sudo -u postgres pg_restore -l /tmp/appdb.dump оглавление

Конфигурация

Два файла в /etc/postgresql/16/main/: postgresql.conf — параметры сервера, pg_hba.conf — кто и как может войти. Какие файлы и значения сервер прочитал на самом деле — SHOW hba_file;, SHOW listen_addresses;.

pg_hba.conf

pg_hba.conf — правила доступа, по строке на правило. В Ubuntu по умолчанию:

text
# TYPE  DATABASE  USER      ADDRESS        METHOD
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
Поле Что значит
TYPE local — через сокет, host — по TCP
DATABASE имя базы или all
USER роль или all
ADDRESS адрес клиента с маской; у local пусто
METHOD как проверять: peer, scram-sha-256, reject

peer пускает пользователя Linux только в роль с тем же именем, поэтому суперпользователь входит как sudo -u postgres psql. scram-sha-256 — пароль. reject — отказ без проверки.

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

Правку применяет sudo systemctl reload postgresql или SELECT pg_reload_conf();. Что сервер прочитал, показывает представление pg_hba_file_rules: номер строки, поля и столбец error. С ошибкой в файле сервер его не принимает и работает по старым правилам, а в журнале — pg_hba.conf was not reloaded.

Адрес и порт

По умолчанию listen_addresses = 'localhost' — только 127.0.0.1 и ::1, порт 5432. Чтобы принимать подключения из сети, нужны три вещи: адрес в listen_addresses ('*' — все), строка host для адреса клиента в pg_hba.conf и открытый порт в файрволе. listen_addresses меняется только через sudo systemctl restart postgresql: после reload параметр помечен pending_restart, а сервер слушает по-старому.

Свою настройку удобно держать отдельным файлом: postgresql.conf читает каталог conf.d рядом с собой (include_dir = 'conf.d'), и обновление пакета такой файл не трогает:

bash
echo "listen_addresses = '127.0.0.1'" \
  | sudo tee /etc/postgresql/16/main/conf.d/listen.conf
sudo systemctl restart postgresql
sudo ss -tlnp | grep 5432

conf.d читается после строки include_dir в конце postgresql.conf, и действует последнее значение. С listen_addresses = '*' в postgresql.conf и '127.0.0.1' в conf.d/listen.conf сервер слушает 127.0.0.1. Откуда взято значение и ждёт ли оно перезапуска, показывает pg_settings:

text
student@ubuntu:~$ sudo -u postgres psql -Atc "SELECT setting,
> sourcefile, sourceline, pending_restart FROM pg_settings
> WHERE name='listen_addresses'"
127.0.0.1|/etc/postgresql/16/main/conf.d/listen.conf|1|f

После правки файла и reload значение прежнее, pending_restart — t, а в журнале /var/log/postgresql/postgresql-16-main.log:

text
LOG:  parameter "listen_addresses" cannot be changed without restarting
  the server
LOG:  configuration file "/etc/postgresql/16/main/conf.d/listen.conf"
  contains errors; unaffected changes were applied

Каждую строку каждого файла с её судьбой показывает pg_file_settings (applied, error — например, setting could not be applied).

Загрузка…