错误日志配置
在MySQL 8.0中,错误日志使用了“MySQL组件”中描述的MySQL组件架构。错误日志子系统由执行日志事件过滤和写入的组件以及一个配置哪些组件加载和启用以实现所需日志记录结果的系统变量组成。
本节讨论如何加载和启用用于错误日志的组件。
基于组件的错误日志记录提供了以下功能:
- 可以通过过滤器组件过滤的日志事件,以影响可用于写入的信息。
- 由汇流器(写入器)组件输出的日志事件。可以启用多个汇流器组件,将错误日志输出写入多个目标。
- 实现默认错误日志格式的内置过滤器和汇流器组件。
- 可加载的汇流器,以启用以JSON格式记录日志。
- 可加载的汇流器,以将日志记录到系统日志。
- 控制加载和启用每个组件以及每个组件操作方式的系统变量。
默认错误日志配置
log_error_services系统变量控制要加载哪些可加载日志组件(从MySQL 8.0.30开始),以及要启用哪些日志组件用于错误日志记录。默认情况下,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-error选项(以及在Windows上的--pid-file和--console选项)确定。这些选项确定是否将错误消息写入控制台或文件,以及如果写入文件,则为错误日志文件的名称。
- log_error_verbosity和log_error_suppression_list系统变量影响log_filter_internal允许或禁止的日志事件类型。
在配置log_error_services时,请注意以下特点:
- 日志组件的列表可以由分号或(从MySQL 8.0.12开始)逗号分隔,可选地后跟空格。给定的设置不能同时使用分号和逗号分隔符。组件的顺序很重要,因为服务器按照所列顺序执行组件。
- 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_error_services值:
log_sink_1; log_filter_internal; log_sink_2
在这种情况下,日志事件首先经过第一个汇流器,然后经过内置过滤器,最后经过第二个汇流器。第一个汇流器接收到未经过滤的事件。第二个汇流器接收到经过过滤的事件。如果希望一个日志包含所有日志事件的消息,并且另一个日志只包含一部分日志事件的消息,您可以以这种方式配置错误日志记录。
错误日志配置方法
错误日志配置涉及根据需要加载和启用错误日志组件,并执行特定于组件的配置。
有两种错误日志配置方法:隐式和显式。建议选择一种配置方法并且专门使用。同时使用两种方法可能会导致启动时出现警告。
隐式错误日志配置(引入于MySQL 8.0.30)
该配置方法加载并启用由log_error_services变量定义的日志组件。在启动时,隐式加载尚未加载的可加载组件,且在InnoDB存储引擎完全可用之前。该配置方法具有以下优点:
- 日志组件在启动序列的早期加载,早于InnoDB存储引擎,使得日志信息更早可用。
- 在启动期间发生故障时,避免了缓冲日志信息的丢失。
- 不需要使用INSTALL COMPONENT安装错误日志组件,简化了错误日志配置。
显式错误日志配置
注意 此配置方法为向后兼容而支持。建议使用MySQL 8.0.30引入的隐式配置方法。
此配置方法需要使用INSTALL COMPONENT加载错误日志组件,然后配置log_error_services以启用日志组件。INSTALL COMPONENT将组件添加到mysql.component表(一个InnoDB表),并且在此表中读取启动时要加载的组件,该表在InnoDB初始化后才可访问。
在启动序列期间,当初始化InnoDB存储引擎时,会对日志信息进行缓冲,该过程有时会因为在InnoDB启动序列期间发生的恢复和数据字典升级等操作而延长。
隐式错误日志配置
本步骤描述了如何使用log_error_services隐式地加载和启用错误日志组件。有关错误日志配置方法的讨论,请参阅错误日志配置方法。
隐式加载和启用错误日志组件的步骤如下:
- 在log_error_services值中列出错误日志组件。
- 要在服务器启动时加载和启用错误日志组件,请在选项文件中设置log_error_services。以下示例配置了除了内置日志过滤器和汇流器(log_filter_internal、log_sink_internal)之外还使用JSON日志汇流器(log_sink_json)。
[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';
如果错误日志组件公开了必须设置的系统变量以确保组件初始化成功,可以为这些变量分配相应的值。可以在选项文件中或使用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启用错误日志组件,显式地加载和启用错误日志组件。有关错误日志配置方法的讨论,请参阅错误日志配置方法。
显式加载和启用错误日志组件的步骤如下:
- 使用INSTALL COMPONENT加载组件(除非它是内置的或已加载)。例如,要加载JSON日志汇流器,请执行以下语句:
INSTALL COMPONENT 'file://component_log_sink_json';
- 使用INSTALL COMPONENT加载组件将其注册到mysql.component系统表中,这样在InnoDB初始化后,服务器将在后续启动时自动加载它。
使用INSTALL COMPONENT加载日志组件的URN是以文件://component_为前缀的组件名称。例如,对于log_sink_json组件,相应的URN是file://component_log_sink_json。
- 如果错误日志组件公开了必须设置的系统变量以确保组件初始化成功,可以为这些变量分配相应的值。可以在选项文件中或使用SET PERSIST设置这些变量。
- 通过在log_error_services值中列出组件来启用组件。
重要提示 从MySQL 8.0.30开始,当使用INSTALL COMPONENT显式加载日志组件时,请不要在选项文件中持久化或设置log_error_services,因为它会在启动时隐式加载日志组件。相反,使用SET GLOBAL语句在运行时启用日志组件。
以下示例配置了除了内置日志过滤器和汇流器(log_filter_internal、log_sink_internal)之外还使用JSON日志汇流器(log_sink_json)。
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显式加载了错误日志组件,并且希望切换到隐式配置(如隐式错误日志配置中所述),建议按照以下步骤操作:
- 将log_error_services设置回其默认配置。
SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
- 使用UNINSTALL COMPONENT卸载之前安装的任何可加载日志组件。例如,如果之前安装了JSON日志汇流器,请按如下方式卸载:
UNINSTALL COMPONENT 'file://component_log_sink_json';
- 删除已卸载组件的任何组件变量设置。例如,如果在选项文件中设置了组件变量,请从选项文件中删除这些设置。如果使用SET PERSIST设置了组件变量,请使用RESET PERSIST清除这些设置。
- 按照隐式错误日志配置中的步骤重新实施您的配置。
如果需要从隐式配置还原为显式配置,请执行以下步骤:
- 将log_error_services设置回其默认配置,以卸载隐式加载的日志组件。
SET GLOBAL log_error_services = 'log_filter_internal,log_sink_internal';
- 删除与已卸载组件相关的任何组件变量设置。例如,如果在选项文件中设置了组件变量,请从选项文件中删除这些设置。如果使用SET PERSIST设置了组件变量,请使用RESET PERSIST清除这些设置。
- 重新启动服务器以卸载隐式加载的日志组件。
- 按照显式错误日志配置中的步骤重新实施您的配置。
故障排除配置问题
从MySQL 8.0.30开始,在启动时在log_error_services值中列出的日志组件将隐式加载到MySQL服务器启动序列的早期阶段。如果之前使用INSTALL COMPONENT加载了日志组件,则服务器会在启动序列的后续阶段尝试再次加载该组件,从而产生以下警告:
Cannot load component from specified 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汇流器支持此功能。