สำรอง / กู้คืนฐานข้อมูล PostgreSQL ที่เชื่อมต่อแล้ว


156

ฉันพยายามสำรอง / กู้คืนฐานข้อมูล PostgreSQL ตามที่อธิบายไว้ในเว็บไซต์ Docker แต่ข้อมูลไม่ได้รับการกู้คืน

ไดรฟ์ข้อมูลที่ใช้โดยอิมเมจฐานข้อมูลคือ:

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

และ CMD คือ:

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"]

ฉันสร้างคอนเทนเนอร์ DB ด้วยคำสั่งนี้:

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

จากนั้นฉันเชื่อมต่อคอนเทนเนอร์อื่นเพื่อแทรกข้อมูลด้วยตนเอง:

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>

สร้างไฟล์เก็บถาวร tar แล้ว:

$ 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

ตอนนี้ฉันลบคอนเทนเนอร์ที่ใช้สำหรับ db และสร้างอีกอันด้วยชื่อเดียวกันและลองกู้คืนข้อมูลที่แทรกไว้ก่อนหน้านี้:

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

แต่ตารางว่างเปล่าเหตุใดข้อมูลจึงไม่ถูกกู้คืนอย่างถูกต้อง


คำตอบ:


457

สำรองฐานข้อมูลของคุณ

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

กู้คืนฐานข้อมูลของคุณ

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

2
ใช่นั่นเป็นวิธี postgres ที่จะทำ แต่ฉันคิดว่าวิธี docker ควรเป็นที่ต้องการเมื่อคุณใช้มัน
Carl Levasseur

42
หากต้องการประหยัดพื้นที่บนดิสก์คุณอาจต้องการdocker exec -t your-db-container pg_dumpall -c -U postgres | gzip > /var/data/postgres/backups/dump_ไพพ์ดัมพ์ไปยัง gzip: วันที่ +% d-% m-% Y "_"% H_% M_% S.gz
Tarion

1
เพียงเปิดเครื่องรูดข้อมูลก่อนที่จะกู้คืน ในการทำเช่นนี้คุณจะต้องแทนที่cat your_dump.sqlด้วยคำสั่ง unzip และไปป์ที่แทนที่จะเป็นcatผลลัพธ์ที่นักเทียบท่า exec
Tarion

2
รูปแบบวันที่จะเลอะดังนั้นตรวจสอบอีกครั้งก่อนที่คุณจะคัดลอกและวาง
vidstige

1
สำหรับผู้ที่ไม่สามารถหาวิธีการจัดรูปแบบวันที่ทำงาน: docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
1230795

18

ฉันคิดว่าคุณสามารถใช้ potgres container container ซึ่งจะสำรองฐานข้อมูลของคุณภายในระยะเวลาที่กำหนด

  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
      - SCHEDULE=@every 0h30m00s
      - BACKUP_KEEP_DAYS=7
      - BACKUP_KEEP_WEEKS=4
      - BACKUP_KEEP_MONTHS=6
      - HEALTHCHECK_PORT=81

1
ทำงานได้อย่างสมบูรณ์แบบ! ขอบคุณ
CaM2091

15

โอเคฉันคิดออกแล้ว Postgresql ตรวจไม่พบการเปลี่ยนแปลงในโฟลเดอร์ / var / lib / postgresql เมื่อเปิดใช้งานอย่างน้อยก็ไม่ใช่การเปลี่ยนแปลงที่ฉันต้องการให้ตรวจพบ

วิธีแรกคือการเริ่มต้นคอนเทนเนอร์ด้วย bash แทนที่จะเริ่มเซิร์ฟเวอร์ postgres โดยตรงกู้คืนข้อมูลจากนั้นเริ่มเซิร์ฟเวอร์ด้วยตนเอง

ทางออกที่สองคือการใช้ที่เก็บข้อมูล ก่อนหน้านี้ฉันไม่เคยได้รับสิ่งนี้มาก่อน ที่เก็บข้อมูลนี้อนุญาตให้กู้คืนข้อมูลก่อนเริ่มต้นคอนเทนเนอร์ postgres ดังนั้นเมื่อเซิร์ฟเวอร์ postgres เริ่มทำงานข้อมูลจะมีอยู่แล้ว


1
flocker หรือขบวนอาจช่วยในการจัดการคอนเทนเนอร์ข้อมูล
Forth

24
กรุณากรอกรายละเอียดเพิ่มเติม ฟังดูเหมือนร่างของโซลูชันมากกว่าโซลูชันจริง
nafg

5

วิธีอื่น (ขึ้นอยู่กับdocker-postgresql-เวิร์กโฟลว์ )

ฐานข้อมูลที่รันอยู่ภายในเครื่อง (ไม่ใช่ในนักเทียบท่า แต่จะใช้วิธีการเดียวกันในการส่งออก)

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

ฐานข้อมูลคอนเทนเนอร์ที่จะนำเข้า:

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'

1
สิ่งนี้ใช้ได้กับฉัน: pg_dump mydb -U postgres > export.psqlในนักเทียบท่าคอนเทนเนอร์ทุบตี
Sepultura

3

ฉันมีปัญหานี้ในขณะที่พยายามใช้ db_dump เพื่อกู้คืนฐานข้อมูล ปกติฉันจะใช้ dbeaver เพื่อกู้คืน - อย่างไรก็ตามได้รับ psql dump ดังนั้นจึงต้องหาวิธีในการกู้คืนโดยใช้ container docker

วิธีการที่แนะนำโดย Forth และแก้ไขโดย Soviut ทำให้ฉัน:

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

(เนื่องจากนี่เป็นดัมพ์ db เดียวและไม่ใช่หลาย db ของ i ที่รวมชื่อ)

อย่างไรก็ตามเพื่อให้มันทำงานได้ฉันต้องไปยัง virtualenv ที่ docker container และโปรเจ็กต์เข้ามาสิ่งนี้ eluded ฉันสักหน่อยก่อนที่จะหามันเพราะฉันได้รับข้อผิดพลาด docker ต่อไปนี้

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

สิ่งนี้อาจเกิดจากไฟล์ /var/lib/docker/network/files/local-kv.db. ฉันไม่ทราบความถูกต้องของคำสั่งนี้: แต่ฉันเชื่อว่าฉันเห็นสิ่งนี้เพราะฉันไม่ได้ใช้ docker ในเครื่อง, ดังนั้นจึงไม่มีไฟล์นี้ซึ่งมันค้นหาโดยใช้คำตอบของ Forth

จากนั้นฉันไปที่ไดเรกทอรีที่ถูกต้อง (พร้อมโปรเจค) เปิดใช้งาน virtualenv และรันคำตอบที่ยอมรับ บูมทำงานเหมือนด้านบน หวังว่านี่จะช่วยให้คนอื่นออกไป!


1

นี่คือคำสั่งที่ใช้งานได้สำหรับฉัน

cat your_dump.sql | sudo docker exec -i {docker-postgres-container} psql -U {user} -d {database_name}

ตัวอย่างเช่น

cat table_backup.sql | docker exec -i 03b366004090 psql -U postgres -d postgres

การอ้างอิง : โซลูชั่นที่ได้รับจากGMartinez-Sistiในการสนทนานี้ https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b


1

cat db.dump | docker exec ...วิธีนี้ใช้ไม่ได้กับการถ่ายโอนข้อมูลของฉัน (~ 2Gb) ใช้เวลาสองสามชั่วโมงและจบลงด้วยข้อผิดพลาดออกจากหน่วยความจำ

แต่ฉันถ่ายโอน cp'ed ลงในคอนเทนเนอร์แทนและ pg_restore'ed จากภายใน

สมมติว่า ID คอนเทนเนอร์คือCONTAINER_IDและชื่อ db คือDB_NAME:

# copy dump into container
docker cp local/path/to/db.dump CONTAINER_ID:/db.dump

# shell into container
docker exec -it CONTAINER_ID bash

# restore it from within
pg_restore -U postgres -d DB_NAME --no-owner -1 /db.dump

0

dksnap( https://github.com/kelda/dksnap ) ทำให้กระบวนการทำงานโดยอัตโนมัติpg_dumpallและโหลดการถ่ายโอนข้อมูลผ่าน/docker-entrypoint-initdb.dและการโหลดการถ่ายโอนข้อมูลผ่านทาง

มันแสดงให้คุณเห็นรายการของภาชนะบรรจุที่ใช้งานและคุณเลือกที่คุณต้องการสำรองข้อมูล สิ่งประดิษฐ์ที่เกิดขึ้นเป็นภาพนักเทียบท่าปกติดังนั้นคุณจึงสามารถdocker runหรือแชร์ได้โดยการกดไปที่รีจิสตรี Docker

(ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้ดูแลโครงการ)


0

คำสั่งด้านล่างสามารถใช้ในการถ่ายโอนข้อมูลจากคอนเทนเนอร์ postgress นักเทียบท่า

docker exec -t <postgres-container-name> pg_dump --no-owner -U <db-username> <db-name> > file-name-to-backup-to.sql
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.