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 会自动检查并尝试修复MyISAM
table,如果它们被标记为“未正确关闭”或“崩溃”。如果发生这种情况,MySQL 将在hostname.err
文件'Warning: Checking table ...'
中写入一个条目,如果需要修复该 table,则在其后写入Warning: Repairing table
。如果您遇到许多此类错误,而mysqld之前没有意外死亡,则说明存在错误,需要进一步调查。参见第 5.1.6 节“服务器命令选项”。
服务器检测到MyISAM
table 损坏时,会将其他信息写入错误日志,例如源文件的名称和行号以及访问该 table 的线程列 table。示例:Got an error from thread_id=1, mi_dynrec.c:368
。这是包含在错误报告中的有用信息。
如果mysqld意外死亡不是一个好兆头,但是在这种情况下,您不应该调查Checking table...
消息,而应尝试找出mysqld为何死亡。