Ao atualizar o PostgreSQL do Docker Swarm da versão 14 para 17, ocorreu o erro:
FATAL: database files are incompatible with server
DETAIL: The data directory was initialized by PostgreSQL version 14, which is not compatible with this version 17.0.
O problema ocorre porque o diretório de dados de uma versão anterior não pode ser usado diretamente em uma versão mais recente.
Antes de iniciar a migração, é fundamental realizar um backup completo dos bancos de dados.
docker exec -it <CONTAINER_ID_POSTGRES14> pg_dumpall -U postgres > backup_full.sql
docker cp <CONTAINER_ID_POSTGRES14>:/backup_full.sql ./backup_full.sqlSe o backup estiver vazio, verifique se o usuário postgres tem as permissões corretas.
Como o volume antigo contém dados da versão 14, devemos criar um novo volume para evitar conflitos.
docker volume create postgres_data_17Verifique se o volume foi criado:
docker volume lsAtualize seu docker-compose.yml:
version: "3.8"
services:
postgres:
image: pgvector/pgvector:pg17
environment:
- POSTGRES_PASSWORD=123
- TZ=America/Sao_Paulo
networks:
- traefik_public
ports:
- 5432:5432
volumes:
- postgres_data_17:/var/lib/postgresql/data
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
resources:
limits:
cpus: "0.5"
memory: 1024M
volumes:
postgres_data_17:
external: true
name: postgres_data_17
networks:
traefik_public:
external: true
name: traefik_publicAgora, suba o serviço com:
docker stack deploy -c docker-compose.yml postgres_stackSe estiver usando docker run diretamente:
docker run -d \
--name postgres17 \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=123 \
-v postgres_data_17:/var/lib/postgresql/data \
--network=traefik_public \
postgres:17Com o novo container em execução, copie o backup para dentro dele:
docker cp backup_full.sql <CONTAINER_ID_POSTGRES17>:/backup_full.sqlAcesse o container:
docker exec -it <CONTAINER_ID_POSTGRES17> bashDentro do container, restaure o backup:
psql -U postgres -f /backup_full.sqlSaia do container e conecte-se ao banco para verificar se os dados foram restaurados:
docker exec -it <CONTAINER_ID_POSTGRES17> psql -U postgresListe os bancos de dados para conferir:
\lSe tudo estiver correto, a migração foi concluída com sucesso! 🎉