← Весь справочник

Утилиты PostgreSQL: createdb, pg_dump, pg_restore, pg_isready, pg_ctlcluster

Создать базу, снять и восстановить дамп, проверить готовность сервера, запустить и остановить кластер

Вокруг psql есть набор консольных утилит PostgreSQL для типовых операций без SQL: createdb/dropdb — создать и удалить базу, createuser — роль, pg_dump/pg_restore/pg_dumpall — резервные копии, pg_isready — проверка, что сервер принимает подключения. pg_lsclusters и pg_ctlcluster — обёртки Debian/Ubuntu для управления экземплярами («кластерами») сервера.

Синтаксис

createdb [опции подключения] [-O владелец] [-E кодировка] [-T шаблон] имя_базы
dropdb   [опции подключения] [--if-exists] [-f] имя_базы
pg_dump  [опции подключения] [опции] имя_базы
pg_restore [опции подключения] [-d база] [опции] файл
pg_isready [-h хост] [-p порт] [-t сек] [-q]
pg_ctlcluster версия кластер start|stop|restart|reload|status
pg_lsclusters

Подключение (общее для всех)

ОпцияЧто задаётПеременная окружения
-h хостхост или каталог сокета; без него — Unix-сокет /var/run/postgresqlPGHOST
-p портпорт (5432)PGPORT
-U рольот имени какой роли (по умолчанию — имя пользователя ОС)PGUSER
-d базабаза для подключения (у pg_restore — куда восстанавливать)PGDATABASE
-W / -wвсегда спросить пароль / никогда не спрашиватьPGPASSWORD, ~/.pgpass

createdb, dropdb, createuser

Команда и опцияЧто делает
createdb имясоздать базу
-O рольвладелец базы
-E UTF8кодировка; отличная от шаблона требует -T template0 и подходящую локаль: -E LATIN1 -T template0 -l C
-T template0из какого шаблона копировать
-l локаль, --lc-collate, --lc-ctypeлокаль сортировки и классов символов
-eпоказать выполненный SQL
dropdb имяудалить базу; --if-exists — без ошибки, если её нет; -f — оборвать чужие подключения
createuser рольсоздать роль; -d — может создавать базы, -s — суперпользователь, -P — спросить пароль

pg_dump: резервная копия одной базы

ОпцияЧто делает
-f файлкуда писать (без неё — stdout)
-F pформат plain — обычный SQL-скрипт (по умолчанию); восстанавливается через psql
-F ccustom — сжатый архив; восстанавливается через pg_restore, можно выбирать объекты
-F ddirectory — каталог с файлом на таблицу; единственный формат с параллельным -j N
-F ttar-архив
-j Nдампить в N потоков (только -F d)
-Z 0..9степень сжатия
-s / -aтолько схема / только данные
-t шаблон / -T шаблонтолько эти таблицы / кроме этих; повторяются, понимают *
--exclude-table-data=шаблонструктуру взять, данные таблицы — нет (логи, кеш)
-n схема / -N схематолько эта схема / кроме неё
-c + --if-existsдобавить DROP … IF EXISTS перед созданием объектов
-Cдобавить CREATE DATABASE и подключение к ней
-Oне сохранять владельцев (ALTER … OWNER) — для восстановления под другой ролью
-xне сохранять права (GRANT/REVOKE)
--inserts / --column-insertsданные как INSERT (с именами колонок) вместо COPY — медленнее, но переносимо
-vподробный ход работы

pg_dumpall снимает весь сервер; pg_dumpall -g — только глобальные объекты: роли и табличные пространства.

pg_restore: восстановление из custom/directory/tar

ОпцияЧто делает
-d базавосстановить в существующую базу
-C -d postgresсначала создать базу (с исходным именем), подключившись к postgres
-c + --if-existsудалить объекты перед созданием
-lпоказать оглавление архива
-L списоквосстановить только то, что осталось в отредактированном оглавлении
-t таблица, -n схема, -s, -aвыбрать, что восстанавливать
-O, -xбез владельцев, без прав
-j Nпараллельно (custom и directory)
-1всё в одной транзакции: либо всё, либо ничего
-eостановиться на первой ошибке (по умолчанию продолжает)
-f файлне восстанавливать, а сделать SQL-скрипт; -f - — в stdout

pg_isready

ОпцияЧто делает
-h, -pкуда стучаться
-t сексколько ждать (по умолчанию 3; 0 — бесконечно)
-qничего не печатать, только код выхода
КодЗначение
0сервер принимает подключения
1сервер отвечает, но отклоняет подключения (например, ещё запускается)
2ответа нет
3проверка не выполнялась (ошибка в параметрах)

pg_ctlcluster и pg_lsclusters (Debian/Ubuntu)

КомандаЧто делает
pg_lsclustersсписок кластеров: версия, имя, порт, статус (online/down), владелец, каталог данных, лог
pg_ctlcluster 16 main startзапустить; код 2 — уже запущен
pg_ctlcluster 16 main stopостановить (режим fast); -m smart|fast|immediate — другой режим
pg_ctlcluster 16 main restartперезапустить
pg_ctlcluster 16 main reloadперечитать конфиги без остановки
pg_ctlcluster 16 main statusзапущен ли (код 3 — нет)

Конфиги кластера — в /etc/postgresql/16/main/, данные — в /var/lib/postgresql/16/main, журнал — в /var/log/postgresql/postgresql-16-main.log.

Примеры

# все утилиты — от имени системного пользователя postgres (вход по сокету без пароля)
sudo -u postgres createdb -O app shop          # или: su postgres -c 'createdb shop'

# сервер поднят? — подходит для ожидания в скриптах
until pg_isready -q; do sleep 1; done

# запустить кластер без systemd и посмотреть статус
pg_ctlcluster 16 main start
pg_lsclusters

# дамп в SQL и восстановление через psql с остановкой на первой ошибке
sudo -u postgres pg_dump shop > shop.sql
sudo -u postgres createdb shop_copy
sudo -u postgres psql -v ON_ERROR_STOP=1 -q -d shop_copy -f shop.sql

# дамп в custom-формате и восстановление в новую базу
sudo -u postgres pg_dump -Fc -f shop.dump shop
sudo -u postgres createdb shop_copy2
sudo -u postgres pg_restore -d shop_copy2 shop.dump

# что внутри архива
pg_restore -l shop.dump

# восстановить поверх существующих объектов
sudo -u postgres pg_restore -c --if-exists -d shop_copy2 shop.dump

# только одна таблица, только данные, в виде INSERT
sudo -u postgres pg_dump -t items -a --inserts shop

# только структура всей базы
sudo -u postgres pg_dump -s shop > schema.sql

# параллельный дамп большой базы
sudo -u postgres pg_dump -Fd -j 4 -f shop_dir shop

# роли отдельно — pg_dump их не сохраняет
sudo -u postgres pg_dumpall -g > roles.sql

# сжатый дамп «на лету»
sudo -u postgres pg_dump shop | gzip > shop.sql.gz

Подводные камни

  • role "root" does not exist. Утилиты подключаются под ролью с именем текущего пользователя ОС. Запускай от postgres (sudo -u postgres …, su postgres -c '…') или указывай -U.
  • -h 127.0.0.1 — это уже не сокет. По TCP обычно требуется пароль (fe_sendauth: no password supplied), даже если без -h всё работало: правила pg_hba.conf для сокета и TCP разные.
  • psql < dump.sql не останавливается на ошибках и возвращает 0, даже если половина команд упала (relation … already exists). Добавляй -v ON_ERROR_STOP=1 — тогда код будет 3.
  • pg_restore тоже не останавливается: по умолчанию пропускает ошибки, в конце пишет errors ignored on restore: N и возвращает 1. Нужен «всё или ничего» — -1 или -e.
  • Формат определяет инструмент. Plain-дамп pg_restore не возьмёт (input file appears to be a text format dump. Please use psql), а custom-архив бесполезно кормить psql.
  • pg_restore -d в несуществующую базу падает. Сначала createdb, или -C -d postgres — но тогда база создастся с исходным именем из дампа, а не с тем, что передано в -d.
  • -j у pg_dump работает только с -F d (parallel backup only supported by the directory format).
  • pg_dump не сохраняет роли и права на уровне сервера. На новом сервере сначала восстанови pg_dumpall -g, иначе ALTER … OWNER TO app упадёт. Либо снимай дамп с -O -x.
  • pg_isready не проверяет логин и базу. Он вернёт 0 для несуществующей базы и роли — это только «сервер слушает».
  • systemctl в контейнере без systemd не работает. Используй pg_ctlcluster или service postgresql start.

См. также

psql · sqlite3 · redis-cli · gzip · sudo · cron