首页 文章

备份/恢复dockerized PostgreSQL数据库

提问于
浏览
67

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

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

3 回答

  • 10

    备份数据库

    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
    
  • 4

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

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

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

  • 243

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

相关问题