概述
今天上午收到反馈,一台MogDB单机数据库服务器磁盘满导致数据库不可用,此数据库没有做备份,目前通过手工方式删除xlog来释放磁盘空间,但数据库无法启动,原因是xlog删除过多导致缺失有效的checkpoint点位,经过与客户沟通,优先保证数据库可用性。
尝试进行重制xlog文件进行恢复,但数据库依然启动失败,通过查询数据库启动日志,发现启动失败原因是LSN号不符合启动需求,最终经过对LSN进行处理,目前数据库已经恢复可用。
问题分析
问题现象
对xlog文件进行重置后,数据库依然无法启动,通过查看数据库日志,可以看到启动失败原因是:PANIC:The Page’s LSN[xxxxx6048] bigger than want set LSN [xxxxx1296]
问题根源
报错提示的比较明显,数据库中的LSN号已经远远超过了我们当前想要设置的LSN号。在MogDB中LSN是通过十六进制的方式展示的,而日志中为了方便阅读,直接将LSN转换为十进制,所以要知道数据库中的LSN号,需要对其进行十六进制回转。
LSN号与xlog文件命名有很大关系,我们知道了LSN号,也就相当于知道了当前的xlog文件,我们需要将日志中的数据进行反转得到当前的xlog文件号。
解决方案
先将日志中的数据进行反转,得到十六进制格式为206c5033568,其中206为logid,而c5表示logseg,由此我们可以推测出当前xlog文件号为00000001000002060000005C。
得到xlog文件号后,我们就可以通过pg_resetxlog命令重置为我们需要的LSN号,使用命令为:
pg_resetxlog -l 00000001000002060000005C $PGDATA
到此,我们再次重启数据库,发现数据库可以正常启动。
总结建议
- 预防数据库单点,建议双节点互为主备,当出现主库不可用时,将备提升为新主,减少对业务影响。
- 对所有环境数据库添加监控,时刻关注数据库及硬件资源使用情况,预防此类故障再次出现。
- 尽可能减少对数据库执行pg_resetxlog操作,此命令有丢失数据的风险。