Миграция базы данных на другой сервер без простоя: PostgreSQL и MySQL
Переносим PostgreSQL и MySQL на новый сервер с нулевым или минимальным даунтаймом. Логическая репликация, pg_dump и mysqldump с ограничениями.
Для миграции без простоя используйте: PostgreSQL — логическую репликацию (CREATE PUBLICATION/SUBSCRIPTION), MySQL — master-slave репликацию с переключением. Для баз до 10 ГБ простой pg_dump/mysqldump через SSH-туннель даёт даунтайм 5–15 минут. Для баз >50 ГБ — только репликация.
- pg_dump / mysqldump — простой способ, но требует даунтайм на время переноса (минуты–часы в зависимости от размера).
- Логическая репликация PostgreSQL — перенос без даунтайма. Настраивается как publisher/subscriber.
- MySQL: репликация master → slave → переключение. Даунтайм — секунды на переключение DNS/конфига.
- Всегда тестируйте миграцию на staging-копии перед production!
Метод 1: pg_dump для PostgreSQL (простой, с даунтаймом)
Самый простой способ — дамп и восстановление через SSH-туннель. Подходит для баз до 10–20 ГБ:
# На старом сервере: дамп напрямую в новый через 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Метод 2: Логическая репликация PostgreSQL (без даунтайма)
Для больших баз или когда даунтайм недопустим — логическая репликация. Старый сервер (publisher) отправляет изменения на новый (subscriber) в реальном времени:
-- НА СТАРОМ СЕРВЕРЕ (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):
# Простой путь: 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
Cloud Start
CPU
1 ядер • 3.3 ГГц
RAM
1 ГБ
Диск
15 ГБ NVMe
Канал
200 Мбит/с
299 ₽/мес
Selectel
Cloud Lite 1
CPU
1 ядер • 2.6 ГГц
RAM
1 ГБ
Диск
10 ГБ SSD
Канал
200 Мбит/с
550 ₽/мес
Часто задаваемые вопросы (FAQ)
Как минимизировать даунтайм при миграции?
Используйте репликацию. Настройте реплику на новом сервере, дождитесь полной синхронизации, затем переключите DNS/конфиг приложения. Даунтайм — секунды (время на переключение).
Можно ли мигрировать с MySQL на PostgreSQL?
Да, через pgloader (автоматическая конвертация схемы и данных) или вручную через CSV-экспорт. Но это требует тестирования — типы данных и SQL-диалекты отличаются.