Mit Pg_resetwal kann der PostgreSQL Docker-Container gestartet werden, wenn WAL fehlerhaft ist und nicht gestartet werden kann.

Die Batterie des lokalen Computers, auf dem der PostgreSQL Docker-Container ausgeführt wurde, war leer und fiel aus. Als ich das Netzteil gesichert und neu gestartet habe, ist ein Fehler aufgetreten und ich konnte nicht starten.

Beachten Sie, dass die Containerdaten im Verzeichnis des Hostcomputers bereitgestellt und dauerhaft verwendet werden. Definitionsteil von 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

Dies ist das Protokoll beim Start.

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

Ich spuckte dieses Protokoll aus und der Start wurde gestoppt. Als ich nachforschte, wurde gesagt, dass WAL (Write Ahead Log) beschädigt war.

Verwenden Sie den Befehl pg_resetxlog, um diesen Zustand wiederherzustellen.

pg_resetxlog löscht das Write-Ahead-Protokoll (WAL) und initialisiert optional einige der in der Datei pg_control gespeicherten Steuerinformationen. Diese Funktion kann erforderlich sein, wenn diese Dateien beschädigt werden. Verwenden Sie diese Funktion nur als letzten Ausweg, wenn der Server aufgrund einer solchen Beschädigung nicht gestartet werden kann.

Von "Postgres10" wurde "pg_resetxlog" in "pg_resetwal" umbenannt. Ändern Sie den Befehlsnamen je nach Version.

docker run --rm -it -v $(pwd)/dataDir:/var/lib/postgres/data/ postgres:12 /bin/bash

Mounten Sie die Daten, da sie auf der Seite des Hostcomputers bereitgestellt wurden.

gosu postgres pg_resetwal -f /var/lib/postgres/data

Führen Sie beim Starten des Containers den Befehl zur Protokollinitialisierung aus. Die Ausführung wurde erfolgreich gestartet.

Dies ist nur eine erzwungene Initialisierung des Protokolls, sodass die Integrität der Daten möglicherweise beschädigt wird. Es scheint besser, ein Backup zu erstellen und die Konsistenz durch erneutes Einfügen der Daten zu überprüfen.

Diesmal war es die Entwicklungsumgebung, und im schlimmsten Fall war es in Ordnung, wenn alles verschwand. Solange es restauriert werden kann, haben wir beschlossen, bis zu diesem Punkt Maßnahmen zu ergreifen.

Recommended Posts

Mit Pg_resetwal kann der PostgreSQL Docker-Container gestartet werden, wenn WAL fehlerhaft ist und nicht gestartet werden kann.
Wenn Tomcat in Eclipse gestartet wird, wird "ClassNotFoundException" angezeigt und kann nicht gestartet werden.
Warten Sie, bis PostgreSQL mit Docker gestartet ist, und starten Sie dann den WEB-Dienst
[Docker] Erstellen, wenn der Quellcode auf dem Container gebunden ist
So mounten Sie den Speicherort der Batchdatei über WSL2 und starten den Docker-Container
So lösen Sie, wenn Sie mit einem neuen Container keine Verbindung zur Datenbank herstellen können, weil der Port dem vorhandenen Docker-Container zugewiesen ist
[Android] Lösung, wenn die Kamera unter Android 9 nicht gestartet werden kann
Systemctl kann unter Ubuntu nicht in einem Docker-Container verwendet werden
Als ich jetzt ansible + docker gestartet habe, bin ich von Anfang an gestolpert, aber ich habe es geschafft, es zu starten
[Docker] Wenn Sie den Datenbankcontainer betreten und die Daten anzeigen, wird Japanisch als ??? angezeigt.
Einstellungen, die vorgenommen werden müssen, wenn HTML oder JSP in Eclipse formatiert sind und das Layout enttäuschend wird
Auf Anforderung wird der Zugriff auf die Ressource beim Push mit Docker verweigert
Bis die Docker-Umgebung erstellt und der Ubuntu-Container gestartet und gestoppt wurde
Informationen zu Bereich und Umfang, in denen Day16-Variablen verwendet werden können
[Ruby On Rails] Notfallmaßnahmen, wenn redirect_to action :: show nicht zum Erstellen von Aktionen und zum Zerstören von Aktionen verwendet werden kann (kann)
Übertragen Sie das von Docker Hub verteilte Docker-Image in die Google Container-Registrierung und starten Sie die VM basierend auf diesem Image
Was tun, wenn CentOS nicht mit VirtualBox unter Catalina gestartet werden kann?
[Rails] "Pry-Rails", die beim Speichern mit der create-Methode verwendet werden können
Ich habe Docker verwendet, um die Vorlage zu verfestigen, die mit Spring Boot entwickelt werden soll.
767 JSON :: ParserError tritt auf und der lokale Server kann nicht gestartet werden.
Das Problem, dass die von Docker gestartete localhost-Seite vom Browser nicht bestätigt werden kann, wenn die ESET-Firewall ausgeführt wird
Überprüfen Sie mithilfe des Remote-Containers von VSCode, ob Sie vom Host in der Docker-Umgebung Laravel on nicht auf den Container zugreifen können.
Wenn Sie einem Argument in einer Ruby-Methode neu zuweisen und dann "super" aufrufen → Das neu zugewiesene wird verwendet