it-swarm.com.de

Sichern / Wiederherstellen einer dockerisierten PostgreSQL-Datenbank

Ich versuche, eine PostgreSQL-Datenbank wie auf der Docker-Website beschrieben zu sichern/wiederherzustellen, aber die Daten werden nicht wiederhergestellt.

Die vom Datenbank-Image verwendeten Volumes sind:

VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

und die CMD ist:

CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]

Ich erstelle den DB-Container mit diesem Befehl:

docker run -it --name "$DB_CONTAINER_NAME" -d "$DB_IMAGE_NAME"

Dann verbinde ich einen anderen Container, um einige Daten manuell einzufügen:

docker run -it --rm --link "$DB_CONTAINER_NAME":db "$DB_IMAGE_NAME" sh -c 'exec bash'
psql -d test -h $DB_PORT_5432_TCP_ADDR
# insert some data in the db
<CTRL-D>
<CTRL-D>

Das Tar-Archiv wird dann erstellt:

$ Sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /etc/postgresql /var/log/postgresql /var/lib/postgresql

Jetzt entferne ich den für die Datenbank verwendeten Container und erstelle einen weiteren mit demselben Namen und versuche, die zuvor eingefügten Daten wiederherzustellen:

$ Sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar 

Die Tabellen sind jedoch leer. Warum werden die Daten nicht ordnungsgemäß wiederhergestellt?

101
Carl Levasseur

Okay, ich habe das herausgefunden. Postgresql erkennt nach dem Start keine Änderungen im Ordner/var/lib/postgresql, zumindest nicht die Art der Änderungen, die es erkennen soll.

Die erste Lösung besteht darin, einen Container mit bash zu starten, anstatt den Postgres-Server direkt zu starten, die Daten wiederherzustellen und den Server dann manuell zu starten.

Die zweite Lösung ist die Verwendung eines Datencontainers. Ich habe es vorher nicht verstanden, jetzt tue ich es. Dieser Datencontainer ermöglicht die Wiederherstellung der Daten vor dem Start des Postgres-Containers. Somit sind die Daten beim Start des Postgres-Servers bereits vorhanden.

15
Carl Levasseur

Sichern Sie Ihre Datenbanken

docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

Stellen Sie Ihre Datenbanken wieder her

cat your_dump.sql | docker exec -i your-db-container psql -U postgres
339
Forth

Ich denke, Sie können auch einen Postgres-Sicherungscontainer verwenden, der Ihre Datenbanken innerhalb einer bestimmten Zeitdauer sichert.

  pgbackups:
    container_name: Backup
    image: prodrigestivill/postgres-backup-local
    restart: always
    volumes:
      - ./backup:/backups
    links:
      - db:db
    depends_on:
      - db
    environment:
      - POSTGRES_Host=db
      - POSTGRES_DB=${DB_NAME} 
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_EXTRA_OPTS=-Z9 --schema=public --blobs
      - [email protected] 0h30m00s
      - BACKUP_KEEP_DAYS=7
      - BACKUP_KEEP_WEEKS=4
      - BACKUP_KEEP_MONTHS=6
      - HEALTHCHECK_PORT=81
6

Ein anderer Ansatz (basierend auf docker-postgresql-workflow )

Lokale laufende Datenbank (nicht im Docker, aber der gleiche Ansatz würde funktionieren) zum Exportieren:

pg_dump -F c -h localhost mydb -U postgres export.dmp

Zu importierende Containerdatenbank:

docker run -d -v /local/path/to/postgres:/var/lib/postgresql/data postgres #ex runs container as `CONTAINERNAME` #find via `docker ps`
docker run -it --link CONTAINERNAME:postgres  --volume $PWD/:/tmp/  postgres  bash -c 'exec pg_restore -h postgres -U postgres -d mydb -F c /tmp/sonar.dmp'
5
sjakubowski

Ich hatte dieses Problem, als ich versuchte, eine Datenbank mit db_dump wiederherzustellen. Normalerweise verwende ich dbeaver zum Wiederherstellen - habe jedoch einen psql-Dump erhalten und musste daher eine Methode zum Wiederherstellen mithilfe des Docker-Containers finden.

Die von Forth empfohlene und von Soviut herausgegebene Methode hat für mich funktioniert:

cat your_dump.sql | docker exec -i your-db-container psql -U postgres -d dbname

(da dies ein Single-DB-Dump war und nicht mehrere DBs, habe ich den Namen eingefügt)

Um dies zum Laufen zu bringen, musste ich mich jedoch auch mit der virtuellen Umgebung befassen, in der sich der Docker-Container und das Projekt befanden. Dies entging mir für eine Weile, bevor ich herausfand, dass der folgende Docker-Fehler auftrat.

read unix @->/var/run/docker.sock: read: connection reset by peer

Dies kann durch die Datei /var/lib/docker/network/files/local-kv.db verursacht werden. Ich kenne die Richtigkeit dieser Aussage nicht. Ich hatte also nicht diese Datei, nach der ich gesucht habe, unter Verwendung von Forths Antwort.

Ich navigierte dann zum richtigen Verzeichnis (mit dem Projekt), aktivierte das virtuelle env und ließ dann die angenommene Antwort laufen. Boom, arbeitete wie ein Top. Hoffe das hilft jemand anderem da draußen!

3
activereality