如何调查MySQL错误

时间:2016-07-06 19:46:13

标签: mysql database error-handling

以下是我发现在MySQL中显示错误和警告的查询:

SELECT 
`DIGEST_TEXT` AS `query`,
`SCHEMA_NAME` AS `db`,
`COUNT_STAR` AS `exec_count`,
`SUM_ERRORS` AS `errors`,
(ifnull((`SUM_ERRORS` / nullif(`COUNT_STAR`,0)),0) * 100) AS `error_pct`,
`SUM_WARNINGS` AS `warnings`,
(ifnull((`SUM_WARNINGS` / nullif(`COUNT_STAR`,0)),0) * 100) AS `warning_pct`,
`FIRST_SEEN` AS `first_seen`,
`LAST_SEEN` AS `last_seen`,
`DIGEST` AS `digest`
FROM
 performance_schema.events_statements_summary_by_digest
WHERE
((`SUM_ERRORS` > 0) OR (`SUM_WARNINGS` > 0))
ORDER BY
 `SUM_ERRORS` DESC,
 `SUM_WARNINGS` DESC;

是否有某种方法可以深入查看performance_schema,以找到与上面的errorswarnings相关联的确切错误消息?

如果db列或query列显示为NULL,我也很好奇。以下是我所谈论的一些具体例子

+---------------------+--------+------------+--------+----------+--------+
|       query         |   db   | exec_count | errors | warnings | digest | 
+---------------------+--------+------------+--------+----------+--------+
|  SHOW MASTER LOGS   |  NULL  |    192     |  192   |    0     |   ...  |
+---------------------+--------+------------+--------+----------+--------+
|        NULL         |  NULL  |   553477   |   64   |  18783   |  NULL  |
+---------------------+--------+------------+--------+----------+--------+
|  SELECT COUNT ( * ) |  NULL  |     48     |   47   |    0     |   ...  |
|FROM `mysql` . `user`|        |            |        |          |        |
+---------------------+--------+------------+--------+----------+--------+

我也愿意使用不同的查询,有人可能需要显示这些错误/警告

1 个答案:

答案 0 :(得分:1)

邮件将位于performance_schema.events_statements_history.message_text列中。您需要确保performance_schema_events_statements_history_size配置变量设置为正值且足够大的值,并且启用了历史记录集合。要启用历史记录收集,请运行:

update performance_schema.setup_consumers set enabled='YES' 
where name='events_statements_history';

检查是否已启用:

select * from performance_schema.setup_consumers where 
name='events_statements_history';

NULLdb表示没有选择活动数据库。请注意,活动数据库不必与查询中涉及的表的数据库相同。如果未在查询中明确指定活动数据库,则将其用作默认数据库。

这只会提供错误消息,而不是警告消息。从简短的代码看,警告文本似乎没有记录在任何地方 - 这是可以理解的,因为一个语句可以产生数百万个。所以你有几个选择:

  • events_statements_history.sql_text中提取语句,重新执行该语句,然后运行SHOW WARNINGS
  • 提取语句,在应用程序代码中跟踪它,然后检测代码以记录SHOW WARNINGS的输出,以便在手动执行无法重现警告时将其捕获。