La batterie de la machine locale qui exécutait le conteneur PostgreSQL Docker s'est épuisée et est tombée. Lorsque j'ai sécurisé l'alimentation électrique et l'ai redémarrée, j'ai eu une erreur et je n'ai pas pu démarrer.
Notez que les données du conteneur sont montées sur le répertoire de la machine hôte et utilisées de manière persistante.
Partie de définition de docker-compose.yml
.
services:
db:
image: postgres:12-alpine
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=foobar
volumes:
- ./dataDir:/var/lib/postgresql/data
Ceci est le journal au démarrage.
db_1 |
db_1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
db_1 |
db_1 | 2020-02-07 01:36:06.106 UTC [1] LOG: starting PostgreSQL 12.1 on x86_64-pc-linux-musl, compiled by gcc (Alpine 8.3.0) 8.3.0, 64-bit
db_1 | 2020-02-07 01:36:06.107 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
db_1 | 2020-02-07 01:36:06.107 UTC [1] LOG: listening on IPv6 address "::", port 5432
db_1 | 2020-02-07 01:36:06.270 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1 | 2020-02-07 01:36:06.434 UTC [21] LOG: database system was interrupted; last known up at 2020-02-07 01:19:57 UTC
db_1 | 2020-02-07 01:36:10.655 UTC [21] LOG: invalid record length at 1/94338ED0: wanted 24, got 0
db_1 | 2020-02-07 01:36:10.655 UTC [21] LOG: invalid primary checkpoint record
db_1 | 2020-02-07 01:36:10.655 UTC [21] PANIC: could not locate a valid checkpoint record
db_1 | 2020-02-07 01:36:10.656 UTC [1] LOG: startup process (PID 21) was terminated by signal 6: Aborted
db_1 | 2020-02-07 01:36:10.656 UTC [1] LOG: aborting startup due to startup process failure
db_1 | 2020-02-07 01:36:10.661 UTC [1] LOG: database system is shut down
db_1 | 2020-02-07 01:36:10.655 UTC [21] PANIC: could not locate a valid checkpoint record
J'ai craché ce journal et le démarrage s'est arrêté. Quand je l'ai recherché, j'ai entendu dire que WAL (journal d'écriture anticipée) était endommagé.
Pour récupérer de cet état, utilisez la commande pg_resetxlog
.
pg_resetxlog efface le journal d'écriture anticipée (WAL) et initialise éventuellement certaines des informations de contrôle stockées dans le fichier pg_control. Cette fonctionnalité peut être nécessaire si ces fichiers sont corrompus. Utilisez cette fonction uniquement en dernier recours si le serveur ne peut pas être démarré en raison d'une telle corruption.
Depuis Postgres10
, pg_resetxlog
a été renommé pg_resetwal
.
Modifiez le nom de la commande en fonction de la version.
docker run --rm -it -v $(pwd)/dataDir:/var/lib/postgres/data/ postgres:12 /bin/bash
Puisque les données ont été montées du côté de la machine hôte, montez-les.
gosu postgres pg_resetwal -f /var/lib/postgres/data
Lorsque le conteneur démarre, exécutez la commande d'initialisation du journal. L'exécution a démarré avec succès.
Il s'agit simplement d'une initialisation forcée du journal, l'intégrité des données peut donc être altérée. Il semble préférable de faire une sauvegarde et de vérifier la cohérence en réinsérant les données.
Cette fois, c'était l'environnement de développement à portée de main, et au pire c'était bien si tout disparaissait, Tant qu'il peut être restauré, nous avons décidé de prendre des mesures jusqu'à présent.
Recommended Posts