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

MySQL 8.3 Reference Manual  /  ...  /  Error Log Configuration

7.4.2.1 错误日志配置

在 MySQL 8.3 中,错误日志使用了在 第 7.5 节,“MySQL 组件” 中描述的 MySQL 组件架构。错误日志子系统由执行日志事件过滤和写入的组件,以及配置要加载和启用以实现所需日志结果的系统变量组成。

本节讨论如何加载和启用组件以进行错误日志记录。有关日志过滤器的说明,请参阅 第 7.4.2.4 节,“错误日志过滤类型”。有关 JSON 和系统日志 sink 的说明,请参阅 第 7.4.2.7 节,“JSON 格式错误日志记录”第 7.4.2.8 节,“系统日志错误日志记录”。有关所有可用日志组件的详细信息,请参阅 第 7.5.3 节,“错误日志组件”

基于组件的错误日志记录提供以下功能:

  • 可以由过滤器组件过滤的日志事件,以影响写入的信息。

  • 由 sink(writer)组件输出的日志事件。可以启用多个 sink 组件,以将错误日志输出写入多个目标。

  • 内置的过滤器和 sink 组件,实现默认错误日志格式。

  • 一个可加载的 sink,启用 JSON 格式日志记录。

  • 一个可加载的 sink,启用系统日志记录。

  • 控制哪些日志组件加载和启用,以及每个组件如何操作的系统变量。

错误日志配置在本节的以下主题中描述:

默认错误日志配置

系统变量 log_error_services 控制加载哪些可加载日志组件,并启用哪些日志组件以进行错误日志记录。默认情况下,log_error_services 的值如下所示:

mysql> SELECT @@GLOBAL.log_error_services;
+----------------------------------------+
| @@GLOBAL.log_error_services            |
+----------------------------------------+
| log_filter_internal; log_sink_internal |
+----------------------------------------+

该值表明日志事件首先通过 log_filter_internal 过滤器组件,然后通过 log_sink_internal sink 组件,都是内置组件。过滤器修改日志事件,以便在 log_error_services 值中命名的后续组件中看到的信息。sink 是日志事件的目标。通常,sink 将日志事件处理为具有特定格式的日志消息,并将这些消息写入其关联的输出,例如文件或系统日志。

log_filter_internallog_sink_internal 的组合实现了默认错误日志过滤和输出行为。这些组件的操作受到其他服务器选项和系统变量的影响:

配置log_error_services时,请注意以下特征:

  • 日志组件列表可以用分号或逗号分隔,后跟可选的空格。给定的设置不能同时使用分号和逗号分隔符。组件顺序很重要,因为服务器按照列表顺序执行组件。

  • log_error_services值的最后一个组件不能是一个过滤器。这是一个错误,因为它对事件的任何更改都不会对输出产生影响:

    mysql> SET GLOBAL log_error_services = 'log_filter_internal';
    ERROR 1231 (42000): Variable 'log_error_services' can't be set to the value
    of 'log_filter_internal'

    要纠正这个问题,请在值的末尾添加一个sink:

    mysql> SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';
  • log_error_services中命名的组件顺序很重要,特别是在过滤器和sink之间的相对顺序方面。考虑以下log_error_services值:

    log_filter_internal; log_sink_1; log_sink_2

    在这种情况下,日志事件首先传递给内置过滤器,然后传递给第一个sink,然后传递给第二个sink。两个sink都接收到过滤后的日志事件。

    将其与以下log_error_services值进行比较:

    log_sink_1; log_filter_internal; log_sink_2

    在这种情况下,日志事件首先传递给第一个sink,然后传递给内置过滤器,然后传递给第二个sink。第一个sink接收未过滤的事件,第二个sink接收过滤后的事件。你可能会以这种方式配置错误日志,以便在一个日志中包含所有日志事件的消息,而在另一个日志中包含只有某些日志事件的消息。

错误日志配置方法

错误日志配置涉及加载和启用错误日志组件,并执行组件特定的配置。

有两种错误日志配置方法:隐式显式。建议选择一种配置方法并专门使用它。使用这两种方法可能会在启动时出现警告。有关更多信息,请参阅故障排除配置问题

  • 隐式错误日志配置

    这种配置方法加载和启用log_error_services变量定义的日志组件。未加载的组件将在启动时隐式加载,在InnoDB存储引擎完全可用之前。这一种配置方法具有以下优点:

    • 日志组件在启动序列中较早加载,在InnoDB存储引擎之前,使日志信息更早可用。

    • 它避免了启动期间可能的日志信息丢失。

    • 使用INSTALL COMPONENT安装错误日志组件不是必需的,从而简化了错误日志配置。

    要使用这种方法,请参阅隐式错误日志配置

  • 显式错误日志配置

    Note

    这种配置方法是为了向后兼容性。隐式配置方法是推荐的。

    此配置方法需要使用 INSTALL COMPONENT 加载错误日志组件,然后配置 log_error_services 以启用日志组件。INSTALL COMPONENT 将组件添加到 mysql.component 表(一个 InnoDB 表)中,并且在启动时从该表中读取要加载的组件,该表仅在 InnoDB 初始化后可访问。

    在启动序列中,记录的信息会被缓冲,而 InnoDB 存储引擎的初始化可能会被恢复和数据字典升级等操作所延迟。

    要使用此方法,请参阅 显式错误日志配置

隐式错误日志配置

本过程描述了如何使用 log_error_services 隐式加载和启用错误日志组件。有关错误日志配置方法的讨论,请参阅 错误日志配置方法

要隐式加载和启用错误日志组件:

  1. log_error_services 值中列出错误日志组件。

    要在服务器启动时加载和启用错误日志组件,设置 log_error_services 在选项文件中。以下示例配置使用 JSON 日志 sink (log_sink_json) 除了内置日志过滤器和 sink (log_filter_internal, log_sink_internal)。

    [mysqld]
    log_error_services='log_filter_internal; log_sink_internal; log_sink_json'
    Note

    要使用 JSON 日志 sink (log_sink_syseventlog) 而不是默认 sink (log_sink_internal),您将 log_sink_internal 替换为 log_sink_json

    要立即加载和启用组件,并在后续重新启动时启用,使用 SET PERSIST 设置 log_error_services

    SET PERSIST log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
  2. 如果错误日志组件公开了任何系统变量,以便组件初始化成功,分配这些变量适当的值。您可以在选项文件中或使用 SET PERSIST 设置这些变量。

    Important

    在隐式配置中,首先设置 log_error_services 以加载组件并公开其系统变量,然后设置组件系统变量。无论是命令行、选项文件还是使用 SET PERSIST,都需要遵循这种配置顺序。

要禁用日志组件,从 log_error_services 值中删除它。同时删除您定义的任何关联组件变量设置。

Note

使用 log_error_services 隐式加载日志组件不会影响 mysql.component 表。它既不将组件添加到 mysql.component 表中,也不删除使用 INSTALL COMPONENT 安装的组件。

显式错误日志配置

该过程描述了如何使用 INSTALL COMPONENT 明确加载错误日志组件,然后使用 log_error_services 启用它们。有关错误日志配置方法的讨论,请参阅 错误日志配置方法

要明确加载和启用错误日志组件:

  1. 使用 INSTALL COMPONENT 加载组件(除非它是内置的或已经加载的)。例如,要加载 JSON 日志 sink,发出以下语句:

    INSTALL COMPONENT 'file://component_log_sink_json';

    使用 INSTALL COMPONENT 加载组件将其注册在 mysql.component 系统表中,以便服务器在后续启动时自动加载它,InnoDB 初始化后。

    加载日志组件时使用 INSTALL COMPONENT 的 URN 是组件名称前缀 file://component_。例如,对于 log_sink_json 组件,相应的 URN 是 file://component_log_sink_json。有关错误日志组件 URN,请参阅 第 7.5.3 节,“错误日志组件”

  2. 如果错误日志组件公开了任何系统变量,以便组件初始化成功,分配这些变量适当的值。你可以在选项文件中设置这些变量或使用 SET PERSIST

  3. 通过在 log_error_services 值中列出组件来启用它。

    Important

    使用 INSTALL COMPONENT 明确加载日志组件时,不要在选项文件中持久化或设置 log_error_services,这将隐式加载日志组件在启动时。相反,使用 SET GLOBAL 语句在运行时启用日志组件。

    以下示例配置了使用 JSON 日志 sink (log_sink_json) 除了内置的日志过滤器和 sink (log_filter_internal, log_sink_internal)。

    SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
    Note

    要使用 JSON 日志 sink (log_sink_syseventlog) 而不是默认的 sink (log_sink_internal),你将 log_sink_internal 替换为 log_sink_json

要禁用日志组件,从 log_error_services 值中删除它。如果组件是可加载的,并且你也想卸载它,请使用 UNINSTALL COMPONENT。也删除任何关联的组件变量设置。

尝试使用 UNINSTALL COMPONENT 卸载仍在 log_error_services 值中命名的可加载组件将产生错误。

更改错误日志配置方法

如果你之前使用 INSTALL COMPONENT 明确加载错误日志组件,并且想切换到隐式配置,如 隐式错误日志配置 中所述,以下步骤是推荐的:

  1. log_error_services 设置回其默认配置。

    SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
  2. 使用 UNINSTALL COMPONENT 卸载任何之前安装的可加载日志组件。例如,如果你之前安装了 JSON 日志 sink,现在卸载它,如下所示:

    UNINSTALL COMPONENT 'file://component_log_sink_json';
  3. 删除未安装组件的任何组件变量设置。例如,如果在选项文件中设置了组件变量,请从选项文件中删除设置。如果使用 SET PERSIST 设置组件变量,请使用 RESET PERSIST 清除设置。

  4. 按照 隐式错误日志配置 中的步骤重新实现您的配置。

如果您需要从隐式配置转换为显式配置,请执行以下步骤:

  1. log_error_services 设置回其默认配置,以卸载隐式加载的日志组件。

    SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
  2. 删除与未安装组件相关的任何组件变量设置。例如,如果在选项文件中设置了组件变量,请从选项文件中删除设置。如果使用 SET PERSIST 设置组件变量,请使用 RESET PERSIST 清除设置。

  3. 重新启动服务器以卸载隐式加载的日志组件。

  4. 按照 显式错误日志配置 中的步骤重新实现您的配置。

故障排除配置问题

在 MySQL 服务器启动序列中,日志组件列表在 log_error_services 值中被隐式加载。如果以前使用 INSTALL COMPONENT 加载了日志组件,服务器将尝试在启动序列中加载该组件,这将产生警告 无法从指定的 URN 加载组件:'file://component_component_name'

您可以在错误日志中检查该警告,或者通过查询性能模式 error_log 表使用以下查询:

SELECT error_code, data
  FROM performance_schema.error_log
 WHERE data LIKE "%'file://component_%"
   AND error_code="MY-013129" AND data LIKE "%MY-003529%";

要防止该警告,请按照 更改错误日志配置方法 中的说明调整您的错误日志配置。您应该使用隐式或显式错误日志配置,但不能同时使用两者。

当尝试显式加载隐式加载的组件时,会出现类似的错误。例如,如果 log_error_services 列表中包含 JSON 日志 sink 组件,那么该组件将在启动时隐式加载。尝试显式加载同一组件将返回该错误:

mysql> INSTALL COMPONENT 'file://component_log_sink_json';
ERROR 3529 (HY000): Cannot load component from specified URN: 'file://component_log_sink_json'.
配置多个日志 sink

可以配置多个日志 sink,从而启用将输出发送到多个目标。要启用 JSON 日志 sink 除了(而不是)默认 sink,请将 log_error_services 值设置如下:

SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';

要恢复使用默认 sink 并卸载系统日志 sink,请执行以下语句:

SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal;
UNINSTALL COMPONENT 'file://component_log_sink_json';
日志 sink 性能模式支持

如果启用了日志组件,包括提供性能模式支持的 sink,那么写入错误日志的事件也将写入性能模式 error_log 表中。这使得可以使用 SQL 查询检查错误日志内容。目前,传统格式的 log_sink_internal 和 JSON 格式的 log_sink_json sink 支持该功能。请参阅 第 29.12.22.2 节,“The error_log 表”