Docker环境下PostgreSQL容器pg_dumpall备份恢复报错如何解决
正确PostgreSQL Docker全量备份&恢复方案
错误原因梳理
- 备份、恢复命令的
docker exec参数顺序错误:-u(指定运行用户)是docker exec的原生参数,必须放在容器ID之前,你之前写在容器ID之后会被识别为要执行的命令的参数,触发OCI运行时错误 - 你第一次生成的
dumptest.sql实际保存的是备份命令执行的报错内容,不是合法的PostgreSQL备份SQL,直接导入会触发语法错误 - 后续修改时
/bin/bash的调用方式错误:缺少-c参数指定要执行的命令字符串,导致bash将psql二进制文件当做shell脚本解析,触发use: command not found等语法报错
正确全量备份&恢复操作
1. 生成合法全量备份文件
全量备份会导出容器内所有数据库、schema、表、角色权限、配置,命令如下:
# 格式:docker exec -u <PG用户名> <源容器ID> pg_dumpall > <本地备份文件路径> docker exec -u admin 3d7de2fb2d7a pg_dumpall > dumptest.sql
Windows环境请在PowerShell中执行上述命令,避免cmd默认编码导致备份文件损坏
备份完成后可以执行head -n 20 dumptest.sql(Windows PowerShell执行Get-Content dumptest.sql -Head 20)确认文件开头是标准的PostgreSQL备份注释内容,没有OCI相关报错信息。
2. 执行全量恢复
先确认目标PostgreSQL容器处于正常运行状态,执行以下命令导入:
# 通用格式:cat <本地备份文件路径> | docker exec -i -u <PG用户名> <目标容器ID> psql -U <PG用户名> -d postgres # Linux/Mac环境执行 cat ./dumptest.sql | docker exec -i -u admin bec713662fb6 psql -U admin -d postgres # Windows PowerShell环境执行 Get-Content .\dumptest.sql | docker exec -i -u admin bec713662fb6 psql -U admin -d postgres
如果需要通过bash执行(部分定制化PG镜像需要),使用以下正确格式:
cat ./dumptest.sql | docker exec -i -u admin bec713662fb6 /bin/bash -c "psql -U admin -d postgres"
常见问题排查
- 导入时报角色不存在:确认备份时的PG用户名和目标容器的PG用户名一致,或者目标容器提前创建对应的超级用户
- 导入乱码:确认备份文件编码为UTF-8,执行导入时可以在psql参数后添加
-v ON_ERROR_STOP=1遇到错误立即终止,方便定位问题 - 导入时间过长:大库恢复可以在恢复前临时调整目标PG的
maintenance_work_mem等参数提升恢复速度
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

