MyISAM 运行 是否有丢失数据的风险?

Does MyISAM run a risk of actually losing data?

我有一系列 MyISAM 数据库表,正在阅读一些关于它在完整性方面不如 InnoDB 的观点。但是,具体来说,post 继续并且似乎表明您可能会丢失数据。我当然找不到 link(典型的运气,嗯?)但我确实记得上面提到的要点。

您是否可能在插入过程中丢失实际行?我的假设是这不是真的,但我会对社区的评论感兴趣。

谢谢!

MyISAM 对事务的支持为零,因此,它无法确保事务的完整性。它没有可用于从崩溃中恢复的日志。简而言之,它很脆弱并且容易出现严重故障,尤其是当您的系统在大写入过程中突然终止时。

您很有可能在写入过程中丢失数据。 InnoDB 的不同之处在于写入本身直到完成才真正提交,有一种机制可以在修改期间保持数据库完整性,因此如果出现故障,它可以 "roll back" 到以前的状态。 MyISAM 没有这样的机制,并且受文件系统的摆布,以将其从完全损坏中拯救出来。

我强烈建议不要将 MyISAM 用于任何重要的事情,或者如果可以避免的话根本不要使用 MyISAM。它在 1990 年代很有用,当时内存非常宝贵且 CPU 电源稀缺,典型的 high-end MySQL 服务器可能有 512MB 内存,两个 200MHz 处理器和一对采用 RAID1 配置的 9GB 磁盘。每一点点的表现都很重要。 InnoDB 变得更快了,日记的性能损失也大大减少了,尤其是在 SSD 上。

你不会使用没有日志的文件系统,所以你也不应该使用没有日志的数据库。

当 MySQL 在查询过程中崩溃时,可能会发生很多不愉快的事情。

  • 正在进行的写入可能会完成也可能不会完成;你不可能知道。
  • 特别是,如果它是修改多行的更新,则可能某些行已更改,但其他行未更改。
  • 更糟糕的是如果更新是 SET x = x + 1。如果你重播它,值会再次增加。
  • 索引变为 "corrupt"。 (这几乎总是可以修复的,但很麻烦。)
  • 如果涉及复制,则会增加写入丢失的另一途径。
  • 交易操作需要特别注意 LOCK TABLE,否则借记一个帐户,然后记入另一个帐户,可能会损失(或伪造)钱。

如果您只存储瞬时数据(新闻报道、博客、日志、游戏等),那么 none 可能很重要。如果你存钱,这很重要。

MyISAM 足够可靠,可以在正常情况下做正确的事情。也就是说,它不会 "lose rows" 在插入期间, 除非 其他事情同时发生——崩溃、磁盘错误等

如果检查错误失败,MyISAM 和 InnoDB 都可以 "lose rows"。数据截断、被零除、死锁、失去连接等,可能会直接或间接地导致某些东西丢失。

更进一步,当有人说他们通过拥有 Master 和 Slave 来保护他们的数据,但将它们放在同一个房间时,我问的是洪水、地震、龙卷风等

没有什么是 100% 安全的,但是如果使用得当,InnoDB 在防止数据丢失和损坏方面比 MyISAM 安全得多。