许多站点和脚本仍然使用 MySQL 而不是 PostgreSQL。我有几个低优先级的博客,所以我不想迁移到另一个数据库,所以我使用 MySQL。
这是问题所在,他们在低内存 VPS上。这意味着我无法启用 InnoDB,因为它使用大约 80MB 的内存来加载。所以我不得不冒险运行 MyISAM。
考虑到这一点,我正在使用 MyISAM 查看什么样的数据丢失?如果有人在保存博客文章时断电,我会丢失该文章还是整个数据库?
在这些低端设备上,只要不丢失整个数据库,我就可以丢失一些最近的评论或博客文章。
MyISAM 不符合 ACID,因此缺乏耐用性。这实际上取决于使用 InnoDB 或停机时间的成本更多......内存。MyISAM 无疑是一个可行的选择,但您的应用程序对数据库层有什么要求?由于其局限性,使用 MyISAM 可能会使生活变得更加艰难,但在某些情况下 MyISAM 可能会很好。由于其锁定性质,仅使用逻辑 mysqldump 备份会中断您的服务。如果您正在使用二进制日志记录,您可以备份它们以提供增量备份,如果 MyISAM 表中的某些内容损坏,可以重放这些备份以帮助恢复。
您可能会发现以下感兴趣的 MySQL 性能文章:
对我来说,这不仅仅是关于表锁。表锁只是您需要考虑在生产中使用它的 MyISAM 限制之一。特别是如果您来自“传统”数据库,您可能会对 MyISAM 行为(以及由此导致的默认 MySQL 行为)感到震惊——它会因不正确的关闭而损坏,如果出现某些错误,它将因部分语句执行而失败发现等...
http://www.mysqlperformanceblog.com/2006/06/17/using-myisam-in-production/
MySQL 手册指出了可能损坏表的事件类型,并且有一篇文章解释了如何使用myisamchk 来修复表。您甚至可以发出查询来修复它。
REPAIR TABLE table;
但是,没有关于某些类型的崩溃是否“无法修复”的信息。这是即使我在做备份也不能允许的数据丢失类型。
随着服务器崩溃,您的自动增量主键可能会损坏,因此您的博客文章 ID 可能会从 122、123、75912371234、75912371235(服务器在 123 之后崩溃)跳转。我已经看到它发生了,它并不漂亮。
您总是可以在从属到数据库的同一 VLAN 上获得另一台主机作为备份,这将大大降低风险。我相信您唯一的其他选择是:
在我看来,MyISAM 没有任何数据丢失。
断电导致数据丢失的风险是由于断电,而不是数据库存储机制。