簡體   English   中英

備份/恢復 dockerized PostgreSQL 數據庫

[英]Backup/Restore a dockerized PostgreSQL database

我正在嘗試備份/恢復 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"]

我使用以下命令創建數據庫容器:

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

現在我刪除用於數據庫的容器並創建另一個同名的容器,並嘗試恢復之前插入的數據:

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

但是表是空的,為什么數據沒有正確恢復?

備份您的數據庫

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

我認為您還可以使用 postgres 備份容器,它可以在給定的時間內備份​​您的數據庫。

  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

備份數據庫

生成sql:

  • docker exec -t your-db-container pg_dumpall -c -U your-db-user > dump_$(date +%Y-%m-%d_%H_%M_%S).sql

要減小 sql 的大小,您可以生成壓縮:

  • docker exec -t your-db-container pg_dumpall -c -U your-db-user | gzip > ./dump_$(date +"%Y-%m-%d_%H_%M_%S").gz

恢復數據庫

  • cat your_dump.sql | docker exec -i your-db-container psql -U your-db-user -d your-db-name

恢復壓縮的 sql:

  • gunzip < your_dump.sql.gz | docker exec -i your-db-container psql -U your-db-user -d your-db-name

PD:這是對我有用的東西的匯編,以及我從這里和其他地方得到的東西。 我開始做出貢獻,任何反饋將不勝感激。

好的,我已經想通了。 Postgresql 在啟動后不會檢測到文件夾 /var/lib/postgresql 的更改,至少不是我希望它檢測到的那種更改。

第一種解決方案是用bash啟動一個容器,而不是直接啟動postgres服務器,恢復數據,然后手動啟動服務器。

第二種解決方案是使用數據容器。 以前沒看懂,現在懂了。 這個數據容器允許在啟動 postgres 容器之前恢復數據。 因此,當 postgres 服務器啟動時,數據已經在那里了。

cat db.dump | docker exec ... cat db.dump | docker exec ...方式對我的轉儲(~2Gb)不起作用。 花了幾個小時,最終出現內存不足錯誤。

相反,我將 cp 轉儲到容器中,然后從內部進行 pg_restore 處理。

假設容器 id 是CONTAINER_ID並且數據庫名稱是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

另一種方法(基於docker-postgresql-workflow

本地運行的數據庫(不在 docker 中,但同樣的方法也可以)導出:

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'

以下命令可用於從 docker postgress 容器中獲取轉儲

docker exec -t <postgres-container-name> pg_dump --no-owner -U <db-username> <db-name> > file-name-to-backup-to.sql

我在嘗試使用 db_dump 恢復數據庫時遇到了這個問題。 我通常使用 dbeaver 進行恢復 - 但是收到了 psql 轉儲,因此必須找出使用 docker 容器進行恢復的方法。

Forth 推薦並由 Soviut 編輯的方法對我有用:

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

(因為這是一個單一的數據庫轉儲而不是多個數據庫,我包括了名稱)

然而,為了讓它工作,我還必須進入 docker 容器和項目所在的 virtualenv。在弄清楚之前,這讓我有點困惑 - 因為我收到了以下 docker 錯誤。

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

這可能是由文件 /var/lib/docker/network/files/local-kv.db 引起的。我不知道此聲明的准確性:但我相信我看到了這一點,因為我沒有在本地使用 docker,因此,使用 Forth 的答案,沒有它正在尋找的這個文件。

然后我導航到正確的目錄(使用項目)激活 virtualenv,然后運行接受的答案。 繁榮,工作得像個陀螺。 希望這可以幫助其他人!

dksnap ( https://github.com/kelda/dksnap ) 自動化運行pg_dumpall並通過/docker-entrypoint-initdb.d加載轉儲的/docker-entrypoint-initdb.d

它會向您顯示正在運行的容器列表,您可以選擇要備份的容器。 生成的工件是一個常規的 Docker 映像,因此您可以docker run它,或者通過將其推送到 Docker 注冊表來共享它。

(免責聲明:我是該項目的維護者)

這是對我有用的命令。

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

我想添加用於備份和恢復的官方 docker 文檔。 這適用於卷中的所有類型的數據,而不僅僅是 postegres。

備份一個容器

創建一個名為 dbstore 的新容器:

 $ docker run -v /dbdata --name dbstore ubuntu /bin/bash

然后在下一個命令中,我們:

  • 啟動一個新容器並從 dbstore 容器掛載卷

  • 將本地主機目錄掛載為 /backup

  • 將一個將 dbdata 卷的內容壓縮到 /backup 目錄中的 backup.tar 文件的命令傳遞。

    $ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

當命令完成且容器停止時,我們將保留 dbdata 卷的備份。

從備份恢復容器

使用剛剛創建的備份,您可以將其恢復到同一個容器或您在其他地方創建的另一個容器。

例如,創建一個名為 dbstore2 的新容器:

 $ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash

然后在新容器的數據卷中解壓備份文件:

 $ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

您可以使用上述技術使用您喜歡的工具自動進行備份、遷移和恢復測試。

最佳答案對我不起作用。 我不斷收到此錯誤:

psql: error: FATAL:  Peer authentication failed for user "postgres"

為了讓它工作,我必須為 docker 容器指定一個用戶:

備份

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

恢復

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

在 Docker 卷上使用文件系統級備份

Docker Compose 示例

version: "3.9"

services:
  db:
    container_name: pg_container
    image: platerecognizer/parkpow-postgres
    # restart: always
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
      POSTGRES_DB: admin

volumes:
  postgres_data:

備份 Postgresql 卷

docker run --rm \
   --user root \
   --volumes-from pg_container \
   -v /tmp/db-bkp:/backup \
   ubuntu tar cvf /backup/db.tar /var/lib/postgresql/data

然后將/tmp/db-bkp復制到第二台主機

恢復 Postgresql 卷

docker run --rm \
   --user root \
   --volumes-from pg_container \
   -v /tmp/db-bkp:/backup \
   ubuntu bash -c "cd /var && tar xvf /backup/db.tar --strip 1"

docker-compose用戶解決方案:

  1. 首先,通過以下任一命令運行$ docker-compose -f loca.yml up文件docker-compose -f loca.yml up -d
  2. 備份: $ docker-compose -f local.yml exec postgres backup
  3. 查看容器內的備份列表: $ docker-compose -f local.yml exec postgres backups
  4. 打開另一個終端並運行以下命令: $ docker ps
  5. 查找postgres圖像的CONTAINER ID並復制該 ID。 假設CONTAINER ID是: ba78c0f9bcee
  6. 現在將該備份帶入本地文件系統,運行以下命令: $ docker cp ba78c0f9bcee:/backups./local_backupfolder

希望這會幫助像我一樣迷路的人..

注意:可以在此處找到此解決方案的完整詳細信息。

另一種方法是從主機運行 pg_restore(當然,如果您在主機中設置了 postgres)命令。

假設您的 docker-compose 文件中有 postgres 服務的端口映射“5436:5432”。 有了這個端口映射,您就可以通過主機的端口 5436 訪問容器的 postgres(在端口 5432 上運行)

pg_restore -h localhost -p 5436 -U <POSTGRES_USER> -d <POSTGRES_DB>  /Path/to/the/.psql/file/in/your/host_machine 

這樣您就不必深入容器的終端或將轉儲文件復制到容器中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM