共计 948 个字符,预计需要花费 3 分钟才能阅读完成。
⚠️核心前提:原主实例已经无法写入,不要再对外提供业务写请求;禁止原主继续运行,防止脑裂 现象:主库磁盘只读、inode 耗尽、磁盘损坏,能读不能写,此时不能正常 switchover,只能手动 promote 备库
一、第一步:隔离故障主(必须先做!)
目的:防止旧主还在运行,出现双主脑裂
- 停掉故障主库 kingbase 进程
sys_ctl stop -D 故障主的数据目录
- 如果磁盘卡死无法停库,直接断开网络 / 关机,强制隔离。
不要尝试修复磁盘写问题,优先业务切换。
二、第二步:备库执行升主(二选一)
登录备库操作系统(kingbase 用户)
方式 1:sys_ctl promote(原生流复制,无 repmgr 集群)
sys_ctl promote -D /kingbase/data
或者 ksql 内执行:
SELECT sys_promote();
方式 2:repmgr 集群(推荐)
# 备库执行,提升为本集群新主,其余备自动跟随新主
repmgr standby promote -f /etc/repmgr.conf --siblings-follow
三、升主后验证(在新主执行)
-- true=备库;false=已经升级为主库
select sys_is_in_recovery();
-- 查看当前时间线
select sys_timeline_id();
返回false代表升主成功,支持读写。
四、检查数据是否完整(关键)
升主前可在备库查看回放 LSN,确认 wal 已经全部接收回放
select sys_last_replayed_wal_lsn();
主库存储不可写,主库最后产生的 WAL 如果还没传到备库,会丢失这部分数据。
五、VIP 和业务切换
- 如果是 kbha 集群:升主完成后,VIP 会自动漂移到新主;
- 无 HA:手动把 VIP 切到新主节点;
- 修改业务连接地址 / VIP,测试读写。
六、故障旧主后续处理
旧主磁盘修好后,不能直接启动,时间线已经不一样。 两种方案:
- 使用
sys_rewind快速回退旧主,转为备库(推荐,节省拷贝时间)
sys_rewind -D 旧主data目录 --source-server="host=新主IP port=54321 user=system dbname=postgres"
- sys_rewind 不可用:直接
repmgr standby clone重新克隆,重建备库
正文完
发表至: 数据
近一天内

