ibdata1 mysql数据文件中的坏扇区

时间:2017-04-20 07:11:41

标签: mysql debian repair

文件上的坏扇区存在问题,这是一个重要的mysql ibdata1,它包含我数据库的所有数据。

所以,我跑

badblocks -sv /dev/mapper/storage-monitoring3
Checking for bad blocks (read-only test): 45766008done, 6:44 elapsed.
(0/0/0 errors)
45766009done, 6:46 elapsed. (1/0/0 errors)
45766010done, 6:47 elapsed. (2/0/0 errors)
45766011done, 6:49 elapsed. (3/0/0 errors)
done
Pass completed, 4 bad blocks found. (4/0/0 errors)

之后,我跑

root@ubuntu:~# fsck /dev/mapper/storage-monitoring3
fsck from util-linux 2.20.1
e2fsck 1.42.9 (4-Feb-2014)
/dev/mapper/storage-monitoring3: clean, 14046/4276224 files, 2541252/17089792 blocks

但这很干净,问题也没有解决。

如何修复那个坏扇区?

1 个答案:

答案 0 :(得分:0)

最好的答案是您应该备份数据库。这样,您应该将数据库还原到另一个磁盘卷上。使用二进制日志进行时间点恢复。

如果您没有备份,则可以创建一个或至少备份大多数数据。

使用innodb_force_recovery=6重新启动MySQL服务(请参阅https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html

尝试对所有数据执行只读转储。尝试将其保存到另一个磁盘,而不是带有坏扇区的磁盘。

mysqldump --single-transaction mydatabase | gzip -c > /tmp/dump.sql.gz

希望您桌面的页面不会遇到坏道。如果他们这样做,那么尝试转储单个表。一旦到达遇到坏扇区的表,就可以使用mysqldump --where ...转储部分表(参见mysqldump的文档)。

恢复数据库后,请更换服务器中的坏磁盘。不要尝试重复使用坏的磁盘。它不值得冒风险。只是回收它们。

祝你好运。

重新评论:

我曾经处理过这种情况。这是一个很长的镜头,但它曾经为我工作过一次。

我做的是复制让mysqld关闭,并尝试使用shell复制ibdata1文件:

dd bs=16k if=ibdata1 of=ibdata1.part1

STOP。如果您不知道dd命令的作用,请阅读它。 http://man7.org/linux/man-pages/man1/dd.1.html

InnoDB页面默认为16k,因此要使用的块大小。此命令将到达存储在坏扇区中的页面,并且您将收到I / O错误。然后你试图跳过坏的部分并继续。

dd bs=16k if=ibdata1 of=ibdata1.part3 skip=327

如果它遇到另一个坏页面,请跳过另一页。

dd bs=16k if=ibdata1 of=ibdata1.part3 skip=328

继续增加跳过计数,直到您停止获取I / O错误。这意味着你已经超越了坏页面。计算您必须跳过的页数。请注意我编号为" part3"因为你需要用死数据的第2部分填补空白。

最终,您将拥有两个文件,ibdata1.part1和ibdata.part2。在我使用这种技术的情况下,我只需要两个部分,因为所有坏块都被本地化为一个连续的三个数据库页面序列。如果你有多个坏点,你可能需要多个"部分"到这个文件。跟踪每个部分之间的坏页数。

然后你需要在重建新文件之前填补空白。

dd bs=16k if=/dev/null of=ibdata1.part2 count=4

3的计数显然取决于跳过坏页面的结果。页数可能与badblocks中找到的坏块数不对应,同一InnoDB页面中可能出现多个坏块。

一旦你完成了这一切,请组装它们:

mv ibdata1 ibdata1.bad
cat ibdata1.part* > ibdata1
chown mysql:mysql ibdata1

现在使用innodb_force_recovery=6启动MySQL服务。尝试按照我之前描述的那样转储数据库。

如果坏页面不包含关键数据,这可能会有效。例如,如果坏页面存储了二级索引,则在mysqldump期间不需要触摸它们。但这完全是运气问题。

如果这不起作用,那么据我所知,您的数据库无法恢复。很抱歉听到您的遗失。您可以尝试使用https://recovery.twindb.com/

等数据恢复服务

根据这种经验,您需要定期备份。