记一次由硬盘坏道导致的mysql数据库故障

记一次由硬盘坏道导致的mysql数据库故障

前些天,我在上课时,收到监控短信报警,赶忙用手机连上去看下,发现首页报错:

Table ‘forum_thread’ is marked as crashed and should be repaired

这是常见的数据表错误,通常是由于服务器意外断电等故障导致,修复起来往往比较简单,小点儿的表可以直接用phpmyadmin执行修复操作,大点的表可以连上服务器,执行repair table 表名来进行修复。本例中,我在执行命令后,发现依然报错,而出错信息变为了:

Table ‘forum_thread’ is marked as crashed and last (automatic) repair failed

也就是说,修复无效。这种情况很少遇到,于是,只能先把数据库停掉(执行repair时,不需停止数据库服务)。

service mysql stop

cd /usr/local/[tableName]/

myisamchk -r common_forum_thread.MYI

依然报错。奇怪了,通常只要文件没有损坏,MYI都是可以修复了,因为MYI储存的是表所以,可以根据数据生成的。

无奈,最后执行了

myisamchk –safe-recover common)_forum_thread.MYI

该指令通常用于最后的修复操作,修复速度最慢。结果依然很失望,还是报错。这时候,我开始怀疑是服务器本身的问题了,最可疑的是文件本身,如果文件无法读写的话,那么很可能是硬盘或文件系统有问题了。于是,执行了一下dmesg查看一下开机信息,发现有一些I/O错误。

于是,硬盘坏道的可疑性更大了,随后cd到home目录下,执行

badblocks -s -v -o /root/badblocks.log /dev/sda

来检查磁盘坏道,执行到12%左右的时候,我去看了下文件,如图:

badblocks1

 

已经有很多坏扇区了,确定是硬盘问题了。时候反省一下,当怀疑有硬盘坏道时,即使是写入文件操作,也是危险的,因为写入可能导致坏道进一步扩大。于是,剩下的事情就是联系机房,换硬盘,对拷数据,恢复系统……把旧硬盘的数据cp过来,执行修复,检查网站,测试功能,重新上线。

 

总结:对于独服,要尤其注意硬盘坏道问题,本次故障,服务器是1T的硬盘,没有做RAID,也没有定期检查坏道,硬盘用了2年左右的时间,好在数据有备份。备份,备份,还是备份,无论是采取整站备份还是增量备份,一定要做到服务器定期备份,以免出现意外情况。本次损坏的仅仅是日志文件,对拷过来就可以修复,如果损坏的是数据文件,那损失就不可估量了。

硬盘

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注