我正在尝试按照 Docker 网站上的说明备份/恢复 PostgreSQL 数据库,但数据未恢复。
数据库映像使用的卷是:
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
docker-compose
文件。 docs.docker.com/compose
备份数据库
生成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
恢复数据库
猫 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:这是对我有用的东西的汇编,以及我从这里和其他地方得到的东西。我开始做出贡献,任何反馈将不胜感激。
cat db.dump | docker exec ...
方式不适用于我的转储 (~2Gb)。花了几个小时,最终出现内存不足错误。
相反,我 cp'ed 转储到容器中并从内部 pg_restore'ed 。
假设容器 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
cat /home/db.sql | psql -U postgres -d DB_NAME -p DB_PORT
应用了转储)
cat db.dum |...
完全相同的问题
好的,我已经想通了。 Postgresql 启动后不会检测到文件夹 /var/lib/postgresql 的更改,至少不是我希望它检测到的那种更改。
第一种解决方案是用bash启动一个容器,而不是直接启动postgres服务器,恢复数据,然后手动启动服务器。
第二种解决方案是使用数据容器。以前没看明白,现在明白了。此数据容器允许在启动 postgres 容器之前恢复数据。因此,当 postgres 服务器启动时,数据已经存在。
以下命令可用于从 docker postgress 容器中获取转储
docker exec -t <postgres-container-name> pg_dump --no-owner -U <db-username> <db-name> > file-name-to-backup-to.sql
最佳答案对我不起作用。我不断收到此错误:
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-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'
pg_dump mydb -U postgres > export.psql
在 docker 容器 bash
我在尝试使用 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 映像,因此您可以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
cat your_dump.sql | sudo docker exec -i {docker-postgres-container} psql -U {user} -d {database_name}
时,我在终端返回 invalid command \N
我想为 backups and restores 添加官方 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" 您可以使用上述技术自动执行备份、迁移和恢复测试您的首选工具。
在 Docker 卷上使用文件系统级备份
示例 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:
备份 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
用户的解决方案:
首先通过以下任一命令运行 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
希望这会帮助像我一样迷路的人..
注意:可以在 here 中找到此解决方案的完整详细信息。
不定期副业成功案例分享
docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > /var/data/postgres/backups/dump_
date +%d-%m-%Y"_"%H_%M_%S.gz
cat your_dump.sql
替换为 unzip 命令并将其而不是cat
结果通过管道传递给 docker exec。docker exec -t your-db-container pg_dumpall -c -U postgres | gzip > ./tmp/dump_$(date +"%Y-%m-%d_%H_%M_%S").gz
-d your-db-name
添加到还原命令如果您的数据库未命名为postgres
。