您的当前位置:首页正文

MySQL学习——错误日志配置

2024-11-28 来源:个人技术集锦


在MySQL 8.4中,错日志记录使用MySQL组件架构。错误日志子系统由执行日志事件过滤和写入的组件以及配置要加载和启用哪些组件以实现所需日志结果的系统变量组成。

本文讨论如何加载和启用用于错误日志记录的组件。

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

  • 记录可由过滤器组件过滤的事件,以影响可用于写入的信息。
  • 记录sink(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_internal和log_sink_internal的组合实现了默认的错误日志过滤和输出行为。这些组件的操作受其他服务器选项和系统变量的影响:

  • 输出目标由--log错误选项决定(在Windows上,还有--pid文件和--console)。这些决定了是将错误消息写入控制台还是文件,如果写入文件,则确定错误日志文件名。
  • log_error_verbosity和log_error_suppression_list系统变量影响log_filter_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中命名的组件的顺序很重要,特别是在过滤器和接收器的相对顺序方面。考虑以下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安装错误日志组件,简化了错误日志配置。

要隐式加载和启用错误日志记录组件,请执行以下操作:

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_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设置这些变量。

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

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

使用log_error_services隐式加载日志组件对mysql.component表没有影响。它不会将组件添加到mysql.comcomponent表中,也不会从mysql.comomponent表中删除以前使用INSTALL component安装的组件。

显式错误日志配置

支持此配置方法以实现向后兼容性。建议使用隐式配置方法。

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

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

要显式加载和启用错误日志记录组件,请执行以下操作:

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

INSTALL COMPONENT 'file://component_log_sink_json';

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

使用INSTALL component加载日志组件时使用的URN是前缀为的组件名称file://component_.例如,对于log_sink_json组件,相应的URN为file://component_log_sink_json.

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_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 COMPANY卸载以前安装的任何可加载日志记录组件。例如,如果您之前安装了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 Server启动序列的早期隐式加载。如果之前使用INSTALL component加载了日志组件,服务器将在启动序列的稍后再次尝试加载该组件,这将产生警告“无法从指定的URN加载组件:”file://component_component_name'.

您可以在错误日志中检查此警告,也可以使用以下查询查询Performance Schema 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_sick_JSON接收器都支持此功能。

显示全文