PostgreSQL 14:pg_dump完成后仍有分区表COPY进程阻塞DDL操作
问题分析与解决
核心原因
并行模式下的pg_dump主进程与子进程生命周期不同步:
- 当使用
-j 10开启并行备份时,主进程仅负责协调子进程启动、导出全局元数据、管理备份目录结构,一旦这些任务完成,主进程就会退出,命令行显示“备份完成”,但负责导出分区表数据的子进程可能还在后台执行COPY操作(尤其是分区表数据量较大时,-Z 9的高压缩也会增加处理时间)。 -Fd(目录格式备份)的设计逻辑是主进程先完成元数据文件的生成,子进程异步写入各表的数据文件,主进程不会等待所有子进程完成就提前退出。
验证方式
- 检查剩余进程:执行
ps aux | grep pg_dump,确认残留的COPY进程是否属于之前的备份任务(可通过进程的父PID关联主进程)。 - 监控备份目录:查看备份目录下的
.dat.gz数据文件,若文件大小仍在增长,说明子进程还在写入数据。
解决办法
- 等待所有pg_dump进程结束:
不要依赖命令行的完成提示,用脚本监控所有pg_dump进程退出后再执行后续操作:# 循环等待所有pg_dump进程终止 while pgrep -x pg_dump > /dev/null; do sleep 3 echo "Waiting for remaining pg_dump processes to finish..." done - 关闭并行备份:
如果不需要并行加速,去掉-j 10参数,主进程会等待所有数据导出完成后才退出,命令行提示完成时所有备份操作都已结束,但备份速度会降低。 - 优化备份策略:
对于超大分区表,可单独备份该表,或降低压缩级别(比如-Z 5)减少子进程的处理时间,避免长时间阻塞后续操作。
内容的提问来源于stack exchange,提问作者Dan J
相关产品推荐
相关产品推荐

