突然断网,检查后通知我们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、连上后,发现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