ERROR: invalid page header in block 27073 of relation base/21078/45300926

在数据库经历UPS断电导致主机重启后,主从不同步,出现错误'ERROR: invalid page header'。通过设置zero_damaged_pages,对受损表进行vacuum full和reindex操作,解决了部分问题。但插入数据时仍报错,怀疑是文件系统损坏。最终通过磁盘检查和格式化,结合从库备份恢复,成功解决数据库异常。
摘要由CSDN通过智能技术生成
突然断网,检查后通知我们UPS断电,db所在主机重启 
1、连上后,发现pg主从不同步,主不向从传日志,从报错: 
FATAL: could not connect to the primary server: could not connect to server: 
发现从先启动成功,而主是后启动的,因此我们将从再次重启 
service postgresql restart 
开始正常传日志 

2、过了一会,研发反应部分表的使用出现问题,主再次不传输日志,且无sender进程。 
查看主库日志,发现报错: 
ERROR:  invalid page header in block 27073 of relation base/21078/45300926 
查看从库日志,发现类似报错 
ERROR:insert_t_black:invalid page head in block 27073 of relation base/21078/45300926 

21078是tm_samples库的id号 
通过查询: 
select * from pg_class where relfilenode='45300926';—t_black 
应该是停电的时候,正好在进行数据的写入等操作,造成了数据损坏。 

此时,我们进行了如下操作: 
set  zero_damaged_pages = on;   --当这个参数为on的时候,会忽略所有数据有损坏的页面 
vacuum full t_black; 
tm_samples=# select count(*) from t_black; 
WARNING: invalid page header in block 27069 of relation base/21078/45300926; zeroing out page 
WARNING: invalid page header in block 27070 of relation base/21078/45300926; zeroing out page 
WARNING: invalid page header in block 27071 of relation base/21078/45300926; zeroing out page 
WARNING: invalid page header in block 27072 of relation base/21078/45300926; zeroing out page 
WARNING: invalid page header in block 27073 of relation base/21078/45300926; zeroing out page 
count 
--------- 
3066302 
(1 row) 
reindex table t_black; 
再次select count(*) from t_black;  --正常 
再重启pg主从的服务,发现主从开始同步,后台没有再报刚刚那个错误 

3、研发测试验证,发现插入部分hash值的时候,依然会刚刚那个错误 
insert into t_black  (sample_hash, sample_crc32, sample_sha1, virusname, avl_m, software_english,file_size, conditions_type, 
sample_type, description,record_time, getname_time, developers, last_record_time, last_changename_time, source_id, ss_id, cps,level,keyhash, 
sensitive_strings, behavior_info, relation_info,version,ratio,"AVL_Embed", "AVL_Adware", program_name, versionname, record_time_int ) SELECT sample_hash, sample_crc32, sample_sha1, virusname, avl_m, software_english,file_size, conditions_type, 
sample_type, description,record_time, getname_time, developers, last_record_time, last_changename_time, source_id, ss_id, cps,level,keyhash, 
sensitive_strings, behavior_info, relation_info,version,ratio,"AVL_Embed", "AVL_Adware", program_name, versionname, record_time_int 
  FROM t_white where sample_hash ='1E0CB07CDC71B2F994F5D3EB51050E3A'; 

程序报错:DatabaseError: invalid page header in block 27073 of relation base/21078/45300926 
只插入部分字段就没问题,但完整插入就不行。 

这时,我们想到可能是文件系统损坏了,当有数据往刚刚那个坏块里面写的时候,就会触发报错。 
同时,我们查到一共有4张表出现了坏块,分别是: 
t_black 
t_white 
t_batch_sample 
t_derivative 
我们决定先对所有的表做一次vacuum,然后进行磁盘的检查------后面的操作都是娟姐做的,待她回来后补充,但她反应检查后依然不行,最后的方法是磁盘格式化,然后用从库的备份进行了覆盖恢复。 

网页上有一些介绍的方法: 
1)根据错误提示 ERROR: invalid page header in block 1 of relation base/34780/34781 我们可以找到相应的文件, 文件的路径为: 数据目录/base/34780/34781,只要用工具手动把上面提示的坏块清除即可。 
在Linux下面可以用dd工具把相应的页面清除: 
$dd if=/dev/zero of=/home/postgres/data/base/34780/42995 bs=8192 seek=1 count=1 conv=notrunc 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值