MyISAM是否存在实际丢失数据的风险?

时间:2017-09-06 04:21:56

标签: mysql database myisam

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

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

谢谢!

2 个答案:

答案 0 :(得分:4)

MyISAM对交易没有任何支持,因此无法确保交易的完整性。它没有可用于从崩溃中恢复的日志。简而言之,它很脆弱,容易出现严重的失败,特别是如果你的系统在大写中突然终止的话。

写入过程中丢失数据的可能性非常高。 InnoDB的不同之处在于,写入本身在完成之前并未实际提交,有一种机制可以在修改期间保留数据库完整性,以便在出现故障时可以“回滚”到先前的状态。 MyISAM没有这样的机制,并且受文件系统的限制,可以将其从完全损坏中保存下来。

我强烈建议不要将MyISAM用于任何重要的事情,或者任何事情都可以避免。它在20世纪90年代非常有用,当时内存非常宝贵且CPU能力不足,典型的高端 MySQL服务器可能拥有512MB内存,两个200MHz处理器和一对9GB磁盘RAID1配置。每一点点的表现都算在内。 InnoDB的速度要快得多,日记本的性能损失也大大缩小,特别是在SSD上。

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

答案 1 :(得分:0)

当MySQL在查询过程中崩溃时,很多顽皮的事情都会发生。

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

如果您只存储瞬态数据(新闻报道,博客,日志,游戏等),那么这些都不重要。如果你要存钱,那就太重要了。

MyISAM足以在正常情况下做正确的事情 。也就是说,它不会失去行和#34;在插入过程中,除非同时发生其他事情 - 崩溃,磁盘错误等。

MyISAM和InnoDB都可以“失去行”#34;如果你没有检查错误。数据截断,除以零,死锁,丢失连接等可能会直接或间接导致丢失的内容。

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

没有什么是100%安全的,但正确使用的InnoDB比MyISAM更安全,可以防止数据丢失和损坏。