文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  错误日志配置

7.4.2.1 错误日志配置

在 MySQL 8.4 中,错误日志使用在 第 7.5 节,“MySQL 组件” 中描述的 MySQL 组件架构。错误日志子系统包含执行日志事件过滤和写入的组件,以及一个配置要加载和启用哪些组件以实现所需日志记录结果的系统变量。

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

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

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

  • 由接收器(写入器)组件输出的日志事件。可以启用多个接收器组件,以将错误日志输出写入多个目的地。

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

  • 一个可加载接收器,允许以 JSON 格式记录日志。

  • 一个可加载接收器,允许记录到系统日志。

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

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

默认错误日志配置

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 接收器组件,这两个组件都是内置组件。过滤器修改在 log_error_services 值中后面命名的组件所看到的日志事件。接收器是日志事件的目的地。通常,接收器将日志事件处理成具有特定格式的日志消息,并将这些消息写入其关联的输出,例如文件或系统日志。

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'

    要纠正此问题,请在值末尾包含一个接收器

    mysql> SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';
  • log_error_services中命名的组件的顺序很重要,尤其是在过滤器和接收器的相对顺序方面。请考虑这个log_error_services

    log_filter_internal; log_sink_1; log_sink_2

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

    与这个log_error_services值进行比较

    log_sink_1; log_filter_internal; log_sink_2

    在这种情况下,日志事件会传递给第一个接收器,然后传递给内置过滤器,最后传递给第二个接收器。第一个接收器会收到未过滤的事件。第二个接收器会收到已过滤的事件。如果您希望一个日志包含所有日志事件的消息,而另一个日志只包含部分日志事件的消息,则可以配置错误日志记录来实现这种方式。

错误日志配置方法

错误日志配置包括根据需要加载和启用错误日志组件以及执行特定于组件的配置。

有两种错误日志配置方法,即隐式显式。建议选择一种配置方法并专门使用。使用两种方法可能会导致启动时出现警告。有关更多信息,请参见排查配置问题

  • 隐式错误日志配置

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

    • 日志组件在启动顺序的早期加载,在InnoDB存储引擎之前,从而使记录的信息更早地可用。

    • 它避免了在启动期间发生故障时缓冲的日志信息丢失。

    • 无需使用INSTALL COMPONENT安装错误日志组件,简化了错误日志配置。

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

  • 显式错误日志配置

    注意

    这种配置方法为了向后兼容而提供支持。建议使用隐式配置方法。

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

    在启动顺序期间,记录的信息被缓冲,而InnoDB存储引擎正在初始化,有时会由于InnoDB启动顺序期间发生的恢复和数据字典升级等操作而延长。

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

隐式错误日志配置

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

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

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

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

    [mysqld]
    log_error_services='log_filter_internal; log_sink_internal; log_sink_json'
    注意

    要使用 JSON 日志接收器 (log_sink_syseventlog) 而不是默认接收器 (log_sink_internal),您需要用log_sink_json替换log_sink_internal

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

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

    重要

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

要禁用日志组件,请将其从log_error_services值中删除。还要删除您定义的任何关联的组件变量设置。

注意

使用log_error_services隐式加载日志组件不会对mysql.component表产生任何影响。它不会将组件添加到mysql.component表中,也不会从mysql.component表中删除之前使用INSTALL COMPONENT安装的组件。

显式错误日志配置

此过程介绍了如何通过使用INSTALL COMPONENT加载组件,然后使用log_error_services启用组件,来显式加载和启用错误日志组件。有关错误日志配置方法的讨论,请参见错误日志配置方法

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

  1. 使用INSTALL COMPONENT加载组件(除非它是内置的或已经加载)。例如,要加载 JSON 日志接收器,请执行以下语句

    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值中列出组件来启用它。

    重要

    在使用INSTALL COMPONENT显式加载日志组件时,请勿在选项文件中持久化或设置log_error_services,因为这会在启动时隐式加载日志组件。相反,请使用SET GLOBAL语句在运行时启用日志组件。

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

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

    要使用 JSON 日志接收器 (log_sink_syseventlog) 而不是默认接收器 (log_sink_internal),您需要用log_sink_json替换log_sink_internal

要禁用日志组件,请将其从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 日志接收器,请按照以下步骤卸载它

    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. 按照显式错误日志配置中的步骤重新实现您的配置。

排查配置问题

在启动时,log_error_services值中列出的日志组件会在 MySQL 服务器启动顺序的早期隐式加载。如果该日志组件之前已使用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 日志接收器组件,则该组件在启动时会隐式加载。稍后尝试显式加载同一组件会返回此错误。

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

可以配置多个日志接收器,这使得可以将输出发送到多个目标。要除了默认接收器之外(而不是代替默认接收器)启用 JSON 日志接收器,请将log_error_services值设置为以下值

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

要恢复到仅使用默认接收器并卸载系统日志接收器,请执行以下语句

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

如果启用的日志组件包括提供性能模式支持的接收器,则写入错误日志的事件也会写入性能模式error_log表。这使得可以使用 SQL 查询检查错误日志内容。当前,传统格式的log_sink_internal和 JSON 格式的log_sink_json接收器支持此功能。请参见第 29.12.22.2 节,“错误日志表”.