磁盘坏道

  • 提示信息
[ERROR] [MY-012642] [InnoDB] Tried to read 16384 bytes at offset 1179648, but was only able to read 0
[ERROR] [MY-012592] [InnoDB] Operating system error number 5 in a file operation.
[ERROR] [MY-012596] [InnoDB] Error number 5 means 'Input/output error'
[ERROR] [MY-012646] [InnoDB] File ./cnki/knavi_journals_no.ibd: 'read' returned OS error 105. Cannot continue operation
[ERROR] [MY-012981] [InnoDB] Cannot continue operation.


#查看操作
badblocks -s -v /dev/sdb1    #检测硬盘
dmesg | tail
cat /var/log/messages |tail
  • 解决办法更换磁盘

当mysqld服务进程访问损坏的表时,数据库会直接崩溃退出 的解决办法(Percona或者MariaDB)

  • 如果在遭遇到损坏的表时,不希望出现这种结果
  • MySQL没有此参数,请切换至Percona或者MariaDB
innodb_corrupt_table_action=salvage  mysql
#该值会跳过损坏的表,不会使mysqld服务进程崩溃,导致整个数据库无法启动
#该参数只能适配独立表空间 innodb_file_per_table = 1

mysql的解决方案

innodb_force_recovery=1-6
1 (SRV_FORCE_IGNORE_CORRUPT)
#使服务器即使检测到损坏的页面也可以运行 。尝试 跳过损坏的索引记录和页,这有助于转储表。SELECT * FROM tbl_name
2 (SRV_FORCE_NO_BACKGROUND)
#防止主线程和任何清除线程运行。如果在清除操作期间发生意外退出,则此恢复值将阻止它。
3 (SRV_FORCE_NO_TRX_UNDO)
#崩溃恢复后 不运行事务 回滚。
4 (SRV_FORCE_NO_IBUF_MERGE)
#防止插入缓冲区合并操作。如果它们会导致崩溃,请不要这样做。不计算表统计信息。此值可能会永久损坏数据文件。使用此值后,
#准备删除并重新创建所有二级索引。设置 InnoDB为只读。
5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
#启动数据库时 不查看撤消日志:InnoDB甚至将未完成的事务也视为已提交。此值可能会永久损坏数据文件。设置InnoDB为只读。
6 (SRV_FORCE_NO_LOG_REDO)
#不进行与恢复有关的重做日志前滚。此值可能会永久损坏数据文件。使数据库页面处于过时状态,这反过来可能会使B树和其他数据库结构遭受更多破坏#设置 InnoDB为只读。