在发布错误报告之前,请尝试验证它是否是一个错误,并且它是否已经被报告过:
-
首先,搜索 MySQL 在线手册 https://dev.mysql.com/doc/。我们尝试保持手册最新,通过频繁更新解决新发现的问题。此外,手册的发行说明也非常有用,因为它可能包含您的问题的解决方案。发行说明位于手册的同一位置。
-
如果您收到 SQL 语句的解析错误,请仔细检查语法。如果您无法找到语法错误,非常可能是您的 MySQL 服务器版本不支持您使用的语法。如果您使用的是当前版本,并且手册中没有涵盖您使用的语法,那么 MySQL 服务器不支持您的语句。
如果手册涵盖了您使用的语法,但您使用的是旧版本的 MySQL 服务器,请检查 MySQL 变更历史记录,以确定语法何时被实现。在这种情况下,您可以选择升级到新的 MySQL 服务器版本。
-
有关一些常见问题的解决方案,请参阅 第 B.3 节,“问题和常见错误”。
-
搜索错误数据库 http://bugs.mysql.com/,以查看错误是否已经被报告和修复。
-
您也可以使用 http://www.mysql.com/search/ 搜索 MySQL 网站上的所有网页(包括手册)。
如果您在手册、错误数据库或邮件列表存档中找不到答案,请与当地的 MySQL 专家联系。如果您仍然找不到问题的答案,请按照以下指南报告错误。
报告错误的正常方式是访问 http://bugs.mysql.com/,这是我们的错误数据库的地址。该数据库是公共的,可以被任何人浏览和搜索。如果您登录系统,您可以输入新的报告。
在错误数据库 http://bugs.mysql.com/ 中报告的错误将在发行说明中被注明。
如果您在 MySQL 服务器中发现安全错误,请立即通过发送电子邮件到 <secalert_us@oracle.com>
通知我们。例外:支持客户应该将所有问题,包括安全错误,报告给 Oracle 支持 http://support.oracle.com/。
要与其他用户讨论问题,可以使用 MySQL 社区 Slack。
编写良好的错误报告需要耐心,但第一次做对可以为我们和您自己节省时间。包含完整测试用例的良好错误报告,使我们在下一个版本中修复错误的可能性非常高。本节将帮助您正确编写报告,以便您不浪费时间做无用的事情,请仔细阅读本节并确保报告中包含所有描述的信息。
最好是在报告错误之前使用最新的生产或开发版本的 MySQL Server 进行测试。任何人都可以通过使用 mysql test < script_file
在您的测试用例中重复该错误,或者运行您在错误报告中包含的 shell 或 Perl 脚本。我们可以重复的任何错误都有很高的可能性在下一个 MySQL 版本中被修复。
错误报告中最有帮助的是包含问题的良好描述,即详细描述您所做的一切导致问题的操作,并详细描述问题本身。最好的报告是那些包含完整示例,展示如何重复错误或问题的报告。参见 第 7.9 节,“调试 MySQL”。
请记住,我们可以响应包含太多信息的报告,但不能响应包含太少信息的报告。人们经常省略事实,因为他们认为自己知道问题的原因,并假设某些细节不重要。一个良好的原则是,如果您怀疑是否应该提及某些信息,那么就提及它。在报告中写几行代码比等待我们的回应要快捷和少麻烦。
错误报告中最常见的错误是(a)未包括您使用的 MySQL 发行版的版本号,和(b)未完整描述 MySQL 服务器安装的平台(包括平台类型和版本号)。这些都是非常重要的信息,在 99% 的情况下,错误报告没有这些信息将是无用的。我们经常收到类似的问题,如“为什么这对我不起作用?”然后我们发现,所请求的功能在该 MySQL 版本中尚未实现,或者报告中的错误已经在新版本中被修复。错误经常是平台相关的。在这种情况下,如果不知道操作系统和平台版本号,我们几乎无法修复任何问题。
如果您从源代码编译了 MySQL,请记住也提供编译器的信息,如果它与问题相关。人们经常发现编译器中的错误,并认为问题是 MySQL 相关的大多数编译器都在不断发展,版本不断改进。为了确定问题是否依赖于编译器,我们需要知道您使用的编译器。请注意,每个编译问题都应该被视为错误并报告。
如果程序产生错误消息,那么在报告中包含该消息非常重要。如果我们尝试从存档中搜索某些内容,最好错误消息报告与程序产生的消息完全匹配。(甚至包括大小写)。最好将整个错误消息复制并粘贴到报告中。您永远不应该尝试从记忆中重现该消息。
如果您遇到 Connector/ODBC(MyODBC)问题,请尝试生成跟踪文件并随报告一起发送。请参阅 如何报告 Connector/ODBC 问题或错误。
如果您的报告包括使用 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”。
-
如果数据库表与问题相关,请在错误报告中包括来自
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
的输出。您提供的信息越多,越有可能有人能够帮助您。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 的输出,以提供一些关于系统性能的信息。
-
如果您无法提供只有少数行的测试用例,或者测试表太大无法包含在错误报告中(超过10行),那么您应该使用 mysqldump 将表转储,并创建一个描述问题的
README
文件。使用 tar 和 gzip 或 zip 创建一个压缩存档。然后,在我们的错误数据库中启动错误报告 http://bugs.mysql.com/,点击错误报告中的“文件”选项卡,按照上传存档到错误数据库的说明进行操作。 -
如果您认为 MySQL 服务器从语句中产生了奇怪的结果,不仅包括结果,还包括您认为结果应该是什么样的意见,以及您基于什么理由的解释。
-
当您提供问题的示例时,最好使用您实际情况中的表名、变量名等,而不是创造新的名称。问题可能与表名或变量名有关。这些情况很少见,但宁可安全。毕竟,为您提供使用实际情况的示例更容易,对我们来说也更好。如果您有不想让他人看到的数据,可以使用之前描述的方法上传。如果信息非常机密,不想让我们看到,可以使用其他名称,但请将其作为最后的选择。
-
尽可能包括相关程序的所有选项。例如,指出启动 mysqld 服务器时使用的选项,以及运行 MySQL 客户端程序时使用的选项。这些选项对于解决问题非常重要,例如 mysqld 和 mysql,以及 configure 脚本的选项。如果您的问题涉及到 Perl 或 PHP 等语言编写的程序,请包括语言处理器的版本号,以及该程序使用的模块的版本号。例如,如果您有一个使用
DBI
和DBD::mysql
模块的 Perl 脚本,请包括 Perl、DBI
和DBD::mysql
的版本号。 -
如果您的问题与权限系统相关,请包括 mysqladmin reload 的输出,以及尝试连接时的所有错误消息。当您测试权限时,应该执行 mysqladmin reload version 并尝试使用有问题的程序连接。
-
如果您有一个 bug 的补丁,请包含它。但是,不要假设补丁是我们所需的全部,或者我们可以使用它,如果您不提供一些必要的信息,例如显示补丁修复的测试用例。我们可能会发现补丁的问题,或者我们可能根本不理解它。如果是这样,我们不能使用它。
如果我们无法验证补丁的确切目的,我们将不使用它。测试用例可以帮助我们。在这里,显示补丁处理了所有可能出现的情况。如果我们发现一个边界情况(即使是罕见的),补丁将不起作用,它可能是无用的。
-
关于 bug 的猜测,例如它是什么、为什么会出现、或者它依赖于什么,通常都是错误的。甚至 MySQL 团队也不能猜测这些事情,除非首先使用调试器来确定 bug 的真正原因。
-
在您的 bug 报告中,指出您已经检查了参考手册和邮件存档,以便其他人知道您已经尝试解决问题。
-
如果您的数据出现损坏或您在访问特定表时出现错误,首先使用
CHECK TABLE
检查您的表。如果该语句报告了任何错误:-
InnoDB 崩溃恢复机制在服务器重新启动后处理清洁操作,因此在典型操作中不需要“修复”表。如果您遇到 InnoDB 表的错误,重新启动服务器,看看问题是否仍然存在,或者错误是否只影响内存中的缓存数据。如果磁盘上的数据损坏,考虑使用
innodb_force_recovery
选项重新启动,以便您可以转储受影响的表。 -
对于非事务表,尝试使用
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 版本和发行版安装”。