最近接到开发人员一个环境,数据库无法启动,查看启动日志错误如下:
FATAL: incorrect checksum in control file
LOG: database system is shut down
从错误信息看应该是控制文件有问题,先查看控制文件
pg_controldata -D $PGDATA
控制文件能正常查看,但是有一个告警信息:
WARNING: Calculated CRC checksum does not match value stored in file.
Either the file is corrupt, or it has a different layout than this program
is expecting. The results below are untrustworthy.
很显然控制文件已损坏,解决办法有两个,初始化集群从备份还原数据,但是很不幸此环境的备份已被清理,另外一个解决办法是通过pg_resetwal重新构建控制文件,但是可能会丢失一部分数据,因为没有备份数据库又无法启动,现在唯一的办法也只能是重新构建控制文件,当使用pg_resetwal重新构建控制文件,新的问题又来了,数据库依然无法启动,错误信息如下:
FATAL: database files are incompatible with server
DETAIL: The database cluster was initialized with LOBLKSIZE 15360, but the server was compiled with LOBLKSIZE 2048.
HINT: It looks like you need to recompile or initdb.
错误信息中可以看出,控制文件中的LOBLKSIZE值不对,导致数据库无法启动,到控制文件中确认下:
Size of a large-object chunk: 15360
的确有问题,15360这个值有点怪异,正常不应是此值,查看下源码这个值的定义如下:
#define LOBLKSIZE (BLCKSZ / 4)
默认LOBLKSIZE应该是BLCKSZ大小的四分之一,即2048,我们的环境都是标准化安装,这个环境此值肯定也是没有个性化修改的,再次分析下源码,数据库在启动时会对比LOBLKSIZE的值,现在由于两种不一致,导致数据库无法启动。
if (ControlFile->loblksize != LOBLKSIZE)
ereport(FATAL,
(errmsg(“database files are incompatible with server”),
errdetail(“The database cluster was initialized with LOBLKSIZE %d,”
" but the server was compiled with LOBLKSIZE %d.",
ControlFile->loblksize, (int) LOBLKSIZE),
errhint(“It looks like you need to recompile or initdb.”)));
因为我们系统本身就没用到大对象存储,把此判断先注释掉应该不会有问题,找一台测试机重新编译一个同版本的PG,把PGDATA迁移过去,看是否能启动,不出意外数据库启动成功,然后把数据全部转测出来,最后对上面的问题环境重新编译安装初始化集群,把存储出来的还原进去,问题得到解决。
总结:备份不管什么情况下都是最重要的,有备无患,即使能通过一些方法可以解决问题,但是还是会有一些副作用(停库业务时间过长、数据可能会有部分丢失等)。
最后修改时间:2021-05-25 20:39:07
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。