PostgreSQL 11升12搭配repmgr4升5升级失败求助
解决PostgreSQL 11→12升级时repmgr函数缺失的问题
这个报错我之前帮同事排查过,核心原因很明确:repmgr 5.x已经彻底移除了am_bdr_failover_handler这个函数,但你的PostgreSQL 11数据库(之前搭配repmgr 4.x)里还残留着这个函数的定义。在升级PostgreSQL的过程中,pg_restore尝试创建这个函数,但新版本的repmgr.so里根本没有这个函数的实现,所以就抛出了错误。
下面是一步步的解决思路:
1. 升级前先清理旧repmgr的残留对象
在PostgreSQL 11的主库上操作:
- 先确认这个多余的函数是否存在:
SELECT proname FROM pg_proc WHERE proname = 'am_bdr_failover_handler' AND pronamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'repmgr'); - 如果查询结果返回这个函数,先解除它和repmgr扩展的关联,再删除:
ALTER EXTENSION repmgr DROP FUNCTION repmgr.am_bdr_failover_handler(integer); DROP FUNCTION repmgr.am_bdr_failover_handler(integer); - 顺便验证下你的repmgr已经升级到5.x版本(这一步你应该已经完成,但确认下更稳妥):
SELECT extversion FROM pg_extension WHERE extname = 'repmgr';
2. 重新生成升级用的备份
如果你已经提前做了备份,现在必须重新生成一份——因为旧备份里还带着那个已被移除的函数定义。用PostgreSQL 11自带的pg_dump生成适合升级的备份:
pg_dump -U 你的数据库用户 -d 目标数据库 --binary-upgrade -f db_upgrade_new_dump.sql
--binary-upgrade是PostgreSQL升级工具专用的参数,确保备份格式符合升级要求。
3. 执行PostgreSQL升级的注意事项
- 升级前务必停止所有节点的repmgr服务,避免它在升级过程中干扰操作;
- 确认PostgreSQL 12的服务器上已经正确安装了repmgr 5.x版本,并且
/usr/lib/postgresql/12/lib/repmgr.so文件存在且版本匹配; - 如果用的是
pg_upgrade工具,按照官方流程执行即可,重点是使用新生成的那份备份。
4. 升级后验证
- 登录PostgreSQL 12的数据库,检查repmgr扩展状态:
SELECT * FROM pg_extension WHERE extname = 'repmgr'; - 启动repmgr服务,检查集群状态是否正常:
repmgr cluster show
额外说明
这个am_bdr_failover_handler函数是repmgr 4.x里用来支持BDR(双向多主复制)的,repmgr 5.x已经砍掉了对BDR的支持,所以这个函数完全没用了。如果你的集群从来没用到BDR,清理它不会有任何影响;如果之前用了BDR,那升级前得先考虑BDR的迁移方案——毕竟repmgr 5.x不再支持它了。
内容的提问来源于stack exchange,提问作者Darshan Shah
相关产品推荐
相关产品推荐

