core code helper

Postgres у Docker не стартує: «database files are incompatible with server»

Поставити питання
Запитано Активність 13 переглядів Є найкраща відповідь
0

Оновила в docker-compose.yml образ з postgres:16-alpine на postgres:17-alpine, зробила docker compose up -d — і контейнер бази одразу падає. У логах:

FATAL:  database files are incompatible with server
DETAIL:  The data directory was initialized by PostgreSQL version 16, which is not compatible with this version 17.x.

Дані лежать в іменованому томі pgdata. Там локальна база з дашбордами, втрачати не хотілося б. Як правильно оновитися?

Софія Романенкозапитання · 11 серпня 2026 р.

2 відповіді

0
Найкраща відповідь — на думку автора питання

Мажорні версії PostgreSQL (16 → 17) мають різний формат файлів даних, тому новий сервер не може просто відкрити старий том. Дані нікуди не поділись — поверніть поки що образ postgres:16-alpine, і все запуститься.

Для локальної бази найпростіший шлях — дамп і відновлення:

# 1. На старій версії зробити дамп усіх баз і ролей
docker compose exec db pg_dumpall -U postgres > dump.sql

# 2. Зупинити і перейменувати старий том (не видаляйте, доки не перевірите результат)
docker compose down
docker volume create pgdata16_backup
docker run --rm -v pgdata:/from -v pgdata16_backup:/to alpine sh -c "cp -a /from/. /to/"
docker volume rm pgdata

# 3. Змінити образ на postgres:17-alpine і запустити — створиться чистий том
docker compose up -d db

# 4. Залити дамп
docker compose exec -T db psql -U postgres < dump.sql

Перевірте, що все на місці, і лише після цього видаляйте pgdata16_backup.

Для великих продакшен-баз дамп довгий — там використовують pg_upgrade (є готові образи на кшталт pgautoupgrade) або логічну реплікацію для мінімального простою.

Дмитро Бондаренковідповідь ·
0

Додам на майбутнє: фіксуйте в compose не лише мажорну версію, а розумійте, що саме її зміна — це міграція даних, а не просто «оновити образ». Мінорні оновлення (17.5 → 17.6) безпечні і робляться заміною образу, мажорні — завжди через дамп або pg_upgrade.

Я зазвичай додаю в README проєкту окремий розділ «Як оновити Postgres», щоб наступного разу не згадувати.

Андрій Мельниквідповідь ·

Знаєте відповідь?

Увійдіть через Google — і зможете відповідати, голосувати й ставити власні питання. Це безкоштовно.

Увійти через Google