适用于:
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”