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

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


当前回答

这是对我有用的命令。

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}

例如

cat table_backup.sql | docker exec -i 03b366004090 psql -U postgres -d postgres

参考:GMartinez-Sisti在讨论中给出的解决方案。 https://gist.github.com/gilyes/525cc0f471aafae18c3857c27519fc4b

docker-compose用户的解决方案:

At First run the docker-compose file by any on of following commands: $ docker-compose -f loca.yml up OR docker-compose -f loca.yml up -d For taking backup: $ docker-compose -f local.yml exec postgres backup To see list of backups inside container: $ docker-compose -f local.yml exec postgres backups Open another terminal and run following command: $ docker ps Look for the CONTAINER ID of postgres image and copy the ID. Let's assume the CONTAINER ID is: ba78c0f9bcee Now to bring that backup into your local file system, run the following command: $ docker cp ba78c0f9bcee:/backups ./local_backupfolder

希望这能帮助到像我一样迷路的人。

注意:这个解决方案的全部细节可以在这里找到。

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

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

备份数据库

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