使用Heroku pg:pull进行脱机状态数据库迁移的相关问题咨询
问题1解答
pg:pull的数据流全程经过运行Heroku CLI的本地设备,没有走Heroku内部点对点传输链路。- 命令底层是在本地隐式调用
pg_dump拉取源库数据到本地缓存,再调用pg_restore将本地缓存的数据上传到目标库,迁移速度完全受限于本地设备的上下行带宽,这也是你观测到写入速度极慢的核心原因。
问题2解答
- 原生
heroku pg:pull命令不支持脱离本地进程运行,必须保持本地CLI进程活跃、网络稳定不中断才能完成迁移,一旦本地断网或进程终止,迁移任务会直接失败且无法续传。
问题3解答
你提到的从库切换方案是效率最高的选择,此前操作失败大概率是流程遗漏,另外还有其他适配你的场景的高优方案:
方案1:只读从库提升方案(无表数据过滤需求时优先选)
全程走Heroku内部链路,迁移速度可达GB/分钟级别,无需本地在线:
- 在目标应用下创建源库的只读同步从库:
heroku addons:create heroku-postgresql:<源库对应的实例规格> --follow $(heroku config:get DATABASE_URL -a my-source-app) -a my-target-app
- 执行
heroku pg:info -a my-target-app查看从库同步状态,等显示Following / Catchup complete后,执行命令解除同步、将从库提升为独立可写实例:
heroku pg:unfollow <新创建从库的配置变量名,如HEROKU_POSTGRESQL_XXX_URL> -a my-target-app
- 将目标应用的默认数据库指向新实例:
heroku pg:promote <新实例的配置变量名> -a my-target-app
方案2:备份跨应用恢复方案(有表数据过滤需求时优先选)
同样走内部链路,支持排除指定表数据:
- 给源库创建手动备份:
heroku pg:backups:capture -a my-source-app
- 获取备份的临时下载地址后,直接在目标应用执行带过滤规则的恢复:
heroku pg:backups:restore <备份下载URL> DATABASE_URL --exclude-table-data='table5;table9' -a my-target-app
方案3:Detached dyno运行迁移(自定义需求适配)
如果有其他自定义过滤逻辑,可以在Heroku的一次性dyno中运行迁移任务,完全脱离本地环境:
提前将源库和目标库的连接地址配置为你要运行任务的应用的环境变量SOURCE_DB_URL、TARGET_DB_URL,之后执行:
heroku run:detached --size=performance-l 'apt update && apt install -y postgresql-client && pg_dump $SOURCE_DB_URL --exclude-table-data="table5;table9" | psql $TARGET_DB_URL' -a my-target-app
内容的提问来源于stack exchange,提问作者Ollie Bennett
相关产品推荐
相关产品推荐

