Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

29.12.22.2 错误日志表

MySQL 服务器维护的日志之一是错误日志,其中写入诊断消息(见 第 7.4.2 节,“错误日志”)。通常,服务器将诊断写入到服务器主机上的文件或系统日志服务中。根据错误日志配置,服务器也可以将最新的错误事件写入 Performance Schema error_log 表。授予 SELECT 权限的 error_log 表,因此客户端和应用程序可以使用 SQL 查询访问错误日志内容,而无需在服务器主机上授予直接的文件系统访问权限。

error_log 表支持基于其结构化列的集中查询。它还包括错误消息的完整文本,以支持更多的自由形式分析。

该表的实现使用固定大小的内存环形缓冲区,以自动删除旧事件以腾出空间供新事件使用。

示例 error_log 内容:

mysql> SELECT * FROM performance_schema.error_log\G
*************************** 1. row ***************************
    LOGGED: 2020-08-06 09:25:00.338624
 THREAD_ID: 0
      PRIO: System
ERROR_CODE: MY-010116
 SUBSYSTEM: Server
      DATA: mysqld (mysqld 8.3.0) starting as process 96344
*************************** 2. row ***************************
    LOGGED: 2020-08-06 09:25:00.363521
 THREAD_ID: 1
      PRIO: System
ERROR_CODE: MY-013576
 SUBSYSTEM: InnoDB
      DATA: InnoDB initialization has started.
...
*************************** 65. row ***************************
    LOGGED: 2020-08-06 09:25:02.936146
 THREAD_ID: 0
      PRIO: Warning
ERROR_CODE: MY-010068
 SUBSYSTEM: Server
      DATA: CA certificate /var/mysql/sslinfo/cacert.pem is self signed.
...
*************************** 89. row ***************************
    LOGGED: 2020-08-06 09:25:03.112801
 THREAD_ID: 0
      PRIO: System
ERROR_CODE: MY-013292
 SUBSYSTEM: Server
      DATA: Admin interface ready for connections, address: '127.0.0.1' port: 33062

error_log 表具有以下列。如描述所示,除了 DATA 列外,所有列都对应于错误事件结构的字段,该结构在 第 7.4.2.3 节,“错误事件字段” 中进行了描述。

  • LOGGED

    事件时间戳,以微秒精度。LOGGED 对应于错误事件的 time 字段,尽管存在一些潜在的差异:

    要在同一个时区中显示 LOGGED 值,如错误日志文件中所示,首先设置会话时区如下:

    SET @@session.time_zone = @@global.log_timestamps;

    如果 log_timestamps 值为 UTC,且您的系统没有安装命名时区支持(见 第 7.1.15 节,“MySQL 服务器时区支持”),则设置时区如下:

    SET @@session.time_zone = '+00:00';
  • THREAD_ID

    MySQL 线程 ID。THREAD_ID 对应于错误事件的 thread 字段。

    在 Performance Schema 中,THREAD_ID 列在 error_log 表中最类似于 threads 表的 PROCESSLIST_ID 列:

    • 对于前台线程,THREAD_IDPROCESSLIST_ID 代表连接标识符。这是 INFORMATION_SCHEMA PROCESSLIST 表中的 Id 列、SHOW PROCESSLIST 输出中的 Id 列和 CONNECTION_ID() 函数返回的值。

    • 对于背景线程,THREAD_ID 是 0,PROCESSLIST_IDNULL

    许多性能模式表除了 error_log 都有一个名为 THREAD_ID 的列,但是在这些表中,THREAD_ID 列是一个由性能模式内部分配的值。

  • PRIO

    事件优先级。允许的值是 SystemErrorWarningNotePRIO 列基于错误事件的 label 字段,该字段又基于基础数字 prio 字段值。

  • ERROR_CODE

    数字事件错误代码。ERROR_CODE 对应于错误事件的 error_code 字段。

  • SUBSYSTEM

    事件发生的子系统。SUBSYSTEM 对应于错误事件的 subsystem 字段。

  • DATA

    错误事件的文本表示。该值的格式取决于生成 error_log 行的日志 sink 组件。如果日志 sink 是 log_sink_internallog_sink_jsonDATA 值将以传统或 JSON 格式表示错误事件。(见 第 7.4.2.9 节,“错误日志输出格式”。)

    因为错误日志可以重新配置以更改提供 error_log 表行的日志 sink 组件,并且不同的 sink 生产不同的输出格式,因此可能在不同的时间写入 error_log 表的行具有不同的 DATA 格式。

The error_log 表具有以下索引:

  • 主键在 (LOGGED)

  • 索引在 (THREAD_ID)

  • 索引在 (PRIO)

  • 索引在 (ERROR_CODE)

  • 索引在 (SUBSYSTEM)

TRUNCATE TABLE 不允许用于 error_log 表。

错误日志表的实现和配置

性能模式 error_log 表由错误日志 sink 组件填充,该组件除了将格式化的错误事件写入错误日志外,还将事件写入表中。性能模式对日志 sink 的支持有两个部分:

  • 日志 sink 可以将新的错误事件写入 error_log 表中。

  • 日志 sink 可以提供一个解析器来提取之前写入的错误消息。这使得服务器实例可以读取之前实例写入的错误日志文件并将其存储在 error_log 表中。在关闭时,之前实例写入的消息可能有助于诊断关闭的原因。

目前,传统格式的 log_sink_internal 和 JSON 格式的 log_sink_json sink 都支持将新的事件写入 error_log 表中,并提供了一个解析器来读取之前写入的错误日志文件。

错误日志服务系统变量控制哪些日志组件启用错误日志记录。其值是一个左到右执行的日志过滤器和日志sink组件的管道,当错误事件发生时。该 log_error_services 值与填充 error_log 表相关,如下所示:

  • 在启动时,服务器检查 log_error_services 值,并从中选择左侧最靠近的日志sink,满足以下条件:

    • 支持 error_log 表的sink,并提供解析器。

    • 如果没有,支持 error_log 表但不提供解析器的sink。

    如果没有日志sink满足这些条件, error_log 表将保持为空。否则,如果sink提供解析器并且日志配置启用了以前写入的错误日志文件的发现,服务器使用sink解析器读取文件的最后一部分,并将其中包含的旧事件写入表中。然后,sink将新的错误事件写入表中。

  • 在运行时,如果 log_error_services 的值更改,服务器再次检查它,这次查找左侧启用的日志sink,支持 error_log 表,无论它是否提供解析器。

    如果没有这样的日志sink存在,不会将新的错误事件写入 error_log 表中。否则,新的日志sink将新的错误事件写入表中。

任何影响错误日志输出的配置都将影响 error_log 表的内容。这包括诸如详细程度、消息抑制和消息过滤的设置。它也适用于从以前的日志文件中读取的信息。例如,在以前的服务器实例中配置了低详细程度的消息,在当前实例中配置了高详细程度的消息时,这些消息不会变得可用。

error_log 表是一个固定大小的内存环形缓冲区,旧事件将自动被丢弃以腾出空间供新事件使用。如下表所示,几个状态变量提供了关于正在进行的 error_log 操作的信息。

Status Variable Meaning
Error_log_buffered_bytes 表中的字节数
Error_log_buffered_events 表中的事件数
Error_log_expired_events 从表中丢弃的事件数
Error_log_latest_write 最后写入表的时间