1.6 报告错误或问题的方法
在报告一个问题之前,请先验证它是一个bug,并且已经没有人报告过:
-
首先,搜索 MySQL 在线手册在https://dev.mysql.com/doc/。我们尽量保持手册的最新性,通过频繁地更新解决新发现的问题。在此外,手册附件的发行说明可能非常有用,因为它很可能包含了解决问题的方案。发行说明可在给定的位置找到。
-
如果您对 SQL 语句出现解析错误,请检查语句的语法。如果找不到语法错误,那么您的当前 MySQL 服务器版本不支持该语法。如果您使用的是最新版本且手册不涵盖该语法,MySQL 服务器就不支持该语句。
如果手册涵盖了该语法,但是您使用的是较旧的 MySQL 服务器版本,那么您可以查看 MySQL 变更历史,以了解该语法何时实现。在这种情况下,您有升级到最新版本的 MySQL 服务器的选择。
-
对于一些常见的问题,见第 B.3 节,“问题和常见错误”。
-
搜索bugs数据库在http://bugs.mysql.com/,以查看该bug是否已经报告并且修复过了。
-
您也可以使用http://www.mysql.com/search/来搜索 MySQL 网站上的所有页面(包括手册)。
如果您在手册、错误数据库或邮件列表存档中找不到答案,请与您的本地MySQL专家联系。如果您仍然无法找到问题的答案,请按照以下指南报告bug。
报告bug的正常方式是访问http://bugs.mysql.com/
如果您在MySQL Server中发现安全bug,请立即发送电子邮件到<
secalert_us@oracle.com>http://support.oracle.com/
与其他用户讨论问题,您可以使用MySQL Community Slack
尽量使用最新的生产或开发版本的 MySQL 服务器测试问题,任何人都可以通过在您的测试案例中运行 mysql test < script_file
命令或包含在bug报告中的 shell 或 Perl 脚本来重复该 bug。我们能够重复的 bug 在下一个 MySQL 版本中有很高的可能性会被修复。
包括问题描述在bug报告中是最有帮助的,例如,详细描述您做了什么导致问题,以及精确地描述问题本身。最好的报告是包含完整示例,展示如何重复该 bug 或问题的见 第 7.9 节,“调试 MySQL”。
记住,我们可能会回应包含太多信息的报告,但不能回应包含太少信息的报告。人们经常忽略事实,因为他们认为知道问题的原因,假设某些细节不重要。一个好的原则是,如果您对某件事存疑,就说出来。写几个更多的行在您的报告中比等待回答更快也更少麻烦。
在bug报告中最常见的错误是(a)不包括使用的MySQL分布版本号,(b)不完全描述MySQL服务器安装平台(包括平台类型和版本号)。这些信息非常重要,在99个情况中,bug报告都是无用的。我们经常收到类似的问题,如“为什么这不工作?”然后发现请求的功能在该MySQL版本中没有实现,或者报错已经在新版本的MySQL中修复了。在这种情况下,我们无法解决问题,因为平台相关。错误经常是平台依赖的。在这种情况下,我们需要知道操作系统和平台版本号。
如果您从源代码编译了MySQL,记住也要提供与问题相关的编译器信息。人们经常在编译器中找到bug,然后认为问题是MySQL相关的。大多数编译器都在不断开发,变得越来越好。为了确定问题是否依赖于编译器,我们需要知道您使用了什么编译器。注意,每个编译问题都应该被视为bug并报告。
如果程序产生错误信息,那么包括该信息在您的报告中。如果我们要从存档中搜索,错误信息最好与程序产生的完全匹配(包括字母大小写)。最好将整个错误信息复制到报告中。您不应该尝试从记忆中重现该信息。
如果您遇到Connector/ODBC(MyODBC)问题,请尝试生成跟踪文件并与报告一起发送。请参阅如何报告Connector/ODBC问题或BUG。
如果您的报告包括使用命令行工具mysql运行测试用例的长查询输出行,可以使用--vertical
选项或语句终止符\G
来使输出更加可读。后面这个部分中的EXPLAIN SELECT
示例将演示\G
的使用。
请在报告中包含以下信息:
-
您正在使用的 MySQL 发行版号(例如,MySQL 5.7.10)。您可以通过执行mysqladmin version来确定当前运行的版本号。mysqladmin程序位于您的 MySQL 安装目录下的
bin
目录中。 -
您遇到的问题所在机器的制造商和型号。
-
操作系统名称和版本号。如果您使用Windows,可以通常通过双击“我的计算机”图标,下拉“帮助/关于 Windows”菜单来获取名称和版本号。对于大多数Unix-like操作系统,您可以通过执行命令
uname -a
来获取该信息。 -
有时内存的大小(实际和虚拟)是相关的。如果怀疑,包括这些值。
-
MySQL 安装包中的
docs/INFO_BIN
文件的内容。这文件包含了 MySQL 的配置和编译信息。 -
如果您使用 MySQL 软件的源代码分布,包括编译器名称和版本号。如果您使用二进制分布,包括分布名称。
-
如果出现编译错误,包括精确的错误消息,并且在错误发生的文件中包括几行上下文。
-
如果mysqld崩溃,您也应该报告导致mysqld意外退出的语句。您通常可以通过启用查询日志,运行mysqld,然后在日志中查看退出信息。见第7.9节,“调试 MySQL”。
-
如果数据库表与问题相关,请在bug报告中包含来自
SHOW CREATE TABLE
语句的输出。这是一个很简单的方式来获取数据库中的任何表定义。该信息帮助我们创建一个与您经历的情况相匹配的环境。db_name
.tbl_name
-
问题发生时的SQL模式可能非常重要,所以请报告
sql_mode
系统变量的值。对于存储过程、存储函数和触发器对象,相关的sql_mode
值是创建对象时的那个值。对于存储过程或函数,可以使用SHOW CREATE PROCEDURE
或SHOW CREATE FUNCTION
语句显示相关的SQL模式,或者您可以查询INFORMATION_SCHEMA
以获取信息:SELECT ROUTINE_SCHEMA, ROUTINE_NAME, SQL_MODE FROM INFORMATION_SCHEMA.ROUTINES;
对于触发器,您可以使用以下语句:
SELECT EVENT_OBJECT_SCHEMA, EVENT_OBJECT_TABLE, TRIGGER_NAME, SQL_MODE FROM INFORMATION_SCHEMA.TRIGGERS;
-
对于性能相关的错误或
SELECT
语句的问题,您总是应该包括EXPLAIN SELECT ...
的输出,以及SELECT
语句生产的行数。您也应该包括每个参与的表的SHOW CREATE TABLE
输出。提供关于您的情况的更多信息,someone就更可能帮助您。tbl_name
以下是一个非常好的错误报告示例。语句使用mysql 命令行工具。注意使用
\G
语句终止符来处理否则输出很长的语句,难以阅读。mysql> SHOW VARIABLES; mysql> SHOW COLUMNS FROM ...\G <output from SHOW COLUMNS> mysql> EXPLAIN SELECT ...\G <output from EXPLAIN> mysql> FLUSH STATUS; mysql> SELECT ...; <A short version of the output from SELECT, including the time taken to run the query> mysql> SHOW STATUS; <output from SHOW STATUS>
-
如果在运行mysqld 时出现错误或问题,尝试提供重现异常的输入脚本。这脚本应该包括必要的源文件。脚本越能重现您的情况越好。如果您可以创建可重现测试用例,应该将其附加到错误报告中。
如果无法提供脚本,您至少应该在报告中包括mysqladmin variables extended-status processlist 的输出,以提供系统性能信息。
-
如果您不能使用少于几行数据创建测试用例,或者测试表太大无法包含在bug报告中(超过10行),那么应该使用mysqldump将表dump出来,并创建一个
README
文件来描述您的问题。使用tar和gzip或zip将文件压缩成归档。您在http://bugs.mysql.com/创建bug报告后,点击Files标签了解如何上传归档到bug数据库。 -
如果您认为MySQL服务器从语句中产生了奇怪的结果,请包括不仅结果,还有您的看法和解释,描述您的看法基础。
-
当您提供问题示例时,使用实际情况中的表名、变量名等更好,而不是随便创建新的名称。这个问题可能与表名或变量名相关,这种情况很少,但总之安全第一。如果您有不想让他人看到的数据,可以使用Files标签上传它,如前所述。如果信息真的非常机密,不想我们看到,使用其他名称,但是请认为这是最后选择。
-
包括所有相关程序的选项,如果可能。例如,指出你启动mysqld 服务器时使用的选项,以及运行任何 MySQL 客户端程序时使用的选项。像mysqld 和 mysql,以及configure 脚本的选项,通常是解决问题的关键。总之,包括它们从不坏。如果你的问题涉及到语言如 Perl 或 PHP 的程序,请包括语言处理器的版本号,以及该程序使用的模块的版本号。例如,如果你有一个使用
DBI
和DBD::mysql
模块的 Perl 脚本,包括 Perl、DBI
和DBD::mysql
的版本号。 -
如果你的问题与权限系统相关,请包括mysqladmin reload 的输出,以及你尝试连接时获取的所有错误信息。测试你的权限时,你应该执行mysqladmin reload version,然后使用给你麻烦的程序尝试连接。
-
如果您有一个bug的补丁,请包括它。但是,不要假设补丁就是我们需要的,也不要假设我们可以使用它,如果您不提供一些必要的信息,例如显示补丁修复的bug的测试用例。我们可能会发现补丁的问题,也可能无法理解。如果是这样,我们就不能使用它。
如果我们不能验证补丁的确切目的是什么,我们就不会使用它。测试用例可以帮助我们这里。显示补丁处理所有可能出现的情况。如果我们找到一个边界情况(即使很少见的一种),补丁可能无效。
-
关于bug的猜测,为什么会发生,或者是什么依赖于什么通常都是错误的,即使MySQL团队也不能猜测这些事情,除非首先使用调试器来确定bug的真正原因。
-
在您的bug报告中指出您已经检查了参考手册和邮件档案,以便其他人知道您自己尝试解决问题。
-
如果您的数据出现损坏或访问某个表时出现错误,首先使用
CHECK TABLE
语句检查表。如果该语句报告任何错误:-
InnoDB崩溃恢复机制在服务器重启后处理清洁工作,所以在通常操作中没有必要““修复”表。如果您遇到InnoDB表的错误,重新启动服务器,看看问题是否 persists,或者错误只影响内存中的缓存数据。如果磁盘数据损坏,考虑使用
innodb_force_recovery
选项启用,以便可以dump受影响的表。 -
对于非事务表,尝试使用
REPAIR TABLE
或者使用 myisamchk。见第7章,MySQL 服务器管理.
如果您正在运行 Windows,请使用
SHOW VARIABLES LIKE 'lower_case_table_names'
语句验证lower_case_table_names
的值。这個变量影响服务器对数据库和表名的字母大小写。其效果对于给定的值应如同在第11.2.3节,“标识符字母大小写”中描述。 -
-
如果您经常遇到损坏的表,您应该尝试找到是什么时候和为什么发生这种情况。在这种情况下,MySQL 数据目录中的错误日志可能包含一些关于发生的事情的信息(该文件名以
.err
后缀结尾)。见第7.4.2节,“错误日志”。请在bug报告中包含来自该文件的任何相关信息。通常mysqld不应该如果没有中断更新就损坏一个表。如果您可以找到mysqld死机的原因,那么我们更容易为您提供解决问题的方法。见第B.3.1节,“确定是什么造成问题”。 -
如果可能,请下载并安装最新版本的 MySQL 服务器,并检查是否解决了您的问题。MySQL 软件的所有版本都经过了充分测试,应该无问题。如果您可以轻松地切换 MySQL 版本,我们也尽量保持向后兼容性。见第2.1.2节,“安装哪个 MySQL 版本和分布式”。