备份/恢复dockerized PostgreSQL数据库

Car*_*eur 112 database postgresql backup docker

我正在尝试备份/恢复PostgreSQL数据库,如Docker网站上所述,但数据未恢复.

数据库映像使用的卷是:

VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
Run Code Online (Sandbox Code Playgroud)

而且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"]
Run Code Online (Sandbox Code Playgroud)

我用这个命令创建数据库容器:

docker run -it --name "$DB_CONTAINER_NAME" -d "$DB_IMAGE_NAME"
Run Code Online (Sandbox Code Playgroud)

然后我连接另一个容器来手动插入一些数据:

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>
Run Code Online (Sandbox Code Playgroud)

然后创建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
Run Code Online (Sandbox Code Playgroud)

现在我删除用于db的容器并创建另一个具有相同名称的容器,并尝试恢复之前插入的数据:

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

但表是空的,为什么数据没有正确恢复?

小智 364

备份数据库

docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql
Run Code Online (Sandbox Code Playgroud)

恢复数据库

cat your_dump.sql | docker exec -i your-db-container psql -U postgres
Run Code Online (Sandbox Code Playgroud)

  • 要在磁盘上节省一些空间,您可能希望将转储管道传输到gzip:`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` (29认同)
  • 对于那些无法弄清楚如何使日期格式正常工作的人:`docker exec -t your-db-container pg_dumpall -c -U postgres | gzip &gt; ./tmp/dump_$(日期 +"%Y-%m-%d_%H_%M_%S").gz` (8认同)
  • 恢复数据库时,如果您的数据库未命名为“postgres”,请确保将“-d your-db-name”添加到恢复命令中。 (8认同)
  • 只需在恢复之前解压缩数据即可。要将其作为一个衬垫来完成,您必须将 `cat your_dump.sql` 替换为 unzip 命令,并将其而不是 `cat` 结果通过管道传输到 docker exec。 (3认同)
  • 日期格式搞砸了,所以在复制和粘贴之前仔细检查一下。 (3认同)
  • 使用给定的命令,如果您的数据库包含 UTF-8 字符,您可能会遇到一个丑陋的惊喜。有关更多详细信息和解决方案,请参阅[此问题](/sf/ask/4475439951/)。 (3认同)
  • 是的,这是postgres的方法,但是我认为使用docker方法时应始终首选 (2认同)
  • Docker 通常是对正在运行的进程的一种阴险、低质量、存在漏洞的抽象。我花了一个多小时才完成这个简单的任务,答案是在正常的 postgres 流程中从未使用过的东西,我们必须这样做,因为 docker 不支持更好的命令执行。 (2认同)

小智 27

备份数据库

生成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:这是对我有用的东西的汇编,以及我从这里和其他地方得到的东西。我开始做出贡献,任何反馈将不胜感激。


Car*_*eur 15

好的,我已经弄明白了.Postgresql一旦启动就检测不到对文件夹/ var/lib/postgresql的更改,至少不是我希望它检测到的那种更改.

第一个解决方案是使用bash启动容器,而不是直接启动postgres服务器,还原数据,然后手动启动服务器.

第二种解决方案是使用数据容器.我以前没有明白这一点,现在我做到了.此数据容器允许在启动postgres容器之前还原数据.因此,当postgres服务器启动时,数据已经存在.

  • 请填写更多详细信息.这听起来更像是解决方案的草图,而不是实际的解决方案 (20认同)

Ale*_*eev 12

cat db.dump | docker exec ...方式不适用于我的转储(~2Gb)。花了几个小时,最终出现内存不足错误。

相反,我将 cp 转储到容器中,然后从内部进行 pg_restore 处理。

假设容器 idCONTAINER_ID和 db name 是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
Run Code Online (Sandbox Code Playgroud)


小智 9

最上面的答案对我不起作用。我不断收到此错误:

psql: error: FATAL:  Peer authentication failed for user "postgres"
Run Code Online (Sandbox Code Playgroud)

为了让它工作,我必须为 docker 容器指定一个用户:

备份

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

恢复

cat your_dump.sql | docker exec -i --user postgres your-db-container psql -U postgres
Run Code Online (Sandbox Code Playgroud)


小智 6

我认为您也可以使用potgres备份容器,该容器将在给定的时间内备份​​数据库。

  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
Run Code Online (Sandbox Code Playgroud)

  • 对于想要定期自动备份数据库的人来说非常有用。 (3认同)
  • 效果完美!谢谢 (2认同)

sja*_*ski 5

另一种方法(基于docker-postgresql-workflow

本地运行的数据库(不在docker中,但可以使用相同的方法)导出:

pg_dump -F c -h localhost mydb -U postgres export.dmp
Run Code Online (Sandbox Code Playgroud)

容器数据库导入:

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'
Run Code Online (Sandbox Code Playgroud)


Shu*_*ham 5

以下命令可用于从 docker postgress 容器中获取转储

docker exec -t <postgres-container-name> pg_dump --no-owner -U <db-username> <db-name> > file-name-to-backup-to.sql
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

83196 次

最近记录:

5 年,11 月 前