28.5.1.6 使用服务器日志查找 mysqld 中的错误原因

请注意,在启用常规查询日志的情况下启动mysqld之前,应使用myisamchk检查所有 table。参见第 5 章,MySQL 服务器 Management

如果mysqld死亡或挂起,则应在启用常规查询日志的情况下以mysqld开头。参见第 5.4.3 节“常规查询日志”mysqld再次死亡时,您可以检查日志文件的结尾以查找杀死mysqld的查询。

如果使用默认的常规查询日志文件,则该日志将以host_name.log的形式存储在数据库目录中。在大多数情况下,它是日志文件中最后一个杀死mysqld的查询,但如果可能,应通过重新启动mysqld并执行找到的命令来进行验证通过mysql命令行工具查询。如果可行,您还应该测试所有未完成的复杂查询。

您也可以在所有SELECT语句上尝试命令EXPLAIN,这些命令花费很长时间才能确保mysqld正确使用索引。参见第 13.8.2 节“ EXPLAIN 语句”

您可以通过在启用慢速查询日志的情况下启动mysqld来查找执行时间较长的查询。参见第 5.4.5 节“缓慢的查询日志”

如果您在错误日志中找到文本mysqld restarted(通常是名为host_name.err的文件),则可能已找到导致mysqld失败的查询。如果发生这种情况,则应使用myisamchk检查所有 table(请参见第 5 章,MySQL 服务器 Management),并测试 MySQL 日志文件中的查询以查看是否失败。如果发现这样的查询,请尝试首先升级到最新的 MySQL 版本。如果这样做没有帮助,请报告错误,请参见第 1.7 节“如何报告错误或问题”

如果您已设置myisam_recover_options系统变量来启动mysqld,则 MySQL 会自动检查并尝试修复MyISAMtable,如果它们被标记为“未正确关闭”或“崩溃”。如果发生这种情况,MySQL 将在hostname.err文件'Warning: Checking table ...'中写入一个条目,如果需要修复该 table,则在其后写入Warning: Repairing table。如果您遇到许多此类错误,而mysqld之前没有意外死亡,则说明存在错误,需要进一步调查。参见第 5.1.6 节“服务器命令选项”

服务器检测到MyISAMtable 损坏时,会将其他信息写入错误日志,例如源文件的名称和行号以及访问该 table 的线程列 table。示例:Got an error from thread_id=1, mi_dynrec.c:368。这是包含在错误报告中的有用信息。

如果mysqld意外死亡不是一个好兆头,但是在这种情况下,您不应该调查Checking table...消息,而应尝试找出mysqld为何死亡。