Page’s LSN bigger than want set LSN 问题小结

2024年 5月 21日 68.8k 0

概述

今天上午收到反馈,一台MogDB单机数据库服务器磁盘满导致数据库不可用,此数据库没有做备份,目前通过手工方式删除xlog来释放磁盘空间,但数据库无法启动,原因是xlog删除过多导致缺失有效的checkpoint点位,经过与客户沟通,优先保证数据库可用性。

尝试进行重制xlog文件进行恢复,但数据库依然启动失败,通过查询数据库启动日志,发现启动失败原因是LSN号不符合启动需求,最终经过对LSN进行处理,目前数据库已经恢复可用。

问题分析

问题现象

对xlog文件进行重置后,数据库依然无法启动,通过查看数据库日志,可以看到启动失败原因是:PANIC:The Page’s LSN[xxxxx6048] bigger than want set LSN [xxxxx1296]

Page's LSN bigger than want set LSN 问题小结-1

问题根源

报错提示的比较明显,数据库中的LSN号已经远远超过了我们当前想要设置的LSN号。在MogDB中LSN是通过十六进制的方式展示的,而日志中为了方便阅读,直接将LSN转换为十进制,所以要知道数据库中的LSN号,需要对其进行十六进制回转。

LSN号与xlog文件命名有很大关系,我们知道了LSN号,也就相当于知道了当前的xlog文件,我们需要将日志中的数据进行反转得到当前的xlog文件号。

解决方案

先将日志中的数据进行反转,得到十六进制格式为206c5033568,其中206为logid,而c5表示logseg,由此我们可以推测出当前xlog文件号为00000001000002060000005C。
Page's LSN bigger than want set LSN 问题小结-2

得到xlog文件号后,我们就可以通过pg_resetxlog命令重置为我们需要的LSN号,使用命令为:

pg_resetxlog -l 00000001000002060000005C $PGDATA

到此,我们再次重启数据库,发现数据库可以正常启动。
Page's LSN bigger than want set LSN 问题小结-3

总结建议

  • 预防数据库单点,建议双节点互为主备,当出现主库不可用时,将备提升为新主,减少对业务影响。
  • 对所有环境数据库添加监控,时刻关注数据库及硬件资源使用情况,预防此类故障再次出现。
  • 尽可能减少对数据库执行pg_resetxlog操作,此命令有丢失数据的风险。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论