Windows Server 2008 R2 x64
MySQL 服务器 5.6.14 x64
还有其他人遇到某些表在 Microsoft Windows 服务器上被标记为崩溃的问题吗?我们有几台 Windows 服务器(不是自愿的)和六台运行 MySQL 的 Linux 服务器。出于某种原因,Windows 服务器上的表经常被标记为“崩溃”。我们的 Linux (Ubuntu) 服务器上从来没有这些问题。
2014-01-23 10:11:42 1868 [ERROR] MySQL: Table '.\elite_prod\ffcont' is marked as crashed and should be repaired
2014-01-23 10:11:42 1868 [ERROR] MySQL: Table '.\elite_prod\bldr' is marked as crashed and should be repaired
2014-01-23 10:11:43 1868 [ERROR] MySQL: Table '.\elite_prod\frtfwd' is marked as crashed and should be repaired
2014-01-23 10:11:44 1868 [ERROR] MySQL: Table '.\elite_prod\histry' is marked as crashed and should be repaired
似乎我们必须每隔几周左右处理一次这个问题。非常令人沮丧。
从错误消息中,我可以快速判断以下内容:
ffcount
,bldr
,frtfwd
, 和histry
都是 MyISAM 表因为您使用的是MyISAM 存储引擎,所以您有两个主要障碍:
障碍 #1
对 MyISAM 的更改以不同方式缓存(无论操作系统如何)
.MYI
由 MyISAM 存储引擎刷新到.MYD
操作系统刷新到 (OUCH !!!!)障碍 #2
Microsoft Windows 在缓存磁盘更改方面表现不佳。即使
FLUSH TABLES;
在Windows环境下运行MySQL也不是万能的。恕我直言,任何使用 PostgreSQL 或 Oracle 的人都应该能够对 Windows 提出同样的抱怨。我将把它留给 SQL Server 专家来回答他们如何根据 SQL Server 找到 Windows 缓存。分析
MyISAM 针对表维护打开文件句柄的计数。
如果 mysqld 进程或 Windows Server 崩溃,每个具有打开文件句柄的 MyISAM 将在内部保留打开文件句柄计数。
自 mysqld 启动以来第一次访问 MyISAM 表时,它应该有一个零文件句柄。否则,您会收到该错误消息
marked as crashed and should be repaired
。这解释了当崩溃崩溃时定期出现的表。请参阅我的帖子MyISAM 表不断崩溃。我有哪些选择?
建议
您可以将这些表切换到 InnoDB 并让 InnoDB 缓冲区缓存所有内容,或者至少进行更好的缓存。在这方面我仍然担心 Windows,因为选项innodb_flush_method在 Windows 版本的 MySQL 中被禁用。我说禁用是因为MySQL 文档说:
如果你想将表保留为 MyISAM,请返回 Ubuntu,因为它在刷新磁盘更改时更加勤奋,尤其是当它有足够的 RAM 时。即使是 1 TB 的 RAM 也不会为 Windows 中的 MyISAM 表做任何事情。
你为什么不修理它们
如果错误仍然存在,然后进行故障排除!