Pg_resetwal peut être utilisé pour démarrer le conteneur Docker PostgreSQL lorsque WAL est cassé et ne peut pas être démarré.

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

Pg_resetwal peut être utilisé pour démarrer le conteneur Docker PostgreSQL lorsque WAL est cassé et ne peut pas être démarré.
Lorsque tomcat est démarré dans eclipse, "ClassNotFoundException" s'affiche et ne peut pas être démarré.
Attendez que PostgreSQL démarre avec Docker, puis démarrez le service WEB
[Docker] Comment créer lorsque le code source est monté en liaison sur le conteneur
Comment monter l'emplacement du fichier de commandes via WSL2 et démarrer le conteneur Docker
Solution lorsque la connexion à la base de données n'est pas possible avec un nouveau conteneur car le port est affecté au conteneur docker existant
[Android] Solution lorsque l'appareil photo ne peut pas être démarré sur Android 9
Systemctl ne peut pas être utilisé sur Ubuntu dans un conteneur Docker
Quand j'ai commencé ansible + docker maintenant, j'ai trébuché depuis le début, mais j'ai réussi à le démarrer
[Docker] Lorsque vous entrez dans le conteneur de base de données et que vous regardez les données, le japonais s'affiche sous la forme ???
Paramètres à effectuer lorsque HTML ou JSP est formaté dans Eclipse et que la mise en page devient décevante
Lorsque l'accès demandé à la ressource est refusé lors de la transmission avec Docker
Jusqu'à ce que l'environnement docker soit créé et que le conteneur Ubuntu soit démarré et arrêté
À propos de la plage et de la portée dans lesquelles les variables Day16 peuvent être utilisées
[Ruby On Rails] Mesures d'urgence lorsque redirect_to action :: show ne peut pas être (ne peut pas être utilisé) dans l'action de création et de destruction
Poussez l'image Docker distribuée par Docker Hub vers Google Container Registry et démarrez la VM en fonction de cette image
Que faire lorsque CentOS ne peut pas être démarré avec VirtualBox sur Catalina
[Rails] "Pry-rails" qui peuvent être utilisés lors de l'enregistrement avec la méthode create
J'ai utilisé Docker pour solidifier le modèle à développer avec Spring Boot.
767 JSON :: ParserError se produit et le serveur local ne peut pas être démarré.
Le problème selon lequel la page localhost lancée par Docker ne peut pas être confirmée dans le navigateur lorsque le pare-feu ESET fonctionne
Vérifiez si vous ne pouvez pas accéder au conteneur à partir de l'hôte dans l'environnement Laravel sur docker à l'aide du conteneur distant de VSCode.
Lors de la réaffectation à un argument dans une méthode Ruby puis en appelant `super` → Celui réaffecté est utilisé