如何将Postgres备份文件导入Docker Postgres容器内的新数据库?
正确迁移Heroku Postgres备份到Docker Postgres容器的方法
你遇到的两个错误都是命令语法或用户权限的问题,下面一步步帮你解决:
先修正docker exec的语法错误
你第二次尝试的命令把-u参数放错位置了——docker exec的选项(比如-u)必须放在容器名称之前,正确的格式逻辑是:docker exec [选项] <容器名> <要执行的命令>。之前你把-u放在容器名后面,Docker会把-u当成要执行的命令,自然会报错找不到这个"可执行文件"。
再解决Postgres角色权限问题
第一个错误提示FATAL: role "root" does not exist,是因为默认用root用户执行pg_restore,而Postgres默认没有root这个数据库角色,必须使用Postgres认可的合法用户(比如默认的postgres用户,或者你自己创建的应用数据库用户)。
完整的迁移步骤
确认备份文件路径:你已经用
docker cp latest.dump mycontainer:/latest.dump把备份复制到了容器根目录,所以文件绝对路径是/latest.dump,执行命令时要写全路径,避免找不到文件。执行正确的恢复命令:
如果使用Postgres默认的postgres用户,命令如下:docker exec -u postgres <pg_container> pg_restore --no-owner --no-privileges -d <db_name> /latest.dump这里添加
--no-owner和--no-privileges参数是因为Heroku的备份文件会包含它自身的数据库角色信息,直接恢复可能触发权限报错,这两个参数可以跳过角色和权限的恢复,适配你的新容器环境。如果目标数据库不存在,先创建它:
要是你的<db_name>还没在容器里创建,先执行这条命令创建:docker exec -u postgres <pg_container> createdb -U postgres <db_name>
额外注意事项
- 确保你的Postgres容器已经正常启动,且
<db_user>确实拥有访问<db_name>的权限。 - 如果备份文件体积较大,恢复过程可能需要一段时间,耐心等待即可。
内容的提问来源于stack exchange,提问作者Emile
相关产品推荐
相关产品推荐

