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 по умолчанию:
| Поле | Что значит |
|---|---|
| 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'), и обновление
пакета такой файл не трогает:
conf.d читается после строки include_dir в конце postgresql.conf, и
действует последнее значение. С listen_addresses = '*' в
postgresql.conf и '127.0.0.1' в conf.d/listen.conf сервер слушает
127.0.0.1. Откуда взято значение и ждёт ли оно перезапуска, показывает
pg_settings:
После правки файла и reload значение прежнее, pending_restart — t, а
в журнале /var/log/postgresql/postgresql-16-main.log:
Каждую строку каждого файла с её судьбой показывает pg_file_settings
(applied, error — например, setting could not be applied).