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 у поєднанні з цільовою схемою, заздалегідь створеною міграцією, оскільки тоді всі пов’язані таблиці вже існують.