DmitrySemenov
DmitrySemenov

Reputation: 10315

Postgres container crashes with `database files are incompatible with server` after container's image has been updated to the latest one

Postgres container crash on launch with the following error message

(project) ➜  project git:(feature/62-api-custom-image-categories) ✗ docker-compose up postgres
Starting project_postgres_1 ... 
Starting project_postgres_1 ... done
Attaching to project_postgres_1
postgres_1        | FATAL:  database files are incompatible with server
postgres_1        | DETAIL:  The data directory was initialized by PostgreSQL version 9.5, which is not compatible with this version 9.6.3.
project_postgres_1 exited with code 1

What options do I have? II have updated image to the latest one

Portion of my docker-compose.yml

version: '2'

volumes:
  ipython_history: {}

services:
  postgres:
    image: mdillon/postgis
    ports:
     - "5432:5432"
    environment:
      - POSTGRES_DB=p_dev
      - POSTGRES_USER=p_user
      - POSTGRES_PASSWORD=password

Is it possible to convert the data or the only option is to delete the container (losing all its data) and then re-create it?

Upvotes: 16

Views: 24283

Answers (5)

Sam Autrey
Sam Autrey

Reputation: 141

docker volume prune

This will remove all unused volumes. Unused here meaning any volume not used by at LEAST one container.

Although this worked for me, I'm concerned by what unused is really defining here. Does unused mean the volume exists and the image that was using it is destroyed? Or the image just isn't running anymore?

https://docs.docker.com/engine/reference/commandline/volume_prune/

Upvotes: 1

Matey Aryeh
Matey Aryeh

Reputation: 136

I know that I am 3 years late, but the following link answered this question for me. tianon/docker-postgres-upgrade does a pg_upgrade of the postgres data to the new postgres version you want to run. Was as easy as creating a service in a docker-compose file and running it.

Upvotes: 1

Martin
Martin

Reputation: 257

I got this error because i was always using the latest version of postgres by not defining a tag at the end. Then the latest version switched to 13 and the data was not compatible anymore. Maybe just adding a version at the end might help too. -> postgres:12

postgres:
image: postgres:12
restart: always
environment: 
  POSTGRES_USER: ${POSTGRES_USER}
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
ports:
  - "5432:5432"
volumes:
  - db_data:/var/lib/postgresql/data

Upvotes: 8

prograils
prograils

Reputation: 2376

Additionally don't forget to clear the old pgdata volume:

docker volume ls and then docker volume rm <volume-name>

Otherwise your error will still remain.

See https://github.com/ckan/ckan/issues/4164#issuecomment-388069003

Upvotes: 24

Robert
Robert

Reputation: 36773

You are on time to save it, but you need to rollback to previous version, then:

docker exec -it <postgres-container-id> pg_dump db_name > local.dump.sql

Then, after checking that the dump is OK, empty the volume of the database, upgrade postgres and restore de dump:

https://www.postgresql.org/docs/9.1/static/backup-dump.html

Upvotes: 3

Related Questions