在最近对 RS 云服务器进行“紧急迁移”之后,事实证明我们服务器快照映像上的 mysql 数据库与备份日期相比已过时数日。然而,通过受影响的 Web 应用程序上传的文件已写入文件系统。写入数据库的相关元数据丢失,但文件本身已备份。
一旦我能够在 mysql 服务器启动之前手动访问 mysql 数据文件(服务器配置为在启动时启动 mysql),我就能看到 ib_logfile1、ib_logfile0 和 ibdata1 的更新时间是几天前的。
对于这张海报,mysql data loss after server crash,就好像某个缓存控制器告诉 OS / mysql 服务器它已经提交了仍在缓存中的数据,并且它丢失了而不是刷新了。
我不太清楚上传的文件是如何写入的,但数据库数据却没有。我原以为任何缓存都会在系统范围内刷新,而不是逐个进程刷新。
关于这可能是如何发生的任何建议?
更新二:
请参阅下面解释发生了什么的我的回答。
更新:
配置详细信息,按要求提供。
RackSpace 云服务器详细信息: 操作系统:Ubuntu 10.04 LTS (Lucid) 内存:1024MB 磁盘空间:40 GB 数据中心:ORD1 服务级别:非托管
root@restore-testing:~# dpkg -s mysql-server ... 架构:全部 来源:mysql-dfsg-5.1 版本:5.1.61-0ubuntu0.10.04.1 ...
root@restore-testing:~# cat /etc/fstab 目录 proc /proc proc 默认值 0 0 /dev/xvda1 / ext3 defaults,errors=remount-ro,noatime 0 1 /dev/xvdc1 无交换 sw 0 0
根据 Innodb 刷新数据的方法,我可以看到这种情况的发生。
请查看您的 MySQL 安装使用的innodb_flush_method 。根据设置的值(O_DSYNC 或 O_DIRECT),InnoDB 可以双缓冲到操作系统和 InnoDB 缓冲池或只是 InnoDB 缓冲池。如果变量设置为仅缓存到缓冲池,如果操作系统恢复在此过程中破坏了缓冲池,我可以很快看到数据消失。我在 DBA StackExchange 上写了一篇关于这个的帖子。
这是另一个关于在云中使用 MySQL 与在裸机中使用 MySQL 的链接(单击此处)。它列出了将 MySQL 迁移到云环境中的三个潜在问题/挑战:
即使自那篇文章以来这些限制已被克服,重新考虑关键任务数据将驻留在何处仍是谨慎的做法。考虑到您的数据刚刚发生的事情,这一点尤其正确。
顺便说一句,StackOverflow 有一篇关于 MySQL in the Cloud 优缺点的好帖子。
为了从另一个方面进一步说明这一点,Cloud Environments 提供了从东海岸到西海岸的 mysql 实例的地理复制。当我亲自对 XEROUND 数据库服务进行为期 30 天的评估时(我获得了两个公共 IP),我发现 IP 之间的间歇性非常差(大约 5-6 分钟)。您能想象由于两端崩溃而在此窗口期间丢失数据吗?您的数据丢失是由于紧急手动干预造成的。
推荐
恕我直言,我会将您的 MySQL 数据库切换为裸机,并使用 DRBD 或 MySQL 复制来实现数据冗余。您可以维护 Web 和应用程序服务器的所有云服务。
虽然
innodb_flush_method
与某些硬件结合使用的某些设置可能会导致硬件故障导致数据丢失,但没有结合使用innodb_flush_method
并innodb_flush_log_at_trx_commit
解释 ib_logfile1 和 ib_logfile2 如何过时。我在数据库文件的时间戳左右迁移了服务器。我在两台服务器上缓慢地关闭了 mysql,并将 /var/lib/mysql 从一台服务器同步到另一台服务器。Web 应用程序出现并在新服务器上签出。
但是,如果我忘记
monit unmonitor mysql
在目标服务器上并且它重新启动了 mysql 怎么办?也许我已经替换了正在运行的 mysql 服务器下的数据和日志文件?mysql 会继续愉快地将数据刷新到陈旧的 inode 吗?稍后进行快速测试,答案是肯定的。当 MySql 的数据和日志文件已被替换但内存缓冲池能够满足所有查询时,MySql 不会注意到它正在写入无效的文件句柄。鉴于我们的数据库大小(小)和查询量(低),缓冲池可能会继续处理我们的请求一段时间。