EMZETT.
Войти

pg_dump и psql

Коротко: Два официальных инструмента командной строки PostgreSQL — pg_dump экспортирует данные/структуру базы данных в файл, psql загружает файлы SQL (в том числе такие экспорты) обратно в базу данных.

Подробнее: Важно: установленная версия pg_dump должна быть не ниже версии сервера, иначе экспорт не удастся. Новые версии добавляют в начало/конец файла экспорта команды безопасности \restrict/\unrestrict — это чистый синтаксис psql, а не SQL, поэтому он не работает, если вставить содержимое в чистый веб-редактор SQL (понимающий только SQL).

Подробности

pg_dump может экспортировать по-разному, в зависимости от того, что вы потом хотите сделать с результатом:

pg_dump --table=challenges --data-only "$SOURCE_DB_URL" > challenges.sql
pg_dump --format=custom "$SOURCE_DB_URL" > backup.dump
psql "$TARGET_DB_URL" < challenges.sql

--schema-only экспортирует только структуру таблиц (CREATE TABLE, индексы, ограничения) без данных, --data-only — только данные (полезно, если целевая схема уже существует, например потому, что Drizzle уже создал её миграцией — двойное создание через CREATE TABLE иначе провалилось бы). Частая ловушка с облачными базами данных вроде Neon: по умолчанию экспорт содержит и сведения о ролях/владельцах (ALTER TABLE ... OWNER TO ...), что может не сработать при импорте в другую базу данных с иными именами ролей — --no-owner и --no-privileges избегают этого.

psql как интерактивная консоль

Помимо простой «загрузки файла SQL», psql — полноценная интерактивная консоль со своими метакомандами (они начинаются с \ и НЕ являются SQL):

psql "$DATABASE_URL"
\dt              -- перечислить все таблицы текущей схемы
\d challenges     -- показать структуру одной таблицы (столбцы, типы, индексы)
\timing on        -- показывать время выполнения каждого запроса
\q                -- выйти из консоли

Эти метакоманды — чистые расширения psql: они работают только в самом psql, но не если отправить ту же строку программе, понимающей только настоящий SQL (например, библиотеке базы данных в приложении).

Частые причины сбоев восстановления

Экспорт pg_dump обычно не восстанавливается по одной из трёх причин: (1) несовместимость версий между pg_dump, который экспортировал, и psql/сервером, который импортирует (поэтому поддерживайте обе актуальными), (2) отсутствие расширений в целевой базе данных, если исходная использовала расширения PostgreSQL вроде pgcrypto, или (3) ограничения внешнего ключа, которые при загрузке отдельных таблиц (вместо полной базы данных) указывают на ещё не существующие целевые таблицы — здесь помогает --data-only в сочетании с целевой схемой, заранее созданной миграцией, поскольку тогда все связанные таблицы уже существуют.

См. также: Neon, SQL