服务器因断电而重启后,我们丢失了上午保存在数据库中的所有数据(网站上创建的客户记录)。崩溃前几分钟,我在一些例行检查中能够在“MySQL 查询浏览器”上看到这些数据。崩溃后,上午创建的所有记录都消失了,我能看到的最新记录是在前一天晚上 7 点创建的。似乎所有 INSERT 语句都是在缓存中执行的,由于断电,缓存无法刷新。MySQL 是否使用这种缓存机制?如果是,它是否防崩溃,我该如何配置它?
环境:mysql 5.X + ubuntu 10.4 + raid1 + Jira4.1.2
答案1
除非您使用延迟插入,否则插入/更新/删除将立即提交。密钥文件可能尚未完全写入。如果您有缓存控制卡,它可能已缓存它并告诉操作系统它已提交它。您是否针对它运行了检查表/修复表?如果是这样,您可能会发现只是索引已损坏,而大多数记录仍在那里。
MyISAM 速度很快,但是,如果发生电源问题/服务器崩溃,则缺少一些需要采取的预防措施。InnoDB 是另一种更安全的方法,但是,根据您执行的查询类型,速度会更慢。它添加了行级锁定而不是表锁定,但是,select count(*) 需要扫描行,而 MyISAM 可以从索引中回答这个问题。
您可以设置复制以将数据发送到镜像,但是,如果它位于同一个数据中心,您仍然会面临数据损坏的可能性。
答案2
MySQL 可以配置为缓存数据,但通常不会。只有当数据在磁盘上时,它才会响应客户端。也许您已将 mysql 设置成在启动时尝试自动修复未完全关闭的表,并且某些记录已被删除。
查询缓存和排序缓存仅缓存可以从表中读取的数据(例如 select ... from)。
可能是操作系统配置为缓存写入(我认为 ubuntu ext3,默认为 5 秒提交...我不知道 10.4 中的 ext4)。