作者介绍:邵亚鹏,中电万维信息技术有限责任公司技术专家,7年Java研发经验,两年AI大模型从事经验。
问题背景
某临时业务使用开源PolarDB-X(开源版本:PolarDB-X 2.4.0),采用集中式单节点部署。 因服务器磁盘满导致数据库服务器不可用,收到告警后尝试通过删除binlog文件恢复,但删除binlog后重启数据库服务,启动异常并报错:xpaxos init last index of trem for recovery failed
后经了解到:由于paxos对binlog完整性有严格检查,删除binlog文件会直接导致服务启动失败。
尝试解决
由于是单节点部署,没有其他节点冗余替换,同时由于没有进行过全量数据备份和增量日志备份,所以也没有办法通过备份集进行恢复。只能尝试基于现有只有数据的单节点实例进行恢复。
了解到 PolarDB-X《PolarDB-X 开源用户手册 ~ 基于Paxos的MySQL三副本》中支持恢复成单节点实例,而当前现状(只有数据没有binlog)又与恢复单节点的前置条件相似,所以尝试使用单节点恢复方式解决。
第一步:删除binlog文件
为了避免有新的binlog生成影响操作,操作前再次执行下binlog清理:
rm -f data/mysql-binlog.*
第二步:指定元数据刷新
由于当前现状不是来自备份集,所以不知道准确的commit index,所以尝试使用不同的index试探。
需要注意 cluster-start-index和 cluster-force-recover-index 值必须相同,且尽量设置大一点,比如1234567890,如果设置太小,会在执行的过程中卡在第三步中执行不下去,需要调大一个量级【重新回到第一步】再执行一遍。
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf \ --cluster-id=1234 \ --cluster-info='127.0.0.1:14886@1' \ --cluster-force-single-mode=ON \ --cluster-force-change-meta=ON \ --cluster-start-index=1234567890 \ --cluster-force-recover-index=1234567890 \ --loose_consensus_reset_mts_info=ON \ &
第三步:单节点启动等待元数据刷新
执行节点启动
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf &
执行以下命令查看日志
tail -f log/alert.log
第三步如果执行到下图中的位置不再往下执行,则说明两个index的值太小,调整index为更大点的值,【重新回到第一步】开始执行
第三步如果执行到如下图日志,获取rli consensus index的值45,作为重新订正启动命令中cluster-start-index和cluster-force-recover-index参数的值,然后【重新回到第一步】执行全部步骤
如果日志中出现“ConsensusLogManager::wait_follower_upgraded finish” 说明订正的index是正好满足的,继续执行第四步
第四步:kill mysqld进程
ps -ef | grep mysqldkill -15 pid 或者 kill -9 pid
第五步:以mysqld_safe方式单节点启动
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf &
注意事项
1、第一步,第二步,第三步根据执行情况可能重复执行,必须是按照完整步骤执行,否则会导致启动失败
2、my.cnf文件中配置的basedir = /opt/polardbx_engine是安装路径,默认就是这个路径
PolarDB-X 总结
原理说明:Binlog删除后数据库无法登录,采用恢复单节点的方式需要指定数据文件当前index。但此刻内核无法知道日志应用到哪个位点, 所以需要先指定一个足够大的index值,例如1234567890。 然后根据启动会失败日志中“rli consensus index值”知道准确位点,用rli consensus index的值,在第二步订正meta信息时使用,强制单节点拉起节点。
事后规避:
- 为避免单节点误删binlog事故,建议使用开源PolarDB-X标准版时,采用高可用三节点的方式部署, 这样至少一个节点故障可以自动HA到另外一个健康的节点
- 定期对数据库进行全量数据备份和日志备份,然后定期清理历史日志文件。这样至少有一个兜底的数据在,同时提前避免磁盘满风险
- 及时升级到PolarDB-X开源的最新版本,最新版本对这种问题的解决方式会更加丰富和快捷。