Datenbank-Container updaten ohne Datenverlust
Datenbank-Container updaten ohne Datenverlust
Datenbank-Images zu updaten ist riskanter als App-Container – falsche Reihenfolge oder übersprungene Major-Versionen können Daten korrumpieren.
Grundregel: Immer zuerst sichern
Bevor irgendwas an einem Datenbank-Container geändert wird:
# PostgreSQL
docker exec mypostgres pg_dumpall -U postgres > backup-$(date +%Y%m%d).sql
# MySQL/MariaDB
docker exec mydb mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" --all-databases > backup-$(date +%Y%m%d).sql
# MongoDB
docker exec mymongo mongodump --archive --gzip > backup-$(date +%Y%m%d).gz
Das Backup muss existieren bevor man weitermacht. Kein Backup = kein Update.
Minor-Version-Updates (sicher)
Patch- und Minor-Updates (MySQL 8.0.31 → 8.0.36, Postgres 16.0 → 16.3) sind in der Regel sicher und erfordern keine manuelle Datenmigration.
# docker-compose.yml: Version anpassen
services:
db:
image: postgres:16.3 # war: 16.0
# Altes Volume bleibt erhalten, neues Image übernimmt vorhandene Daten
docker compose pull db
docker compose up -d db
# Logs prüfen – kein Fehler = Erfolg
docker compose logs db --tail 30
Die Datenbank-Images führen bei Minor-Updates automatisch notwendige Schema-Migrationen durch.
PostgreSQL: Major-Version-Upgrade (komplex)
PostgreSQL-Major-Upgrades (15 → 16) erfordern pg_upgrade da sich das interne Dateiformat ändert. Der einfachste Weg ist Dump und Restore:
# 1. Alten Container stoppen und Dump erstellen
docker compose stop db
docker run --rm \
-v pgdata:/var/lib/postgresql/data \
-v $(pwd):/backup \
postgres:15 \
pg_dumpall -U postgres -h /var/run/postgresql > /backup/pg15-dump.sql
# 2. Altes Volume umbenennen (als Backup)
docker volume create pgdata-pg15-backup
docker run --rm -v pgdata:/from -v pgdata-pg15-backup:/to alpine \
sh -c "cp -a /from/. /to/"
# 3. Altes Volume leeren oder neues erstellen
docker volume rm pgdata
docker volume create pgdata
# 4. Neue Postgres-Version starten
# docker-compose.yml: image auf postgres:16 ändern
docker compose up -d db
# 5. Dump einspielen
cat pg15-dump.sql | docker exec -i mydb psql -U postgres
MySQL: Major-Version-Upgrade (8.0 → 8.4)
# 1. Backup erstellen
docker exec mydb mysqldump -u root -p"$PASS" --all-databases --single-transaction > backup.sql
# 2. Container stoppen
docker compose stop db
# 3. Image-Version in compose.yml anpassen
# image: mysql:8.4
# 4. Container neu starten (MySQL führt Upgrade-Skripte automatisch aus)
docker compose up -d db
# 5. Logs prüfen
docker compose logs db -f
Bei MySQL müssen keine Major-Versionen übersprungen werden, wenn man sequenziell updatet (8.0 → 8.4, nicht 5.7 → 8.4 direkt).
MariaDB beachten
MariaDB und MySQL sind nicht direkt austauschbar. Wer von MySQL auf MariaDB wechseln will (oder umgekehrt), muss immer dump + restore durchführen – nie einfach das Image wechseln.
Vor dem Update: Release Notes lesen
# Changelog auf Docker Hub (im README des Images)
# Oder direkt: GitHub Release Notes des jeweiligen Projekts
# Postgres: https://www.postgresql.org/docs/release/
# MySQL: https://dev.mysql.com/doc/relnotes/mysql/
# MariaDB: https://mariadb.com/kb/en/release-notes/
Red Flags im Changelog: „configuration option renamed", „default value changed", „removed deprecated feature", „required schema migration".
Rollback-Plan
# Wenn etwas schief läuft: Image zurückrollen und Backup einspielen
docker compose stop db
# docker-compose.yml: Image auf alte Version zurücksetzen
docker compose up -d db
cat backup.sql | docker exec -i mydb psql -U postgres