适用于: MySQL服务器版本5.0及以上 本文信息适用于所有平台。   目标 学习引起InnoDB损坏最常见的原因以及你如何对其进行防护。   解决方案 InnoDB损坏的原因 InnoDB损坏四个主要的原因有:
  • 硬件错误(通常是磁盘或内存)
  • 崩溃 (例如由于断电或操作系统bug引起的)
  • Bugs
  • 不一致的备份
  除了例如使用错误更正代码(ECC)内存外,防止硬件错误的措施很少。   对于由于断电引起的崩溃,UPS是最好的防护。对于有操作系统bug引起的崩溃 (幸好这些是很少发生的),电池备份的磁盘能帮助避免部分写。通常使用innodb_flush_log_at_trx_commit = 1来确保你在同步写入磁盘。 但注意操作系统或磁盘可能并没有实际刷掉写入。因为这个电池备份磁盘是防护。   除非按照更改日志并检查是否需要更新,否则bug很难防护。你能在以下找到更改日志:
  • MySQL 5.0
  • MySQL 5.1
  • MySQL 5.5
  • MySQL 5.6
  • MySQL 5.7
  备份通常比预期的更常引起损坏 (包括不一致性,即在两个表中的数据不一致 )。这个情况的原因是即使有一个FLUSH TABLES WITH READ LOCK,InnoDB 将继续在底部写入数据文件。这表示即使备份方法对于比如MyISAM有作用,它可能对InnoDB不适用。   在所有情况中,建议经常备份并验证备份。   参考 https://dev.mysql.com/doc/relnotes/mysql/5.5/en/ https://dev.mysql.com/doc/relnotes/mysql/5.6/en/ NOTE:1023132.1 How to Create a Backup of MySQL Server NOTE:1509073.1 How to Get Started with MySQL Enterprise Backup? NOTE:1024113.1 InnoDB log buffer flushes to disk after each transaction https://dev.mysql.com/doc/relnotes/mysql/5.0/en/ https://dev.mysql.com/doc/relnotes/mysql/5.1/en/ https://dev.mysql.com/doc/relnotes/mysql/5.7/en/ https://dev.mysql.com/doc/refman/en/innodbparameters. html#sysvar_innodb_flush_log_at_trx_commit https://dev.mysql.com/doc/refman/en/flush.html NOTE:2017846.1 InnoDB Corruption Recover Guide NOTE:1502290.1 How to Recover a Corrupted InnoDB Table Definition File NOTE:1476982.1 What do I do with InnoDB message "Database page corruption on disk or a failed file read of page" NOTE:2049861.1 Master Note for InnoDB NOTE:1416063.1 InnoDB Error: "log sequence number is in the future"