升级到Postgres 14后使用heroku pg:pull无法拉取最新生产数据如何解决
问题核心原因
Postgres 14本身没有会导致跨版本拉取远端数据缺失的新增默认配置项,该问题本质是heroku pg:pull底层依赖的pg_dump/pg_restore工具的跨版本兼容问题,或本地PG14的默认校验规则导致新数据写入静默失败。
排查解决步骤
- 先验证导出备份本身是否包含新数据,排除heroku封装命令的问题。手动执行pg_dump导出全量备份:
打开导出的sql文件搜索10月10日之后的业务数据关键字,确认备份本身是否包含新数据。如果备份无新数据,说明是PG14的pg_dump --no-owner --no-privileges <Heroku数据库连接URL> > full_dump.sqlpg_dump对PG13的兼容问题,安装PG13版本的客户端工具后指定版本执行pull即可:
Ubuntu下安装PG13客户端:
执行指定版本的pull命令:sudo apt install postgresql-client-13PATH=/usr/lib/postgresql/13/bin:$PATH heroku pg:pull <HEROKU_POSTGRESQL_ADDON_NAME> <本地数据库名> - 如果手动导出的备份包含新数据,说明是本地恢复环节出问题。执行带详细日志的恢复命令查看错误:
大概率是PG14默认开启的函数体校验、更严格的外键约束规则导致部分新数据写入被拦截,临时关闭校验后再恢复即可:pg_restore --verbose --no-owner --no-privileges -d <本地数据库名> full_dump.sqlpsql -d <本地数据库名> -c "SET check_function_bodies = off;" - 如果上述步骤未解决,开启本地PG14的全量日志定位问题:修改
/etc/postgresql/14/main/postgresql.conf中log_statement = 'all',重启PG服务sudo systemctl restart postgresql@14-main.service,重新执行pg:pull后查看/var/log/postgresql/postgresql-14-main.log中的报错信息定位具体问题。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

