我有一个包含 InnoDB 表的数据库,其中一个 InnoDB 表被标记为损坏(我知道数据丢失等)。但是,当我重新启动 MySQL 时,它不会崩溃。
我预计它会崩溃,但事实并非如此。(我之前读过如果innodb表损坏,mysql服务器将停止)
它现在不应该崩溃吗?
innodb 是我的默认数据库引擎。
我有一个包含 InnoDB 表的数据库,其中一个 InnoDB 表被标记为损坏(我知道数据丢失等)。但是,当我重新启动 MySQL 时,它不会崩溃。
我预计它会崩溃,但事实并非如此。(我之前读过如果innodb表损坏,mysql服务器将停止)
它现在不应该崩溃吗?
innodb 是我的默认数据库引擎。
损坏的表不一定会导致崩溃。不过,您应该修复表,如果可能的话,从备份中重新加载表。对损坏的表进行操作充其量是不稳定的,无论如何,正如您已经发现的那样,它不会给您正确的结果。
不要相信系统没有“爆炸”这一事实——一个数据库有几个中间状态。你现在所处的那个很可能是“我还没有爆炸,我正在等待腐败传播和污染其他表的数据”。如果您知道该表已损坏,请立即行动。
关于修复 InnoDB 表,请参阅如何修复 InnoDB 表?.
要验证 InnoDB 表是否损坏,请参阅https://dba.stackexchange.com/questions/6191/how-do-you-identify-innodb-table-corruption。
为此,您需要进行验收测试,该测试将检查大量数据并为其提供一份干净的健康证明——或不这样做。将表导出到 SQL 并查看它是否可能,和/或对元组基数和/或关系进行检查......你明白我的意思。在预计没有人写入的表上,因此任何修改都等于损坏,磁盘文件的 MD5 可能会更快。
为了使事情更高效(例如在生产系统中),您可以考虑文件快照、数据库复制,甚至是高可用性。这些方法将检测程序损坏(例如流氓更新),但可能无法检测到主服务器上的某些硬件损坏(给出错误否定:从服务器上的检查成功,并且主服务器上的数据仍然损坏)或可能会在从站中发生意外(失败并引发误报,因为主站上的数据实际上是未受污染的)。
监控系统重要统计数据非常重要(而且高效),既可以捕捉即将发生的故障的最初症状(例如使用 SMART),也可以为取证调查提供数据(“有趣的是,每次数据库发生故障时,它总是在系统负载突然达到峰值——如果我们找出造成这种情况的原因会怎样?”)。
当然,还要依靠完整和充分的备份(并且不时地运行测试恢复。去过那里,做到了,把我的屁股交给了我)。
损坏源因软件设置而异。当然,一般来说,一定有什么东西 侵入了链条并造成了严重破坏。server memory representation-writer process-OS handle-journaling-IOSS-OS cache-disk-disk cache-internal file layout
不正确的系统关闭可能会在多个级别上造成混乱,从而阻止数据在管道的任何阶段写入。
最后阶段对磁盘上的文件进行人工处理(使用自己的管道,服务器对此一无所知)。
存在其他更深奥的可能性:
hdparm
. 如果每个组件都适合该级别的性能并且知道它或者至少能够发出信号,那么将磁盘设置为最高性能就很好。有时,您收到的所有“警告”都是系统故障。hddhealth
或smartctl
)轻松检查这一点。当然,还存在更多其他可能性,具体取决于设置。谷歌搜索文件损坏发现数百万页;添加到查询中的有用术语是文件系统(ext4,NTFS,brtfs,...),硬盘制造商和型号,操作系统,软件问题,安装的其他软件。