JeeStudy 发表于 2020-4-17 23:27:03

MySQL8.0大师之路:第11章:MySQL服务器管理-11.5 MySQL 错误日志

错误日志包含mysqld启动和关闭时间的记录。它还包含诊断消息,比如在服务器启动和关闭期间以及服务器运行时发生的错误、警告和注意事项。例如,如果mysqld注意到需要自动检查或修复表,它会向错误日志写入一条消息。在某些操作系统上,如果mysqld异常退出,则错误日志包含堆栈跟踪。跟踪可用于确定mysqld的退出位置。如果用于启动mysqld, mysqld_safe可能会将消息写入错误日志。例如,当mysqld_safe注意到异常的mysqld退出时,它会重新启动mysqld,并向错误日志写入一条mysqld重新启动的消息。

错误日志组件配置

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

基于组件的错误日志记录提供以下功能:
•过滤器组件可以过滤日志事件,以影响可用于写入的信息。
•日志事件由接收器(写入器)组件输出。可以启用多个接收器组件,以将错误日志输出写入多个目标。
•内置的过滤器和编写器组件结合在一起以实现默认的错误日志格式。
•可加载的编写器启用以JSON格式记录。
•可加载的编写器允许登录到系统日志。
•系统变量控制要启用的日志组件以及每个组件的运行方式。

系统变量 log_error_services 控制要启用错误日志记录的日志组件。该变量可以包含具有0、1或许多元素的列表。在后一种情况下,元素可以用分号或(从MySQL 8.0.12开始)逗号分隔,并可选地后跟空格。给定的设置不能同时使用分号和逗号分隔符。组件顺序很重要,因为服务器按照列出的顺序执行组件。
默认情况下,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_error_services分配一个不包含任何编写器组件的值,将导致从该点开始不写入日志输出。 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值。添加或删除日志组件受以下约束:•要启用日志组件,请首先使用INSTALL COMPONENT加载它(除非它是内置的或已经加载的),然后在log_error_services值中列出该组件。对于要在log_error_services值中允许的组件,必须知道该组件。如果组件是内置的,或者是可加载的并且已使用INSTALL COMPONENT加载,则该组件是已知的。尝试在服务器启动时命名未知组件会导致log_error_services设置为其默认值。尝试在运行时命名未知组件会产生错误,并且log_error_services值保持不变。
•要禁用日志组件,请将其从log_error_services值中删除。然后,如果该组件是可加载的,并且您还想卸载它,请使用UNINSTALL COMPONENT。尝试使用UNINSTALL COMPONENT卸载仍在log_error_services值中命名的可加载组件会产生错误。
例如,要使用系统日志编写器(log_sink_syseventlog)而不是默认编写器(log_sink_internal),请首先加载编写器组件,然后修改log_error_services值:
INSTALL COMPONENT 'file://component_log_sink_syseventlog';
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_syseventlog';

注意:
用于使用INSTALL COMPONENT加载日志组件的URN是前缀为file:// component_的组件名称。
例如,对于log_sink_syseventlog组件,相应的URN是file:// component_log_sink_syseventlog。



可以配置多个日志记录器,从而可以将输出发送到多个目标。要除了(而不是代替)默认写入器之外还启用系统日志写入器,请按以下方式设置log_error_services值:

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


要恢复为仅使用默认编写器并卸载系统日志编写器,请执行以下语句:
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal;
UNINSTALL COMPONENT 'file://component_log_sink_syseventlog';



要配置在每次服务器启动时启用的日志组件,请使用以下过程:
1.如果该组件是可加载的,请在运行时使用INSTALL COMPONENT加载它。加载组件会将其注册到mysql.component系统表中,以便服务器自动加载它以供后续启动。
2.在启动时设置log_error_services值以包括组件名称。在服务器my.cnf文件中设置该值,或使用SET PERSIST,它为正在运行的MySQL实例设置该值,并保存该值以用于随后的服务器重新启动;my.cnf中设置的值在下次重新启动时生效。使用SET PERSIST设置的值将立即生效,并在随后的重启后也是生效的。
假设您要为每次服务器启动配置除内置日志过滤器和编写器(log_filter_internal,log_sink_internal)之外的JSON日志编写器(log_sink_json)。如果未加载JSON书写器,请首先加载它:
INSTALL COMPONENT 'file://component_log_sink_json';

然后将log_error_services设置为在服务器启动时生效。您可以在my.cnf中进行设置:


log_error_services='log_filter_internal; log_sink_internal; log_sink_json'



或者,您可以使用SET PERSIST进行设置:
SET PERSIST log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';


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
在这种情况下,日志事件将传递给第一个编写器,然后传递给内置过滤器,再传递给第二个编写器。第一作者收到未过滤的事件。第二个编写器接收已过滤的事件。如果希望一个日志包含所有日志事件的消息,而另一个日志仅包含部分日志事件的消息,则可以以这种方式配置错误日志记录。



默认错误日志目标配置
接下来讨论哪些服务器选项配置默认错误日志目标,该目标可以是控制台或命名文件。它还指示哪些日志记录器组件将其自己的输出目标基于默认目标。
在本讨论中,“控制台”表示标准错误输出stderr。除非标准错误输出已重定向到其他目标,否则这是您的终端或控制台窗口。服务器解释用于确定默认错误日志目标的选项,对于Windows和Unix系统而言有所不同。
确保使用适合您平台的信息配置目标:


Windows上的默认错误日志目标

在Windows上,mysqld使用--log-error,--pid-file和--console选项确定默认错误日志目标是控制台还是文件,如果是文件,则使用文件名:
•如果--console是给定的,默认目标是控制台。 (如果同时提供了--console,则优先于--log-error,并且--log-error的以下各项均不适用。)
•如果未给出--log-error或未指定文件名而给出了--log-error ,除非指定了--pid-file选项,否则默认目标是数据目录中名为host_name.err的文件。在这种情况下,文件名是PID文件的基本名称,在数据目录中后缀为.err。
•如果使用--log-error命名文件,则默认目标是该文件(如果文件名没有后缀,则添加.err后缀),该文件位于数据目录下,除非给出绝对路径名以指定文件名并指定到不同的位置。
如果默认错误日志目标是控制台,则服务器将log_error系统变量设置为stderr。否则,默认目标是文件,服务器将log_error设置为文件名。



Unix和类似Unix的系统上的默认错误日志目标
在Unix和类似Unix的系统上,mysqld使用--log-error选项确定默认错误日志目标是控制台还是文件,如果是文件,则使用文件名:
•如果--log-error为未指定,默认目标是控制台。
•如果在未命名文件的情况下给出了--log-error,则默认目标是数据目录中名为host_name.err的文件。

•如果使用--log-error命名文件,则默认目标是该文件(如果文件名没有后缀,则添加.err后缀),该文件位于数据目录下,除非给出绝对路径名以指定文件名并指定不同的位置。
•如果在,或节的选项文件中给出了--log-error,则mysqld_safe查找并使用该选项,并将其传递给mysqld。



注意:对于Yum或APT软件包安装,通常在服务器配置文件中使用诸如log-error = / var / log / mysqld.log之类的选项在/ var / log下配置错误日志文件位置。从选项中删除文件名将导致使用数据目录中的host_name.err文件。



如果默认错误日志目标是控制台,则服务器将log_error系统变量设置为stderr。否则,默认目标是文件,服务器将log_error设置为文件名。



默认错误日志目标如何影响日志编写器
服务器解释了错误日志目标配置选项后,它将设置log_error系统变量以指示默认的错误日志目标。日志编写器组件可以将自己的输出目标基于log_error值,也可以独立于log_error确定其目标。
如果log_error为stderr,则默认错误日志目标为控制台,并且将其输出目标为默认目标的日志编写器也可以写入控制台:
•log_sink_internal,log_sink_json,log_sink_test:这些编写器将写入控制台。即使对于可以多次启用的记录器(例如log_sink_json)也是如此。所有实例均写入控制台。
•log_sink_syseventlog:写程序写入系统日志,而不管log_error值如何。如果log_error不是stderr,则默认错误日志目标是文件,log_error指示文件名。日志编写器的输出目标基于默认的目标输出文件,该输出文件基于该文件名命名。 (编写者可能恰好使用该名称,也可能使用其某些变体。)假设log_error值为file_name。然后,日志编写器使用如下名称:
•log_sink_internal,log_sink_test:这些编写器将写入file_name。
•log_sink_json:在log_error_services值中命名的该writer的连续实例将写入名为file_name加上编号的.NN.json后缀的文件:file_name.00.json,file_name.01.json,依此类推。
•log_sink_syseventlog:写程序写入系统日志,而不管log_error值如何。












页: [1]
查看完整版本: MySQL8.0大师之路:第11章:MySQL服务器管理-11.5 MySQL 错误日志