#### 27.12.21.1 错误\_日志表

[](<>)[](<>)

在 MySQL 服务器维护的日志中，一个是它写入诊断消息的错误日志（参见[第 5.4.2 节，“错误日志”](error-log.html)）。通常，服务器将诊断信息写入服务器主机上的文件或系统日志服务。从 MySQL 8.0.22 开始，根据错误日志配置，服务器还可以将最近的错误事件写入 Performance Schema[`错误日志`](performance-schema-error-log-table.html)桌子。授予[`选择`](privileges-provided.html#priv_select)的特权[`错误日志`](performance-schema-error-log-table.html)因此，表使客户端和应用程序可以使用 SQL 查询访问错误日志内容，从而使 DBA 能够提供对日志的访问，而无需允许直接访问服务器主机上的文件系统。

这[`错误日志`](performance-schema-error-log-table.html)table 支持基于其更结构化的列的集中查询。它还包括错误消息的全文，以支持更自由的分析。

表实现使用固定大小的内存环形缓冲区，旧事件会根据需要自动丢弃，以便为新事件腾出空间。

例子[`错误日志`](performance-schema-error-log-table.html)内容：

```
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
```

这[`错误日志`](performance-schema-error-log-table.html)表有以下列。如说明中所示，除了`数据`列对应于底层错误事件结构的字段，在[第 5.4.2.3 节，“错误事件字段”](error-log-event-fields.html).

-   `已记录`

    事件时间戳，精度为微秒。`已记录`对应于`时间`错误事件的领域，虽然有一定的潜在差异：

    -   `时间`错误日志中的值根据[`日志时间戳`](server-system-variables.html#sysvar_log_timestamps)系统变量设置；看[早期启动日志输出格式](error-log-format.html#error-log-format-output-format-for-early-logging).

    -   这`已记录`列使用[`时间戳`](datetime.html)数据类型，其值以 UTC 存储，但在当前会话时区检索时显示；看[第 11.2.2 节，“DATE、DATETIME 和 TIMESTAMP 类型”](datetime.html).

        显示`已记录`与错误日志文件中显示的时区相同的值，首先将会话时区设置如下：

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

    如果[`日志时间戳`](server-system-variables.html#sysvar_log_timestamps)值为`世界标准时间`并且您的系统没有安装命名时区支持（请参阅[第 5.1.15 节，“MySQL 服务器时区支持”](time-zone-support.html))，这样设置时区：

    ```
    SET @@session.time_zone = '+00:00';
    ```

-   `THREAD_ID`

    MySQL 线程 ID。`THREAD_ID`对应于`线`错误事件的领域。

    在性能模式中，`THREAD_ID`列中的[`错误日志`](performance-schema-error-log-table.html)表最相似`PROCESSLIST_ID`的列[`线程`](performance-schema-threads-table.html)桌子：

    -   对于前台线程，`THREAD_ID`和`PROCESSLIST_ID`表示连接标识符。这与显示在`ID`的列`INFORMATION_SCHEMA` [`进程列表`](information-schema-processlist-table.html)表，显示在`Id`列[`显示进程列表`](show-processlist.html)输出，并由[`CONNECTION_ID()`](information-functions.html#function_connection-id)线程内的函数。

    -   对于后台线程，`THREAD_ID`为 0 并且`PROCESSLIST_ID`是`空值`.

        许多性能模式表，除了[`错误日志`](performance-schema-error-log-table.html)有一列名为`THREAD_ID`，但在这些表中，`THREAD_ID`column 是 Performance Schema 内部分配的值。

-   `普里奥`

    事件优先级。允许的值为`系统`,`错误`,`警告`,`笔记`.这`普里奥`列是基于`标签`错误事件的字段，它本身基于基础数字`优先`字段值。

-   `错误代码`

    数字事件错误代码。`错误代码`对应于`错误代码`错误事件的领域。

-   `子系统`

    发生事件的子系统。`子系统`对应于`子系统`错误事件的领域。

-   `数据`

    错误事件的文本表示。此值的格式取决于生成[`错误日志`](performance-schema-error-log-table.html)排。例如，如果日志接收器是`log_sink_internal`要么`log_sink_json`,`数据`值分别表示传统或 JSON 格式的错误事件。（看[第 5.4.2.9 节，“错误日志输出格式”](error-log-format.html).)

    因为可以重新配置错误日志以更改向[`错误日志`](performance-schema-error-log-table.html)表，并且由于不同的接收器产生不同的输出格式，因此有可能将行写入[`错误日志`](performance-schema-error-log-table.html)表在不同的时间有不同的`数据`格式。

    这[`错误日志`](performance-schema-error-log-table.html)表有这些索引：

-   主键打开 (`已记录`)

-   索引 (`THREAD_ID`)

-   索引 (`普里奥`)

-   索引 (`错误代码`)

-   索引 (`子系统`)

[`截断表`](truncate-table.html)不允许[`错误日志`](performance-schema-error-log-table.html)桌子。

##### 错误的实现和配置\_日志表

性能模式[`错误日志`](performance-schema-error-log-table.html)除了将格式化的错误事件写入错误日志之外，表还由写入表的错误日志接收器组件填充。日志接收器对性能模式的支持有两个部分：

-   日志接收器可以将新的错误事件写入[`错误日志`](performance-schema-error-log-table.html)表，因为它们发生。

-   日志接收器可以提供解析器，用于提取以前编写的错误消息。这使服务器实例能够读取前一个实例写入错误日志文件的消息并将它们存储在[`错误日志`](performance-schema-error-log-table.html)桌子。前一个实例在关机期间写入的消息可能有助于诊断关机发生的原因。

    目前，传统格式`log_sink_internal`和 JSON 格式`log_sink_json`接收器支持将新事件写入[`错误日志`](performance-schema-error-log-table.html)表并提供一个解析器来读取以前写入的错误日志文件。

    这[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)系统变量控制启用哪些日志组件以进行错误日志记录。它的值是日志过滤器和日志接收器组件的管道，当错误事件发生时，将按照从左到右的顺序执行。这[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)值与填充[`错误日志`](performance-schema-error-log-table.html)表如下：

-   启动时，服务器会检查[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)值并从中选择满足这些条件的最左边的日志接收器：

    -   一个水槽，支持[`错误日志`](performance-schema-error-log-table.html)表并提供解析器。

    -   如果没有，支持的接收器[`错误日志`](performance-schema-error-log-table.html)表但不提供解析器。

        如果没有日志接收器满足这些条件，则[`错误日志`](performance-schema-error-log-table.html)表仍然是空的。否则，如果接收器提供解析器并且日志配置能够找到先前写入的错误日志文件，则服务器使用接收器解析器读取文件的最后一部分并将其包含的旧事件写入表中。然后，接收器在发生新错误事件时将其写入表。

-   在运行时，如果值为[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)更改后，服务器再次检查它，这次寻找支持[`错误日志`](performance-schema-error-log-table.html)表，不管它是否提供解析器。

    如果不存在这样的日志接收器，则不会将其他错误事件写入[`错误日志`](performance-schema-error-log-table.html)桌子。否则，新配置的接收器将在发生新错误事件时将其写入表。

    任何影响写入错误日志的输出的配置都会影响[`错误日志`](performance-schema-error-log-table.html)表内容。这包括诸如详细程度、消息抑制和消息过滤等设置。它也适用于在启动时从以前的日志文件中读取的信息。例如，如果文件被配置为更高详细度的当前实例读取，则在先前配置为低详细度的服务器实例期间未写入的消息将不可用。

    这[`错误日志`](performance-schema-error-log-table.html)table 是一个固定大小的内存环形缓冲区的视图，旧事件会根据需要自动丢弃，以便为新事件腾出空间。如下表所示，几个状态变量提供了关于正在进行的信息[`错误日志`](performance-schema-error-log-table.html)手术。

| 状态变量 | 意义 |
| ---- | --- |
| [`Error_log_buffered_bytes`](server-status-variables.html#statvar_Error_log_buffered_bytes) | 表中使用的字节 |
| [`Error_log_buffered_events`](server-status-variables.html#statvar_Error_log_buffered_events) | 表中出现的事件 |
| [`Error_log_expired_events`](server-status-variables.html#statvar_Error_log_expired_events) | 从表中丢弃的事件 |
| [`Error_log_latest_write`](server-status-variables.html#statvar_Error_log_latest_write) | 上次写入表的时间 |
