Миграция PostgreSQL с 14 на 16: безопасный апгрейд через pg_dump/pg_restore
Обновление PostgreSQL с 14 до 16 — шаг, который стоит сделать ради прироста производительности, новых фич и долгосрочной поддержки. Ниже — проверенный маршрут через pg_dump и pg_restore, который сохраняет целостность данных и минимизирует простой.
Зачем переходить на PostgreSQL 16
PostgreSQL 16 приносит заметные улучшения в оптимизации запросов, параллелизме и работе с памятью. Апгрейд даёт:
- Более быстрые и масштабируемые запросы.
- Совместимость с актуальными фреймворками и приложениями.
- Более свежие патчи безопасности.
Подготовка к миграции
- Проверь совместимость — убедись, что приложения, драйверы и расширения работают с PostgreSQL 16.
- Сделай полный бэкап — без него начинать нельзя.
- Подними PostgreSQL 16 — на том же сервере, в новом контейнере или на отдельной машине.
Шаг 1 — экспорт данных из PostgreSQL 14
В Docker:
docker exec -it sonarqube-db-1 bash
pg_dump -U sonar -d sonarqube -F c -f /tmp/sonarqube_backup.dump
На хосте:
pg_dump -U username -h localhost -p 5432 -F c -b -v -f backup.dump dbname
Что значат флаги:
-F c— формат custom, подходящий дляpg_restore.-b— включает большие объекты (BLOB).-v— подробный вывод процесса.
Шаг 2 — остановка PostgreSQL 14
В Docker:
docker-compose down
На хосте:
sudo systemctl stop postgresql@14-main
Шаг 3 — развёртывание PostgreSQL 16
Пример docker-compose:
db:
image: postgres:16
restart: unless-stopped
environment:
- POSTGRES_USER=sonar
- POSTGRES_PASSWORD=PASSWORD
- POSTGRES_DB=sonarqube
volumes:
- sonarqube_db:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
Запуск нового контейнера:
docker-compose up -d
Шаг 4 — восстановление данных в PostgreSQL 16
В Docker:
docker exec -it sonarqube-db-1 bash
pg_restore -U sonar -d sonarqube /tmp/sonarqube_backup.dump
На хосте:
pg_restore -U username -h localhost -p 5433 -d dbname -v backup.dump
Укажи правильный порт, если PostgreSQL 16 слушает нестандартный (например, -p 5433).Шаг 5 — проверка миграции
Подключись к новой базе:
psql -U username -h localhost -p 5433 dbname
Проверь таблицы, целостность данных и права пользователей.
Шаг 6 — оптимизация памяти PostgreSQL
Отредактируй postgresql.conf (обычно в /var/lib/postgresql/data):
shared_buffers = 512MB
work_mem = 4MB
maintenance_work_mem = 64MB
Перезапусти сервис или контейнер:
docker restart sonarqube-db-1
Шаг 7 — очистка и переиндексация
Подключись к PostgreSQL:
docker exec -it sonarqube-db-1 bash
psql -U postgres
Команды обслуживания:
VACUUM; -- базовая очистка
VACUUM ANALYZE; -- очистка + обновление статистики
VACUUM FULL; -- глубокая реорганизация
REINDEX DATABASE sonarqube; -- пересборка всех индексов
Для отдельных таблиц или индексов:
REINDEX TABLE your_table_name;
REINDEX INDEX your_index_name;
Выход из psql и контейнера:
\q
exit
Шаг 8 — перезапуск зависимых сервисов
Если базу использует, например, SonarQube:
docker restart sonarqube-db-1
Подход через pg_dump/pg_restore даёт контролируемый апгрейд без потери данных и заодно повод привести базу в порядок — обновить статистику, перестроить индексы, настроить память под актуальные нагрузки.
Совет: прогони весь процесс на staging перед продакшеном — так найдёшь все подводные камни заранее.
Если хочешь обсудить похожую задачу — пиши на [email protected] или заходи на 1it.pro.