MySQL磁盘坏块处理的全流程

 更新时间:2025年07月22日 09:58:01   作者:喝醉酒的小白  
当 MySQL 所在磁盘出现坏块(Bad Sector),可能导致数据库实例异常重启、表损坏、数据无法读取或写入等严重问题,此类问题不仅涉及 MySQL 层处理,还需配合操作系统和硬件层面进行综合判断与修复,所以本文给大家介绍了MySQL磁盘坏块处理的全流程

MySQL 磁盘坏块问题的处理总体流程

下面是推荐的分阶段处理流程,适用于生产环境,强调数据保护、风险评估、逐步推进:

第一阶段:问题确认与隔离

1.1 检查 MySQL 日志确认症状

查看 mysqld.err 或 MySQL 日志是否存在以下关键词:

  • InnoDB: Operating system error number 5
  • InnoDB: Unable to read page
  • InnoDB: corruption
  • Got error -1 from storage engine
  • IO error 5 / IO error 13
  • 实例崩溃、自动重启堆栈信息(signal 11)

1.2 确认是否磁盘 I/O 层问题

使用如下工具:

dmesg | grep -i error
dmesg | grep -i sda  # 根据你使用的磁盘设备

重点关注如:

Buffer I/O error on device /dev/sda3, logical block 123456
EXT4-fs error (device sda3): ...

第二阶段:应急保护与备份

2.1 立即备份其他健康数据

  • 使用 mysqldumpxtrabackupcp 等方式备份未受影响的库/表。
  • 防止坏块扩大损害。

2.2 停止写入请求

可通过 FLUSH TABLES WITH READ LOCK; 锁定全局读取;

或直接将 MySQL 实例切换为只读:

SET GLOBAL read_only = ON;

第三阶段:诊断坏块位置与影响

3.1 使用 badblocks 工具检测磁盘坏块

badblocks -sv /dev/sda > badblocks.txt
  • 可配合 fscke2fsck 使用映射坏块文件排查表空间损坏。

3.2 确认受损数据文件位置(特别是 .ibd 文件)

ls -lh /var/lib/mysql/databasename/
file /var/lib/mysql/databasename/table.ibd

可配合 strace -f -p $(pidof mysqld) 跟踪是否某个 .ibd 文件访问时报错。

第四阶段:修复受影响表或表空间

4.1 若只影响单表,可尝试以下修复操作:

方法A:导出可导出的数据后删除表

SELECT * FROM problem_table INTO OUTFILE '/tmp/backup.csv';
TRUNCATE TABLE problem_table;
DROP TABLE problem_table;

方法B:将表移出数据目录再尝试 DROP

systemctl stop mysqld
mv /var/lib/mysql/dbname/problem_table.ibd /tmp/
systemctl start mysqld

# 然后登录 MySQL 执行:
DROP TABLE dbname.problem_table;

注意这样会让 InnoDB 报告表空间文件不存在,但通常可跳过 DROP 阶段的 crash。

方法C:使用 innodb_force_recovery 修复

编辑 my.cnf 添加:

[mysqld]
innodb_force_recovery=1

数值从 1 到 6 逐级递增(数值越高风险越大,建议从 1 开始测试)

然后重启 MySQL,再尝试导出或 DROP 表。

第五阶段:系统层修复或替换磁盘

5.1 标记/屏蔽坏块(临时措施,不推荐长期使用)

e2fsck -l badblocks.txt /dev/sda3

5.2 若坏块不可控,推荐更换磁盘

  • 使用 ddrescue 拷贝数据至新磁盘;
  • 全量备份 + 恢复到新设备是最终手段。

附:innodb_force_recovery 参数说明

含义风险级别
1跳过 insert buffer 的恢复安全
2跳过 redo log 的应用
3跳过 undo log 恢复
4不执行 purge 操作
5不执行 insert buffer 合并
6禁止双写缓冲,跳过一切恢复流程极高

总结:MySQL 磁盘坏块处理建议

步骤行动目的
1确认日志、dmesg、坏块位置确认是否真为磁盘故障
2备份健康数据防止坏块扩散影响
3使用 TRUNCATE 或 rename + DROP规避触发 I/O 错误
4启用 innodb_force_recovery 修复数据导出和表结构清理
5标记坏块或更换磁盘根除问题源头

如果你能提供 mysqld.errdmesg 日志中具体的报错信息,我可以帮你进一步诊断。需要我协助你写具体的修复操作脚本也可以。

到此这篇关于MySQL磁盘坏块处理的全流程的文章就介绍到这了,更多相关MySQL磁盘坏块处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql 5.7.27 安装配置方法图文教程

    mysql 5.7.27 安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.27 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • MySQL的Grant命令详解

    MySQL的Grant命令详解

    mysql中可以通过Grant命令为数据库赋予用户权限,这里简单介绍下Grant的使用方法,需要的朋友可以参考下
    2013-10-10
  • 简述Redis和MySQL的区别

    简述Redis和MySQL的区别

    这篇文章主要介绍了简述Redis和MySQL的区别,小编觉得挺不错的,这里给大家分享下,需要的朋友可以了解。
    2017-10-10
  • MySQL 8中新增的这三大索引 隐藏、降序、函数

    MySQL 8中新增的这三大索引 隐藏、降序、函数

    这篇文章主要介绍了MySQL 8.x版本中新增的三大索引 隐藏索引、降索引序、函数索引,如果文章对你有点帮助,小伙伴们点赞、收藏、评论、分享走起呀
    2021-09-09
  • Nacos配置MySQL8的方法

    Nacos配置MySQL8的方法

    这篇文章主要介绍了Nacos配置MySQL8的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Mysql中NTILE()函数的具体使用

    Mysql中NTILE()函数的具体使用

    NTILE()函数用于将分区中的有序数据分为n个等级,本文主要介绍了Mysql中NTILE()函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Mysql查看死锁与解除死锁的深入讲解

    Mysql查看死锁与解除死锁的深入讲解

    这篇文章主要给大家介绍了关于Mysql查看死锁与解除死锁的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • MySQL中如何将字符串替换简单示例

    MySQL中如何将字符串替换简单示例

    mysql是一种常用的关系型数据库管理系统,它提供了多种函数来处理和操作数据,下面这篇文章主要给大家介绍了关于MySQL中如何将字符串替换的相关资料,需要的朋友可以参考下
    2024-07-07
  • MySQL分表和分区的具体实现方法

    MySQL分表和分区的具体实现方法

    这篇文章主要介绍了MySQL分表和分区的具体实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • MySQL 出现错误1418 的原因分析及解决方法

    MySQL 出现错误1418 的原因分析及解决方法

    这篇文章主要介绍了MySQL 出现错误1418 的原因分析及解决方法的相关资料,需要的朋友可以参考下
    2016-11-11

最新评论