Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

7.4.2.1 错误日志配置

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

本节讨论如何加载和启用错误日志组件。关于日志过滤器的说明,请见第7.4.2.4节,“错误日志 filtering 类型”。关于 JSON 和系统日志沉点的说明,请见第7.4.2.7节,“JSON 格式错误日志”,和第7.4.2.8节,“系统日志错误日志”。关于所有可用日志组件的详细信息,请见第7.5.3节,“错误日志组件”

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

  • 可以根据过滤组件来过滤日志事件,以影响可写入的信息。

  • 由沉点(writer)组件输出的日志事件。可以启用多个沉点组件,向多个目的地写入错误日志输出。

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

  • 可加载的沉点,启用 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时,注意以下特点:

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

  • 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接收过滤后的事件。你可能会这样配置错误日志,如果你想有一个包含所有日志事件的日志,还有一个只包含某些日志事件的日志。

错误日志配置方法

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

有两个错误日志配置方法,隐式显式。建议选择一个配置方法,并且独自使用。同时使用这两个方法可能会在启动时出现警告。更多信息,请参见Troubleshooting Configuration Issues

  • 隐式错误日志配置

    这个配置方法加载和启用由log_error_services变量定义的日志组件。可加载的组件在启动前自动加载,直到InnoDB存储引擎完全可用。这配置方法具有以下优点:

    • 日志组件在启动序列中早期加载,使logged信息更快可用。

    • 避免了在启动过程中出现故障时的缓冲日志信息丢失。

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

    要使用这个方法,请参见Implicit Error Log Configuration

  • 显式错误日志配置

    Note

    这个配置方法是为了向后兼容的。隐式配置方法推荐使用。

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

    在启动序列中,logged信息会被缓冲,因为InnoDB存储引擎的初始化过程可能会被延长,例如恢复和数据字典升级操作等。

    要使用这个方法,请见明确错误日志配置

隐式错误日志配置

这个过程描述了如何使用log_error_services隐式加载和启用错误日志组件。关于错误日志配置方法,请见错误日志配置方法

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

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

    在服务器启动时加载和启用错误日志组件,设置log_error_services选项文件。以下示例配置使用JSON日志汇聚器(log_sink_json)之外的内置日志过滤器和汇聚器(log_filter_internallog_sink_internal)。

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

    要使用JSON日志汇聚器(log_sink_syseventlog)而不是默认汇聚器(log_sink_internal),将替换log_sink_internallog_sink_json

    使用log_error_services来加载和启用组件,并在后续重启时保持设置:SET PERSIST:

    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表的影响,不会将组件添加到该表中,也不会从使用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值中启用组件。

    Important

    使用INSTALL COMPONENT加载日志组件时,不要在选项文件中持久化或设置log_error_services,而是在运行时使用一个SET GLOBAL语句启用日志组件。

    以下示例配置了JSON日志沉淀器(log_sink_json)的使用,除了内置的日志过滤器和沉淀器(log_filter_internallog_sink_internal)之外。

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

    要使用JSON日志沉淀器(log_sink_syseventlog)而不是默认的沉淀器(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日志汇聚器,卸载它如下所示:

    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'

您可以在错误日志中查找这个警告,或者使用以下查询来查询性能chemaerror_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节,“The error_log Table”.