备份/恢复dockerized PostgreSQL数据库

时间:2014-07-13 01:10:39

标签: database postgresql backup docker

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

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

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

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

11 个答案:

答案 0 :(得分:310)

备份数据库

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

答案 1 :(得分:13)

好的,我已经弄明白了。 Postgresql在启动后没有检测到文件夹/ var / lib / postgresql的更改,至少不是我希望它检测到的那种更改。

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:4)

另一种方法(基于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'

答案 4 :(得分:4)

备份数据库

生成sql:

  • docker exec -t your-db-container pg_dumpall -c -U your-db-user > dump_$(date +%Y-%m-%d_%H_%M_%S).sql

为减少sql的大小,您可以生成一个compress:

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

答案 5 :(得分:3)

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

答案 6 :(得分:2)

在尝试使用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,然后运行接受的答案。景气,像顶一样。希望这可以帮助其他人!

答案 7 :(得分:2)

dksnaphttps://github.com/kelda/dksnap)自动运行pg_dumpall并通过/docker-entrypoint-initdb.d加载转储的过程。

它将显示正在运行的容器的列表,并选择要备份的容器。生成的工件是常规的Docker映像,因此您可以docker run对其进行处理,或将其推送到Docker注册表中进行共享。

(免责声明:我是该项目的维护者)

答案 8 :(得分:1)

这是为我工作的命令。

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

答案 9 :(得分:1)

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

docker exec -t <postgres-container-name> pg_dump --no-owner -U <db-username> <db-name> > file-name-to-backup-to.sql

答案 10 :(得分:0)

我想添加 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"

您可以使用上述技术使用您喜欢的工具自动进行备份、迁移和恢复测试。