DevOps / onPremis Themen
Wiederherstellung nach Datenbankmanagement System Fehlern
Hintergrund
Das durch rocklog Edge genutzte Datenbankmanagement System wird durch einen oder mehrere Docker Container bereitgestellt. Durch Konfigurationsfehler oder den nicht-konsistenten Zustand der Datenbank kann der Aufstart des entsprechenden Containers verunmöglicht werden. Die Laufzeitumgebung (docker compose) versucht in diesem Fall den oder die Docker Container neu zu starten. Eine manuelle Verbindung mit dem Docker Container ist in diesem Falle nicht möglich und somit auch keine Korrektur der fehlerhaften Konfiguration oder der inkonsistenten Datenbank.
Das docker-compose.yaml im repository werner-docker enthält zum Recovery aus solchen Situationen ein profil-abhängigen service
postgres-recovery
Dieser kann manuell gestartet werden und nutzt dasselbe Image wie der Docker Container, welche die Datenbank und die DBMS Konfiguration umfasst.
Innerhalb dieses Containers stehen die Editoren nano,vim sowie emacs zur Verfügung.
Durchführen einer Recovery
Der nicht durchführbare Aufstart des DBMS Containers äussert sich wie folgt:
WARN[0000] /home/gix/develop/werner/werner-docker/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
WARN[0000] volume "test_postgres-data" already exists but was not created by Docker Compose. Use `external: true` to use an existing volume
WARN[0000] volume "test_postinstall-done" already exists but was not created by Docker Compose. Use `external: true` to use an existing volume
[+] Running 4/0
✔ Container test-postgres-1 Created 0.0s
✔ Container test-postinstall-1 Created 0.0s
✔ Container test-testdata-1 Created 0.0s
✔ Container test-keycloak-1 Created 0.0s
Attaching to keycloak-1, postgres-1, postinstall-1, testdata-1
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2024-08-07 08:35:23.147 GMT [1] LOG: invalid value for parameter "wal_level": "replica_foo"
postgres-1 | 2024-08-07 08:35:23.147 GMT [1] HINT: Available values: minimal, replica, logical.
postgres-1 | 2024-08-07 08:35:23.147 UTC [1] FATAL: configuration file "/var/lib/postgresql/data/pgdata/postgresql.conf" contains errors
postgres-1 exited with code 1
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2024-08-07 08:35:23.648 GMT [1] LOG: invalid value for parameter "wal_level": "replica_foo"
postgres-1 | 2024-08-07 08:35:23.648 GMT [1] HINT: Available values: minimal, replica, logical.
postgres-1 | 2024-08-07 08:35:23.648 UTC [1] FATAL: configuration file "/var/lib/postgresql/data/pgdata/postgresql.conf" contains errors
postgres-1 |
postgres-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres-1 |
postgres-1 | 2024-08-07 08:35:24.279 GMT [1] LOG: invalid value for parameter "wal_level": "replica_foo"
postgres-1 | 2024-08-07 08:35:24.279 GMT [1] HINT: Available values: minimal, replica, logical.
postgres-1 | 2024-08-07 08:35:24.280 UTC [1] FATAL: configuration file "/var/lib/postgresql/data/pgdata/postgresql.conf" contains errors
Beenden der Docker Container
Vor der Bearbeitung des Volumes mit den Konfigurationen und Daten des DBMS müssen die beteiligten Container zwingend heruntergefahren werden
docker compose -p <project> down
Start des recovery containers
docker compose -p <project> --profile recovery up postgres-recovery
Verbindung zum recovery container herstellen
❯ docker exec -it test-postgres-recovery-1 bash
root@565d0b143c25:/#
Die Konfigurationsdaten befinden sich in /var/lib/postgresql/data/pgdata/
Nach der Durchführung der Anpassungen muss der Container beendet werden.
Start der Anwendung im normalen Modus
anschliessend erfolgt der Start der Anwendung im normalen Modus durch die Ausführung des scripts im übergeordneten Verzeichnis
./start.sh <project> .env.<project> run
oder den manuellen Start mittels
docker compose --env-file ../.env.<project> -p <project> --profile additional_services up -d