什么导致了MySQL InnoDB损坏且如何防护?

适用于:

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”

 

 


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *