29.12.22.2 错误日志表
MySQL服务器维护的日志中,有一张是错误日志,它记录了诊断信息(参见第7.4.2节,“错误日志”)。通常,服务器在服务器主机上或系统日志服务中写入诊断信息。根据错误日志配置,服务器也可以将最新的错误事件写入性能_schema中的error_log
表。授予对error_log
表的SELECT
权限给客户端和应用程序,可以让它们使用SQL查询访问错误日志内容,从而使DBA能够提供对日志的访问,而无需在服务器主机上允许直接文件系统访问。
性能_schema中的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.4.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
性能_schema中的error_log
表具有以下列。如描述所示,除了DATA
列外,其余所有列都对应于错误事件结构的字段,该结构在第7.4.2.3节,“错误事件字段”中描述。
-
LOGGED
事件时间戳,具有微秒精度。
LOGGED
对应于错误事件的time字段,尽管可能存在某些潜在差异:-
time
值在错误日志中根据log_timestamps系统变量的设置显示;参见早期启动日志输出格式。 -
LOGGED
列使用TIMESTAMP
数据类型存储值,这种数据类型在UTC中存储值,但在检索时以当前会话时间区显示;参见第13.2.2节,“日期、日期时间和时间戳类型”。
要以与错误日志文件中显示的相同时间区显示
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字段。在性能_schema中,
THREAD_ID
列在error_log
表中最接近于threads
表的PROCESSLIST_ID列:-
对于前台线程,
THREAD_ID
和PROCESSLIST_ID代表一个连接标识符。这与在INFORMATION_SCHEMA
PROCESSLIST
表的ID列、SHOW PROCESSLIST
输出中的Id列以及CONNECTION_ID()函数中的线程返回相同的值。 -
对于后台线程,
THREAD_ID
为0,PROCESSLIST_ID
为NULL
。
许多性能模式表格除了
error_log
之外,还有一个名为THREAD_ID
的列,但在这些表格中,THREAD_ID
列是由性能模式内部分配的值。 -
-
PRIO
事件优先级。允许的值为
System
、Error
、Warning
和Note
。PRIO
列基于错误事件的label
字段,该字段本身基于内部数字prio
字段值。 -
ERROR_CODE
错误代码。
ERROR_CODE
对应于错误事件的error_code
字段。 -
SUBSYSTEM
事件发生的子系统。
SUBSYSTEM
对应于错误事件的subsystem
字段。 -
DATA
错误事件的文本表示形式。该值的格式取决于生成
error_log
行的日志汇总组件。如果日志汇总组件是log_sink_internal
或log_sink_json
,则DATA
值表示以传统格式或JSON格式的错误事件。请参阅第7.4.2.9节,“错误日志输出格式”。由于错误日志可以重新配置以更改提供给
error_log
表的日志汇总组件,并且不同的汇总组件产生不同格式的输出,可能会有在不同时间写入到error_log
表中的DATA
格式不同的行。
性能模式的error_log
表有这些索引:
-
主键在(
LOGGED
)上 -
索引在(
THREAD_ID
)上 -
索引在(
PRIO
)上 -
索引在(
ERROR_CODE
)上 -
索引在(
SUBSYSTEM
)上
TRUNCATE TABLE
不允许对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
表将保持为空。否则,如果收集器提供解析器,并且日志配置允许找到一个之前写入的错误日志文件,服务器使用收集器解析器读取文件的最后部分,并将其中包含的旧事件写入到表中。然后,收集器将为其发生的新错误事件写入表。 -
运行时,如果
log_ error_services
的值发生变化,服务器再次检查它,这次查找左侧启用的日志收集器,该收集器支持error_log
表,无论是否提供解析器。如果没有这样的日志收集器,不会向
error_log
表中写入额外的错误事件。否则,新配置的收集器将为其发生的新错误事件写入表。
影响错误日志输出的任何配置都会影响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 |
写入表的最后时间 |