You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:19:11