使用FIFO文件实现pg_dump直连pg_restore的PostgreSQL迁移可行性问询
PostgreSQL无中间文件全库迁移方案
完全可以通过管道(含FIFO命名管道)直接将pg_dump的自定义格式输出定向到pg_restore,不需要生成中间dump文件,完美支持全库迁移场景,还能重叠导出、传输的耗时,总耗时可从原流程的9小时20分钟压缩到6小时左右。
具体实现方式
跨服务器迁移(适配你的场景)
你之前用到的FIFO逻辑可以直接优化,不需要落地dump文件,推荐两种可直接用的方案:
- SSH隐式管道方案(无需手动创建FIFO,操作最简单)
直接在新服务器上执行单条命令即可完成全流程:
ssh 旧服务器IP "pg_dump -Fc -U 旧库账号 旧库名" | pg_restore -U 新库账号 -d 新库名
- 显式FIFO方案(适合需要单独监控传输、导出进度的场景)
- 在新服务器上创建FIFO文件:
mkfifo /tmp/pg_transfer.fifo - 新服务器后台启动pg_restore从FIFO读取数据:
pg_restore -U 新库账号 -d 新库名 < /tmp/pg_transfer.fifo & - 新服务器同时执行SSH拉取旧库导出结果写入FIFO:
ssh 旧服务器IP "pg_dump -Fc -U 旧库账号 旧库名" > /tmp/pg_transfer.fifo
同机多实例迁移(如果是同一设备上的实例迁移用)
直接用本地管道即可,操作更简便:
pg_dump -Fc -U 账号 源库名 | pg_restore -U 账号 -d 目标库名
注意事项&优化建议
- 提前配置好新旧服务器的SSH免密登录、PostgreSQL的
.pgpass免密认证,避免命令执行过程中断需要输入密码 - 给
pg_restore加-j 并发数参数,按新服务器CPU核心数设置(比如8核服务器可以设为-j 6),导入速度最高可提升70%,进一步压缩总耗时 - 你之前测试SQL格式+psql导入不适配全库的原因是:纯SQL格式不支持并行恢复,大库导出的纯SQL体积大、处理效率低,换成
-Fc自定义格式对接pg_restore后不存在这个问题,完全支持全库的表、索引、约束、权限、插件等所有对象的迁移
内容的提问来源于stack exchange,提问作者IFE
相关产品推荐
相关产品推荐

