[英]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 卷上使用文件系統級備份
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:
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
復制到第二台主機
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
用戶解決方案:
$ docker-compose -f loca.yml up
文件docker-compose -f loca.yml up -d
$ docker-compose -f local.yml exec postgres backup
$ docker-compose -f local.yml exec postgres backups
$ docker ps
postgres
圖像的CONTAINER ID並復制該 ID。 假設CONTAINER ID是: ba78c0f9bcee$ 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.