Documentation Home

27.12.21.1 error_log 表

在 MySQL 服务器维护的日志中,一个是错误日志,它将诊断消息写入其中(请参阅 第 5.4.2 节,“错误日志”)。通常,服务器将诊断信息写入服务器主机上的文件或系统日志服务。从 MySQL 8.0.22 开始,根据错误日志配置,服务器还可以将最近的错误事件写入 Performance Schema error_log表。因此,授予 SELECT该表的权限 error_log使客户端和应用程序可以使用 SQL 查询访问错误日志内容,从而使 DBA 能够提供对日志的访问权限,而无需允许在服务器主机上直接访问文件系统。

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.0.23) 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列之外的所有字段都对应于底层错误事件结构的字段,这在 第 5.4.2.3 节“错误事件字段”中进行了描述。

  • LOGGED

    事件时间戳,精度为微秒。 LOGGED对应于 time错误事件的领域,尽管有一定的潜在差异:

    LOGGED以错误日志文件中显示的相同时区显示值,请首先按如下方式设置会话时区:

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

    如果log_timestamps 值是UTC并且您的系统没有安装命名时区支持(请参阅 第 5.1.15 节,“MySQL 服务器时区支持”),请像这样设置时区:

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

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

    在 Performance Schema 中, 表中的THREAD_ID列与 表的列error_log最相似: PROCESSLIST_IDthreads

    • 对于前台线程,THREAD_ID 代表PROCESSLIST_ID一个连接标识符。这与表ID列中 显示的值、输出列中 显示的值 以及线程内函数 返回的 值相同。INFORMATION_SCHEMA PROCESSLISTIdSHOW PROCESSLISTCONNECTION_ID()

    • 对于后台线程,是 THREAD_ID 0 和. PROCESSLIST_IDNULL

    许多 Performance Schema 表 error_log都有一个名为 的列 THREAD_ID,但在这些表中,该 THREAD_ID列是由 Performance Schema 内部分配的值。

  • PRIO

    事件优先级。允许的值为 System, Error, Warning, Note。该 PRIO列基于 label错误事件字段,而错误事件字段本身基于基础数字 prio字段值。

  • ERROR_CODE

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

  • SUBSYSTEM

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

  • DATA

    错误事件的文本表示。该值的格式取决于生成该 error_log行的日志接收器组件生成的格式。例如,如果日志接收器是log_sink_internallog_sink_json,则DATA 值分别表示传统格式或 JSON 格式的错误事件。(参见 第 5.4.2.9 节,“错误日志输出格式”。)

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

error_log表具有以下索引:

  • LOGGED( ) 上的主键

  • 索引 ( THREAD_ID)

  • 索引 ( PRIO)

  • 索引 ( ERROR_CODE)

  • 索引 ( SUBSYSTEM)

TRUNCATE TABLE不允许用于error_log表。

error_log 表的实现和配置

Performance Schema error_log表由写入表的错误日志接收器组件填充,除了将格式化的错误事件写入错误日志之外。日志接收器的性能模式支持有两个部分:

  • 日志接收器可以在新的错误事件发生时将其写入 error_log表。

  • 日志接收器可以提供一个解析器来提取以前写入的错误消息。这使服务器实例能够读取前一个实例写入错误日志文件的消息并将它们存储在 error_log表中。先前实例关闭期间写入的消息可能有助于诊断关闭发生的原因。

目前,传统格式 log_sink_internal和 JSON 格式的 接收器log_sink_json支持将新事件写入error_log表,并提供解析器来读取以前写入的错误日志文件。

系统log_error_services 变量控制启用哪些日志组件进行错误记录。它的值是日志过滤器和日志接收器组件的管道,当错误事件发生时,它们将按从左到右的顺序执行。该 log_error_services值与填充 error_log表有关,如下所示:

  • 在启动时,服务器检查该 log_error_services 值并从中选择满足这些条件的最左边的日志接收器:

    • 支持 error_log表并提供解析器的接收器。

    • 如果没有,则支持该 error_log表但不提供解析器的接收器。

    如果没有日志接收器满足这些条件,则 error_log表保持为空。否则,如果接收器提供解析器并且日志配置允许找到以前写入的错误日志文件,则服务器使用接收器解析器读取文件的最后部分并将其包含的旧事件写入表。接收器然后在新错误事件发生时将其写入表。

  • 在运行时,如果值发生 log_error_services 变化,服务器再次检查它,这次寻找支持该 error_log表的最左边启用的日志接收器,而不管它是否提供解析器。

    如果不存在这样的日志接收器,则不会将其他错误事件写入 error_log表中。否则,新配置的接收器会在新错误事件发生时将其写入表中。

任何影响写入错误日志的输出的配置都会影响error_log表内容。这包括诸如冗长、消息抑制和消息过滤等设置。它还适用于在启动时从以前的日志文件中读取的信息。例如,如果文件被配置为较高详细程度的当前实例读取,则在先前配置为低详细程度的服务器实例期间未写入的消息将不可用。

error_log表是固定大小的内存环形缓冲区的视图,其中会根据需要自动丢弃旧事件以为新事件腾出空间。如下表所示,几个状态变量提供有关正在进行的 error_log操作的信息。

状态变量 意义
Error_log_buffered_bytes 表中使用的字节
Error_log_buffered_events 表中存在的事件
Error_log_expired_events 从表中丢弃的事件
Error_log_latest_write 最后一次写入表的时间