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