我正在尝试备份/恢复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"]

我用下面的命令创建DB容器:

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

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

$ 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

其他回答

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

我在尝试使用db_dump恢复数据库时遇到了这个问题。我通常使用dbeaver来恢复-但是收到一个psql转储,所以必须想出一个方法来恢复使用docker容器。

Forth推荐并由soviet编辑的方法对我很有效:

猫your_dump。sql | docker exec -i your-db-container psql -U postgres -d dbname

(因为这是一个单一的db转储,而不是多个db,我包括了名称)

然而,为了让它工作,我还必须进入docker容器和项目所在的virtualenv。这回避了我一点之前弄清楚-因为我收到以下docker错误。

读取Unix @->/var/run/docker。Sock: read:由对等体重置连接

这可能是由文件/var/lib/docker/network/files/local-kv.db引起的。我不知道这句话的准确性:但我相信我看到了这一点,因为我不在本地使用docker,因此没有这个文件,它正在寻找,使用Forth的答案。

然后我导航到正确的目录(与项目)激活virtualenv,然后运行接受的答案。砰,像陀螺一样工作。希望这能帮助到其他人!

我认为您还可以使用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

另一种方法是从主机上运行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 

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

上面那个答案对我没用。我一直得到这个错误:

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