备份/恢复一个运行在Docker中的PostgreSQL数据库

365

我正在尝试按照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 

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


1
https://dev59.com/k10b5IYBdhLWcg3wENmK#59215489 - Omid Raha
15个回答

2
另一种方法是从主机运行pg_restore命令(当然,如果您的主机上安装了postgres)。假设您在docker-compose文件中为postgres服务设置了端口映射“5436:5432”。有了这个端口映射,您就可以通过主机的端口5436访问容器中运行在端口5432上的postgres。
pg_restore -h localhost -p 5436 -U <POSTGRES_USER> -d <POSTGRES_DB>  /Path/to/the/.psql/file/in/your/host_machine 

这样,您就不必深入到容器的终端或将转储文件复制到容器中。

2
这是对我起作用的命令。
cat your_dump.sql | sudo docker exec -i {docker-postgres-container} psql -U {user} -d {database_name}

for example

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 - Mohamed Ali

1

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

1

docker-compose用户的解决方案:

  1. 首先使用以下任一命令之一运行docker-compose文件:$ docker-compose -f local.yml up$ docker-compose -f local.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

希望这可以帮助像我一样迷失的人。

N.B: 可以在此处找到此解决方案的完整详情。


0

我想添加官方的Docker文档备份和恢复。这适用于卷中的所有数据类型,而不仅仅是PostgreSQL。

备份容器

创建一个名为dbstore的新容器:

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

然后在下一个命令中,我们:

  • 启动一个新容器并挂载dbstore容器的卷

  • 将本地主机目录挂载为/backup

  • 传递一个命令,将dbdata卷的内容打包成backup.tar文件,并存储到我们的/backup目录中。

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

您可以使用上述技术来使用您喜欢的工具自动化备份、迁移和还原测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接