Как перенести базу PostgreSQL с Windows на Linux — вопрос, который возникает у многих администраторов при миграции инфраструктуры. Процесс требует внимательности, но при правильном подходе занимает минимум времени и гарантирует сохранность данных. Основные способы — дамп базы через pg_dump или копирование каталога данных. Выбор зависит от объема базы, версии PostgreSQL и доступных ресурсов.

В большинстве случаев оптимален метод через pg_dump: он универсален, подходит для любой версии СУБД и позволяет переносить данные между разными архитектурами. Альтернатива — использование утилиты pg_basebackup для реплики каталога данных, но этот способ сложнее и требует одинаковых версий PostgreSQL на обеих системах.

Подготовка к миграции: что нужно сделать заранее

Перед тем как переносить базу, проверьте совместимость версий PostgreSQL на Windows и Linux. Если разница в версиях значительная (например, 10 → 15), после переноса может потребоваться даунгрейд или апгрейд. Для этого используйте pg_dump с флагом --format=custom — он сохраняет метданные о версии.

Также убедитесь, что на Linux-сервере достаточно места на диске. Объем дампа базы обычно на 20–30% больше, чем размер самой базы. Например, если база занимает 50 ГБ, под дамп нужно не менее 65–70 ГБ свободного пространства.

И не забывайте про права доступа: на Linux пользователь, под которым будет восстанавливаться база, должен иметь права на запись в каталог данных PostgreSQL (обычно /var/lib/postgresql/ или /usr/local/pgsql/data/).

💡

Перед миграцией выполните VACUUM FULL ANALYZE; на исходной базе — это уменьшит размер дампа и ускорит процесс переноса.

СпособПлюсыМинусыКогда использовать
pg_dump + psqlУниверсален, работает между разными версиями, можно выборочно переносить таблицыДольше, чем копирование каталога данных, требует много места под дампный метод для большинства случаев, особенно при смене версии или архитектуры
pg_basebackupБыстрее pg_dump, минимальная нагрузка на исходную базуТребует одинаковые версии PostgreSQL, сложнее в настройкеДля переноса больших баз (от 100 ГБ) без смены версии
Копирование каталога данныхМгновенный перенос, минимальные затраты ресурсовРаботает только при одинаковых версиях и архитектурах, риск повреждения данныхДля тестовых окружений или клонирования базы на аналогичную систему

Сравнение способов миграции: плюсы и минусы

Выбор метода миграции зависит от задач, ресурсов и времени. Ниже — сравнение трех самых распространенных способов переноса базы PostgreSQL между системами.

В 90% случаев оптимален pg_dump — он гибкий, надежный и подходит для любых сценариев. pg_basebackup удобен для больших баз, но требует тщательной подготовки. Копирование каталога данных — крайний случай, так как чревато ошибками.

Пошаговый перенос через pg_dump

Этот метод подходит для баз любого размера и версий. Рассмотрим процесс на примере переноса базы mydb с Windows (версия PostgreSQL 14) на Linux (версия 15).

Сначала создаем дамп на Windows:

  • Откройте командную строку от имени пользователя с правами на базу (обычно postgres).
  • Выполните команду: pg_dump -U postgres -h localhost -p 5432 -F c -b -v -f mydb_backup.dump mydb
    • -U postgres — пользователь базы данных.
    • -h localhost — хост (укажите IP, если сервер удаленный).
    • -p 5432 — порт (по умолчанию 5432).
    • -F c — формат custom (рекомендуется для больших баз).
    • -b — включить в дамп большие объекты (BLOB).
    • -v — подробный вывод (для отслеживания процесса).
    • -f mydb_backup.dump — имя файла дампа.
  • Дождитесь завершения процесса. Время зависит от размера базы: для 10 ГБ это может занять 10–30 минут.

После создания дампа перенесите файл mydb_backup.dump на Linux-сервер. Для этого можно использовать scp (если есть SSH-доступ) или любой файловый менеджер (например, WinSCP или FileZilla). Пример команды для scp:

scp C:\path\to\mydb_backup.dump user@linux-server:/home/user/

Восстановление базы на Linux

Теперь восстановим базу из дампа на Linux. Предварительно убедитесь, что PostgreSQL установлен и запущен. Проверить это можно командой:

sudo systemctl status postgresql

Если сервис не запущен, активируйте его:

  1. Установите PostgreSQL (если не установлен):
    • Для Debian/Ubuntu: sudo apt update && sudo apt install postgresql postgresql-contrib
    • Для RHEL/CentOS: sudo yum install postgresql-server postgresql-contrib
  2. Запустите сервис: sudo systemctl start postgresql
  3. Включите автозапуск: sudo systemctl enable postgresql

Далее создаем пустую базу данных на Linux:

sudo -u postgres createdb mydb

И восстанавливаем дамп:

sudo -u postgres pg_restore -U postgres -d mydb -v -c /home/user/mydb_backup.dump

  • -d mydb — имя базы, куда восстанавливаем данные.
  • -c — очистить базу перед восстановлением (полезно, если база уже существовала).
  • -v — подробный вывод.
⚠️ Внимание: Если при восстановлении возникают ошибки совместимости (например, из-за разницы версий), используйте флаг --no-owner для игнорирования владельцев объектов: pg_restore --no-owner -U postgres -d mydb mydb_backup.dump.
Какой способ миграции PostgreSQL вы используете чаще?
pg_dump
pg_basebackup
Коперование каталога данных
Другой метод

Сравнение инструментов для миграции: pg_dump vs pg_basebackup

Если вы выбираете между pg_dump и pg_basebackup, важно понимать их ключевые различия. В таблице ниже — сравнение по основным критериям.

Критерийpg_dumppg_basebackup
Скорость работыМедленнее (обрабатывает данные построчно)Быстрее (копирует файлы напрямую)
Нагрузка на серверВысокая (читает и обрабатывает все данные)Низкая (копирует файлы без обработки)
Поддержка разных версийДа (через формат custom)Нет (требует одинаковые версии)
Размер дампаБольше (из-за текстового или кастомного формата)Равен размеру базы (1:1)
Возможность выборочного восстановленияДа (можно восстановить отдельные таблицы)Нет (только полное восстановление)

Из таблицы видно, что pg_basebackup подходит для больших баз с минимальной нагрузкой на сервер, но только если версии PostgreSQL совпадают. pg_dump — более универсальный инструмент, который подходит для большинства задач.

Проверка целостности данных после миграции

После восстановления базы обязательно проверьте целостность данных. Начните с проверки размера базы:

sudo -u postgres psql -c "\l"

Сравните размер новой базы с исходной. Допустимое расхождение — до 5%. Если разница больше, возможно, не все данные были перенесены.

Далее проверьте ключевые таблицы:

sudo -u postgres psql -d mydb -c "SELECT COUNT(*) FROM my_table;"

Сравните количество записей с исходной базой. Также убедитесь, что индексы и ограничения (например, PRIMARY KEY, FOREIGN KEY) сохранены:

sudo -u postgres psql -d mydb -c "\d"

Проверка целостности данных — обязательный этап миграции. Без нее риск потери или повреждения данных остается высоким.

Пошаговая инструкция: перенос через pg_basebackup

Если вы выбрали pg_basebackup, следуйте этой инструкции. Убедитесь, что версии PostgreSQL на Windows и Linux одинаковые.

На Windows:

  1. Остановите сервер PostgreSQL (обязательно!): pg_ctl stop -D "C:\Program Files\PostgreSQL\14\data"
  2. Создайте резервную копию каталога данных (по умолчанию C:\Program Files\PostgreSQL\14\data).
  3. Скопируйте каталог данных на Linux-сервер, например, в /var/lib/postgresql/14/main/.

На Linux:

  1. Остановите сервер PostgreSQL: sudo systemctl stop postgresql
  2. Замените каталог данных на скопированный с Windows. Убедитесь, что права доступа соответствуют пользователю postgres: sudo chown -R postgres:postgres /var/lib/postgresql/14/main/
  3. Запустите сервер: sudo systemctl start postgresql
  4. Проверьте статус: sudo systemctl status postgresql

Чек-лист для миграции через pg_basebackup

Выполнено: 0 / 5

Часто задаваемые вопросы

Можно ли переносить базу между разными версиями PostgreSQL?

Да, но только через pg_dump. Используйте формат custom (-F c) — он сохраняет метданные, что упрощает миграцию между версиями. После восстановления на новой версии может потребоваться запуск pg_upgrade или ручная правка скриптов.

Сколько времени занимает перенос базы объемом 100 ГБ?

Время зависит от метода:

  • pg_dump: 1–4 часа (зависит от производительности дисков и CPU).
  • pg_basebackup: 20–60 минут (копирование файлов идет быстрее).
  • Копирование каталога данных: 10–30 минут (если используется быстрый канал между серверами).
Для ускорения процесса используйте сжатие (-Z 9 в pg_dump) или сетевые инструменты вроде rsync.

Что делать, если при восстановлении возникает ошибка "incompatible data type"?

Ошибка возникает из-за несовместимости версий или архитектур. Решения:

  1. Используйте pg_dump с флагом --no-owner.
  2. Убедитесь, что на целевой системе установлена версия PostgreSQL не ниже, чем на исходной.
  3. Попробуйте восстановить базу в пустую БД с такой же версией, а затем обновите ее до нужной.
Если ошибка сохраняется, проверьте лог PostgreSQL (/var/log/postgresql/postgresql-14-main.log).

Нужно ли настраивать postgresql.conf после миграции?

Да, если вы переносите базу на другой сервер. Проверьте и при необходимости скорректируйте:

  • listen_addresses — должен быть доступен для клиентов.
  • max_connections — увеличьте, если нагрузка выросла.
  • shared_buffers и work_mem — настройте под новый объем ОЗУ.
  • data_directory — если вы изменили путь к каталогу данных.
После изменений перезапустите PostgreSQL: sudo systemctl restart postgresql.