Миграция• Гайды по выбору

Миграция базы данных на другой сервер без простоя: PostgreSQL и MySQL

Переносим PostgreSQL и MySQL на новый сервер с нулевым или минимальным даунтаймом. Логическая репликация, pg_dump и mysqldump с ограничениями.

Обновлено: 2026-10-31T06:00:05.319Z
Время чтения: ~11 мин
Автор: Алексей Кузнецов (Ведущий системный архитектор)
Быстрый ответ & Краткая суть

Для миграции без простоя используйте: PostgreSQL — логическую репликацию (CREATE PUBLICATION/SUBSCRIPTION), MySQL — master-slave репликацию с переключением. Для баз до 10 ГБ простой pg_dump/mysqldump через SSH-туннель даёт даунтайм 5–15 минут. Для баз >50 ГБ — только репликация.

PostgreSQL (до 10 ГБ)pg_dump | psql — даунтайм 5–15 мин
PostgreSQL (>10 ГБ)Логическая репликация — 0 даунтайм
MySQL (до 10 ГБ)mysqldump — даунтайм 5–15 мин
MySQL (>10 ГБ)Репликация master-slave — ~0 даунтайм
Ключевые выводы и краткая суть
  • pg_dump / mysqldump — простой способ, но требует даунтайм на время переноса (минуты–часы в зависимости от размера).
  • Логическая репликация PostgreSQL — перенос без даунтайма. Настраивается как publisher/subscriber.
  • MySQL: репликация master → slave → переключение. Даунтайм — секунды на переключение DNS/конфига.
  • Всегда тестируйте миграцию на staging-копии перед production!

Метод 1: pg_dump для PostgreSQL (простой, с даунтаймом)

Самый простой способ — дамп и восстановление через SSH-туннель. Подходит для баз до 10–20 ГБ:

pg-migrate.sh
# На старом сервере: дамп напрямую в новый через SSH
pg_dump -h localhost -U postgres -Fc mydb | \
  ssh user@new-server "pg_restore -h localhost -U postgres -d mydb -c --no-owner"

# Или двухэтапно:
# 1. Дамп в файл
pg_dump -h localhost -U postgres -Fc -f /tmp/mydb.dump mydb

# 2. Копирование
scp /tmp/mydb.dump user@new-server:/tmp/

# 3. Восстановление на новом сервере
pg_restore -h localhost -U postgres -d mydb -c --no-owner /tmp/mydb.dump
Скорость переносаpg_dump -Fc (custom format) сжимает данные. База 10 ГБ сжимается до ~3–4 ГБ. При канале 100 Мбит/с передача займёт ~5 минут. Восстановление — ещё 3–5 минут.

Метод 2: Логическая репликация PostgreSQL (без даунтайма)

Для больших баз или когда даунтайм недопустим — логическая репликация. Старый сервер (publisher) отправляет изменения на новый (subscriber) в реальном времени:

pg-logical-replication.sql
-- НА СТАРОМ СЕРВЕРЕ (publisher):
-- 1. В postgresql.conf:
-- wal_level = logical
-- max_replication_slots = 4

-- 2. Создаём публикацию
CREATE PUBLICATION my_pub FOR ALL TABLES;

-- НА НОВОМ СЕРВЕРЕ (subscriber):
-- 1. Создаём схему (без данных)
-- pg_dump -s mydb | psql -h new-server mydb

-- 2. Создаём подписку
CREATE SUBSCRIPTION my_sub
  CONNECTION 'host=old-server dbname=mydb user=replicator password=xxx'
  PUBLICATION my_pub;

-- 3. Мониторинг: ждём пока lag станет 0
SELECT * FROM pg_stat_subscription;

-- 4. Когда lag = 0 → переключаем приложение на новый сервер
-- 5. Удаляем подписку
DROP SUBSCRIPTION my_sub;

MySQL: mysqldump и репликация

Для MySQL простой путь — mysqldump. Для баз >10 ГБ — настройте master-slave репликацию, дождитесь синхронизации и переключите приложение на slave (который становится новым master):

mysql-migrate.sh
# Простой путь: mysqldump через SSH
mysqldump -u root -p --single-transaction --routines --triggers mydb | \
  ssh user@new-server "mysql -u root -p mydb"

# С сжатием для больших баз:
mysqldump -u root -p --single-transaction mydb | gzip | \
  ssh user@new-server "gunzip | mysql -u root -p mydb"
Рекомендованные конфигурации по теме статьи

Проверенные серверы от надежных провайдеров

Весь каталог
Timeweb Cloud
Перейти
Хит цены
Timeweb Cloud

Timeweb Cloud

Москва★ 4.8

Cloud Start

CPU

1 ядер • 3.3 ГГц

RAM

1 ГБ

Диск

15 ГБ NVMe

Канал

200 Мбит/с

299 ₽/мес

Timeweb Cloud

Timeweb Cloud

Москва★ 4.8

Cloud Basic

CPU

2 ядер • 3.3 ГГц

RAM

2 ГБ

Диск

40 ГБ NVMe

Канал

200 Мбит/с

499 ₽/мес

152-ФЗ
Selectel

Selectel

Москва★ 4.9

Cloud Lite 1

CPU

1 ядер • 2.6 ГГц

RAM

1 ГБ

Диск

10 ГБ SSD

Канал

200 Мбит/с

550 ₽/мес

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

Как минимизировать даунтайм при миграции?

Используйте репликацию. Настройте реплику на новом сервере, дождитесь полной синхронизации, затем переключите DNS/конфиг приложения. Даунтайм — секунды (время на переключение).

Можно ли мигрировать с MySQL на PostgreSQL?

Да, через pgloader (автоматическая конвертация схемы и данных) или вручную через CSV-экспорт. Но это требует тестирования — типы данных и SQL-диалекты отличаются.