PostgreSQL备库提升后主库执行CREATE EXTENSION pglogical挂起问题
CREATE EXTENSION pglogical;挂起 以下是你可能遗漏的几个关键排查点:
清理同步复制残留配置:
日志明确提到synchronous replication等待,说明你的Main_A虽然已经被提升为主库,但postgresql.conf中的synchronous_standby_names参数可能还保留着原备库的应用名main_a。主库会持续等待这个不存在的备库返回同步确认,导致创建扩展的事务挂起。
解决:将synchronous_standby_names设置为空字符串(synchronous_standby_names = ''),注意这个参数需要重启PostgreSQL才能生效,仅执行pg_reload_conf()没用。确认备库标识文件已清理:
在PostgreSQL 12及以后版本中,备库是通过standby.signal文件标识的;12之前是recovery.conf。提升主库后必须删除或重命名这个文件,否则数据库会残留备库模式的逻辑,导致复制相关的异常行为。
解决:检查你的pg13数据目录(如/var/lib/postgresql/13/main)下是否存在standby.signal或旧的recovery.conf,如果有直接删除。检查pglogical的前置依赖参数:
创建pglogical扩展要求wal_level必须设置为logical,而原备库的wal_level可能是replica或minimal。即使你升级到pg13,如果没修改这个参数并重启,依然会导致扩展创建失败或挂起。
解决:修改postgresql.conf中wal_level = logical,重启数据库后再尝试创建扩展。同时要确保安装的pglogical版本兼容pg13(建议用2.4及以上版本)。清理残留的复制槽:
你当初用pg_basebackup -S main_a创建备库时,会在原主库创建名为main_a的复制槽。当Main_A被提升为主库后,这个复制槽可能依然存在(可通过SELECT * FROM pg_replication_slots;查看),无效的复制槽可能干扰事务提交逻辑。
解决:如果确认不需要这个复制槽,执行SELECT pg_drop_replication_slot('main_a');删除它。
内容的提问来源于stack exchange,提问作者bizonek

