MySQL服务器错误日志
MySQL Server有几个日志,可以帮助您了解正在发生的活动。
日志类型 | 写入日志的信息 |
---|---|
错误日志 | 启动,运行或停止mysqld遇到的问题 |
通用查询日志 | 建立的客户连接和从客户那里收到的陈述 |
二进制日志 | 更改数据的语句(也用于复制) |
中继日志 | 从复制主服务器收到的数据更改 |
慢查询日志 | long_query_time 执行耗时超过几秒钟的查询 |
DDL日志(元数据日志) | DDL语句执行的元数据操作 |
默认情况下,除Windows上的错误日志外,没有启用任何日志。(DDL日志总是在需要时创建,并且没有用户可配置的选项;请参见“ DDL日志”。)以下特定于日志的部分提供有关启用日志记录的服务器选项的信息。
默认情况下,服务器将所有已启用日志的文件写入数据目录中。您可以通过刷新日志来强制服务器关闭并重新打开日志文件(或在某些情况下切换到新的日志文件)。发出FLUSH LOGS
语句时会发生日志刷新;使用或参数执行mysqladmin; 或使用或选项执行mysqldump。请参见“ FLUSH语句”,“mysqladmin-用于管理MySQL服务器的客户端”和“mysqldump-数据库备份程序”flush-logs
refresh
--flush-logs
--master-dat
。另外,当二进制日志的大小达到max_binlog_size
系统变量的值时,将刷新该二进制日志。
您可以在运行时控制常规查询日志和慢速查询日志。您可以启用或禁用日志记录,或更改日志文件名。您可以告诉服务器将常规查询条目和慢速查询条目写入日志表和/或日志文件。有关详细信息,请参见“选择常规查询日志和慢速查询日志输出目的地”,“常规查询日志”和“慢速查询日志”。
中继日志仅在从属复制服务器上使用,以保留来自主服务器的数据更改,这些更改也必须在从属服务器上进行。有关中继日志内容和配置的讨论,请参见“从站中继日志”。
有关日志维护操作(例如,旧日志文件到期)的信息,请参见“服务器日志维护”。
有关确保日志安全的信息,
选择常规查询日志和慢查询日志输出目标
如果启用了MySQL日志,MySQL Server可以灵活控制写入普通查询日志和慢速查询日志的输出目标。日志条目的可能目标是日志文件或系统数据库中的general_log
和slow_log
表mysql
。可以选择文件输出,表输出或两者。
- 服务器启动时的日志控制
- 运行时的日志控制
- 日志表的优点和特征
服务器启动时的日志控制
所述log_output
系统变量指定日志输出目的地。设置此变量本身并不会启用日志。必须分别启用它们。
- 如果
log_output
在启动时未指定,则默认日志记录目标为FILE
。 - 如果
log_output
在启动时指定,则其值为列表中一个或多个逗号分隔的单词的列表,这些单词选自TABLE
(登录到表),FILE
(登录到文件)或NONE
(不登录到表或文件)。NONE
(如果存在)优先于任何其他说明符。
该general_log
系统变量控制记录到一般查询日志选定的日志目的地。如果在服务器启动时指定,general_log
则使用可选参数1或0启用或禁用日志。要指定文件记录的默认名称以外的其他文件名,请设置general_log_file
变量。同样,slow_query_log
变量控制着将慢速查询日志记录到所选目标的日志中,并且该设置slow_query_log_file
指定用于文件日志记录的文件名。如果启用了任何一个日志,则服务器将打开相应的日志文件并向其中写入启动消息。但是,除非进行以下操作,否则不会将查询进一步记录到文件中FILE
已选择日志目标。
例子:
- 要将常规查询日志条目写入日志表和日志文件,请使用
--log_output=TABLE,FILE
来选择两个日志目标并--general_log
启用常规查询日志。 - 要编写通用和慢查询日志条目仅在日志表,使用
--log_output=TABLE
选择表作为日志目标,并且--general_log
和--slow_query_log
同时启用日志。 - 要将慢速查询日志条目仅写入日志文件,请使用
--log_output=FILE
选择文件作为日志目标并--slow_query_log
启用慢速查询日志。在这种情况下,由于默认的日志目标是FILE
,因此您可以省略该log_output
设置。
运行时的日志控制
与日志表和文件相关联的系统变量可以对日志进行运行时控制:
- 该
log_output
变量指示当前的日志记录目标。可以在运行时对其进行修改以更改目标。 - 在
general_log
与slow_query_log
变量指示一般查询日志和慢查询日志是否已启用(ON
)或禁用(OFF
)。您可以在运行时设置这些变量,以控制是否启用日志。 - 在
general_log_file
与slow_query_log_file
变量指示一般查询日志和慢查询日志文件的名称。您可以在服务器启动时或在运行时设置这些变量,以更改日志文件的名称。 - 要为当前会话禁用或启用常规查询日志记录,请将会话
sql_log_off
变量设置为ON
或OFF
。(这假定常规查询日志本身已启用。)
日志表的优点和特征
使用表进行日志输出具有以下好处:
日志条目具有标准格式。要显示日志表的当前结构,请使用以下语句:
SHOW CREATE TABLE mysql.general_log;SHOW CREATE TABLE mysql.slow_log;- 日志内容可通过SQL语句访问。这样可以使用仅选择满足特定条件的日志条目的查询。例如,要选择与特定客户端关联的日志内容(这对于从该客户端识别有问题的查询很有用),使用日志表比使用日志文件更容易做到这一点。
- 可以通过任何可以连接到服务器并发出查询的客户端远程访问日志(如果客户端具有适当的日志表特权)。无需登录到服务器主机并直接访问文件系统。
日志表实现具有以下特征:
- 通常,日志表的主要目的是为用户提供一个界面,以观察服务器的运行时执行,而不干扰服务器的运行时执行。
CREATE TABLE
,ALTER TABLE
和DROP TABLE
是对日志表的有效操作。对于ALTER TABLE
和DROP TABLE
,日志表无法使用,必须禁用,如下所述。默认情况下,日志表使用
CSV
以逗号分隔的值格式写入数据的存储引擎。对于有权访问.CSV
包含日志表数据的文件的用户,这些文件很容易导入到其他程序中,例如可以处理CSV输入的电子表格。可以更改日志表以使用
MyISAM
存储引擎。您不能ALTER TABLE
用来更改正在使用的日志表。必须先禁用日志。没有比其他引擎CSV
或者MyISAM
是合法的日志表。日志表和“打开的文件太多”错误。如果选择
TABLE
作为日志目标并且日志表使用CSV
存储引擎,则可能会发现在运行时重复禁用和启用常规查询日志或慢速查询日志.CSV
会导致该文件的许多打开文件描述符,可能会导致“打开的文件太多”错误。要变通解决此问题,执行FLUSH TABLES
或确保的值open_files_limit
大于的值table_open_cache_instances
。要禁用日志记录,以便您可以更改(或删除)日志表,可以使用以下策略。该示例使用常规查询日志。慢查询日志的过程类似,但是使用
slow_log
表和slow_query_log
系统变量。SET @old_log_state = @@GLOBAL.general_log;SET GLOBAL general_log = 'OFF';ALTER TABLE mysql.general_logENGINE = MyISAM;SET GLOBAL general_log = @old_log_state;TRUNCATE TABLE
是对日志表的有效操作。它可用于使日志条目过期。RENAME TABLE
是对日志表的有效操作。您可以使用以下策略自动重命名日志表(例如,执行日志轮换):USE mysql;DROP TABLE IF EXISTS general_log2;CREATE TABLE general_log2 LIKE general_log;RENAME TABLE general_logTO general_log_backup, general_log2TO general_log;CHECK TABLE
是对日志表的有效操作。LOCK TABLES
不能在日志表上使用。INSERT
,DELETE
和UPDATE
不能在日志表上使用。这些操作仅在服务器内部允许。FLUSH TABLES WITH READ LOCK
和read_only
系统变量的状态对日志表没有影响。服务器始终可以写入日志表。- 写入日志表的条目不会写入二进制日志,因此不会复制到从属服务器。
- 要刷新日志表或日志文件,请分别使用
FLUSH TABLES
或FLUSH LOGS
。 - 不允许对日志表进行分区。
- 一个mysqldump的转储包括报表中重新创建这些表,以便它们不会重新加载转储文件后失踪。日志表的内容不转储。
错误日志
本节讨论如何配置MySQL服务器以将诊断消息记录到错误日志中。有关选择错误消息字符集或语言的信息,请或“设置错误消息语言”。
错误日志包含mysqld启动和关闭时间的记录。它还包含诊断消息,例如错误,警告和注释,它们在服务器启动和关闭期间以及服务器运行期间发生。例如,如果mysqld注意到需要自动检查或修复表,它将向错误日志中写入一条消息。
在某些操作系统上,如果mysqld异常退出,则错误日志包含堆栈跟踪。该跟踪可用于确定mysqld退出的位置。请参见“调试和移植MySQL”。
如果用于启动mysqld,则mysqld_safe可能会将消息写入错误日志。例如,当mysqld_safe注意到异常的mysqld退出时,它将重新启动mysqld并将mysqld restarted
消息写入错误日志。
以下各节讨论配置错误日志记录的各个方面。
错误日志组件配置
在MySQL 8.0中,错误记录使用“ MySQL服务器组件”中所述的MySQL组件体系结构。错误日志子系统由执行日志事件过滤和写入的组件以及配置要启用哪些组件以实现所需的日志记录结果的系统变量组成。
本节讨论如何选择组件以进行错误记录。有关特定于日志过滤器的说明,有关特定于JSON和系统日志编写器的说明,请参见“JSON 数据类型”和“将错误记录到系统日志”。有关所有可用日志组件的更多详细信息,
基于组件的错误日志记录提供以下功能:
- 日志事件可以由过滤器组件过滤,以影响可用于写入的信息。
- 日志事件由接收器(写入器)组件输出。可以启用多个接收器组件,以将错误日志输出写入多个目标。
- 内置的过滤器和编写器组件结合起来可以实现默认的错误日志格式。
- 可加载的编写器启用以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';
注意用于加载日志组件的URN
INSTALL COMPONENT
是前缀为的组件名称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';
要配置在每次服务器启动时启用的日志组件,请使用以下过程:
- 如果组件是可加载的,请在运行时使用加载它
INSTALL COMPONENT
。加载组件会将其注册到mysql.component
系统表中,以便服务器自动加载它以用于后续启动。 log_error_services
在启动时设置值以包括组件名称。在服务器my.cnf
文件中设置值,或使用SET PERSIST
,为正在运行的MySQL实例设置值,并保存该值以用于随后的服务器重启;请参见“变量分配的SET语法”。设置的值在my.cnf
下次重启时生效。使用设置的值将SET PERSIST
立即生效,并在随后的重启中生效。
假设您想要配置,为每个服务器启动时,使用JSON日志作家(中log_sink_json
除)内置日志过滤器和作家(log_filter_internal
,log_sink_internal
)。如果未加载JSON书写器,请首先加载它:
INSTALL COMPONENT 'file://component_log_sink_json';
然后设置log_error_services
为在服务器启动时生效。您可以在my.cnf
以下位置进行设置:
[mysqld] 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上的默认错误日志目标。
- 对于Unix和类似Unix的系统,请参见Unix和类似Unix的系统上的默认错误日志目标。
服务器解释了默认错误日志目标选项后,它将设置log_error
系统变量以指示默认目标,这会影响多个日志编写器组件在何处写入错误消息。请参见默认错误日志目标如何影响日志编写器。
- Windows上的默认错误日志目标
- Unix和类似Unix的系统上的默认错误日志目标
- 默认错误日志目标如何影响日志编写器
Windows上的默认错误日志目标
在Windows上,mysqld的使用--log-error
,--pid-file
和--console
选项来确定默认的错误日志目的地是否是控制台或文件,并且,如果一个文件,文件名:
- 如果
--console
给出,则默认目标是控制台。(如果同时提供--console
了--log-error
两者,则优先于此,并且以下有关项目--log-error
均不适用。) - 如果
--log-error
未指定,或者未指定文件名,则默认目标是host_name.err
在数据目录中命名的文件,除非--pid-file
指定了该选项。在这种情况下,文件名是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]
,[server]
或[mysqld_safe]
部分,mysqld_safe的查找并使用的选项,并将其传递到mysqld的。
注意在Yum或APT软件包安装中,通常
/var/log
使用诸如log-error=/var/log/mysqld.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
value为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
数值如何,写入器都会写入系统日志。
错误日志过滤的类型
错误日志配置通常包括一个日志过滤器组件和一个或多个日志编写器组件。对于错误日志过滤,MySQL提供了以下组件选择:
log_filter_internal
:此过滤器组件根据和事件log_error_verbosity
和log_error_suppression_list
系统变量结合日志事件优先级和错误代码提供错误日志过滤。log_filter_internal
内置并默认启用。log_filter_dragnet
:此过滤器组件可结合用户dragnet.log_error_filter_rules
变量和系统变量,提供基于用户提供的规则的错误日志过滤。
基于优先级的错误日志过滤(log_filter_internal)
log_filter_internal
日志过滤器组件实现日志的一个简单的形式滤波基于误差事件优先级和错误代码。要影响如何log_filter_internal
允许或禁止用于错误日志的错误,警告和信息事件,请设置log_error_verbosity
和log_error_suppression_list
系统变量。
log_filter_internal
内置并默认启用。如果此过滤器被禁用log_error_verbosity
并且log_error_suppression_list
无效,那么必须使用其他过滤器服务来对过滤进行建模,而不是在需要的地方(例如,使用时使用单独的过滤规则log_filter_dragnet
)。有关过滤器配置的信息,
- 详细度过滤
- 抑制列表过滤
- 详细度和抑制列表交互
详细度过滤
用于错误日志事件具有的优先级ERROR
,WARNING
或INFORMATION
。所述log_error_verbosity
系统变量控制冗长基于其优先级以允许在写入日志消息,如图所示,在下表中。
允许的邮件优先级 | log_error_verbosity值 |
---|---|
ERROR | 1个 |
ERROR ,WARNING | 2 |
ERROR ,WARNING ,INFORMATION | 3 |
如果log_error_verbosity
为2或更大,则服务器记录有关对于基于语句的日志记录不安全的语句的消息。如果值为3,则服务器将记录中止的连接和访问被拒绝的错误,以进行新的连接尝试。请参见第B.4.2.10节“通信错误和中止的连接”。
如果使用复制,log_error_verbosity
建议使用2或更大的值,以获得有关正在发生的事情的更多信息,例如有关网络故障和重新连接的消息。
如果log_error_verbosity
在从属服务器上大于等于2,则从属服务器会将错误消息打印到错误日志中,以提供有关其状态的信息,例如二进制日志和中继日志坐标(从其开始工作时,切换到另一个中继日志时,断开连接后重新连接,依此类推。
还有一个优先级SYSTEM
。无论log_error_verbosity
值如何,有关非错误情况的系统消息都会打印到错误日志中。这些消息包括启动和关闭消息,以及对设置的一些重大更改。
在MySQL错误日志中,系统消息标记为“ System ”。其他日志编写者可能遵循或未遵循相同的约定,并且在生成的日志中,可能会为系统消息分配用于信息优先级的标签,例如“ Note ”或“ Information ”。如果您基于消息的标签对日志记录应用任何其他过滤或重定向,系统消息不会覆盖您的过滤器,但由过滤器以与其他消息相同的方式进行处理。
抑制列表过滤
该log_error_suppression_list
系统变量适用于用于错误日志,并指定其当它们的优先级发生的事件打压的事件WARNING
或INFORMATION
。例如,如果某种特定类型的警告由于频繁发生但不被关注而在错误日志中被认为是不希望的“噪音”,则可以将其抑制。
该log_error_suppression_list
值可以是无抑制的空字符串,也可以是一个或多个逗号分隔值的列表,这些值指示要抑制的错误代码。错误代码可以以符号或数字形式指定。可以指定带或不带MY-
前缀的数字代码。数字部分中的前导零并不重要。允许的代码格式示例:
ER_SERVER_SHUTDOWN_COMPLETE MY-000031 000031 MY-31 31
从可读性和可移植性的角度来看,符号值优于数字值。
尽管要抑制的代码可以用符号或数字形式表示,但是每个代码的数值必须在允许的范围内:
- 1至999:服务器和客户端使用的全局错误代码。
- 10000及更高版本:服务器错误代码,打算将其写入错误日志(不发送给客户端)。
另外,指定的每个错误代码实际上必须由MySQL使用。尝试指定不在允许范围内或不在允许范围内但未被MySQL使用的代码会产生错误,并且该log_error_suppression_list
值保持不变。
有关错误代码范围以及每个范围内定义的错误符号和编号的信息,请参阅附录B,错误,错误代码和常见问题。
服务器可以以不同的优先级为给定的错误代码生成消息,因此是否禁止与其中列出的错误代码相关的消息log_error_suppression_list
取决于其优先级。假设变量的值为'ER_PARSER_TRACE,MY-010001,10002'
。然后log_error_suppression_list
具有以下效果:
- 如果生成优先级为
WARNING
或的消息,则这些代码的消息将被抑制INFORMATION
。 - 优先级为
ERROR
或SYSTEM
不禁止显示的消息。
详细度和抑制列表交互
log_error_verbosity
结合的效果log_error_suppression_list
。考虑使用以下设置启动的服务器:
[mysqld] log_error_verbosity=2 # error and warning messages only log_error_suppression_list='ER_PARSER_TRACE,MY-010001,10002'
在这种情况下,log_error_verbosity
允许具有ERROR
或WARNING
优先级的消息,并丢弃具有INFORMATION
优先级的消息。在未log_error_suppression_list
丢弃的消息中,WARNING
优先丢弃消息和任何命名的错误代码。
注意
log_error_verbosity
示例中显示的值2也是其默认值,因此该变量对INFORMATION
消息的影响如默认情况下所描述,而没有显式设置。log_error_verbosity
如果要log_error_suppression_list
影响INFORMATION
优先级的消息,则必须设置为3 。
考虑使用此设置启动的服务器:
[mysqld] log_error_verbosity=1 # error messages only
在这种情况下,log_error_verbosity
允许具有ERROR
优先级的消息,并丢弃具有WARNING
或INFORMATION
优先级的消息。设置log_error_suppression_list
不会产生任何效果,因为设置可能会丢弃所有可能抑制的错误代码log_error_verbosity
。
基于规则的错误日志过滤(log_filter_dragnet)
log_filter_dragnet
日志过滤器组件能够基于用户定义的规则日志过滤。要定义适用的规则,请设置dragnet.log_error_filter_rules
系统变量。
要启用log_filter_dragnet
过滤器,请先加载过滤器组件,然后修改log_error_services
值。以下示例log_filter_dragnet
与内置日志编写器结合使用:
INSTALL COMPONENT 'file://component_log_filter_dragnet';SET GLOBAL log_error_services = 'log_filter_dragnet; log_sink_internal';
要设置log_error_services
为在服务器启动时生效,请使用“错误日志组件配置”中的说明。这些指令也适用于其他错误记录系统变量。
随着log_filter_dragnet
启动,通过设置定义它的过滤规则dragnet.log_error_filter_rules
系统变量。规则集由零个或多个规则组成,其中每个规则都是IF
以句点(.
)字符结尾的语句。如果变量值为空(零规则),则不会进行过滤。
示例1.此规则集删除信息事件,而对于其他事件,则删除该source_line
字段:
SET GLOBAL dragnet.log_error_filter_rules = 'IF prio>=INFORMATION THEN drop. IF EXISTS source_line THEN unset source_line.';
效果类似于设置为的过滤器执行的log_sink_internal
过滤log_error_verbosity=2
。
示例2:此规则将信息事件限制为每60秒不超过一个:
SET GLOBAL dragnet.log_error_filter_rules = 'IF prio>=INFORMATION THEN throttle 1/60.';
设置完所需的过滤配置后,请考虑分配dragnet.log_error_filter_rules
使用,SET PERSIST
而不是SET GLOBAL
使设置在服务器重新启动后持续存在。或者,将设置添加到服务器选项文件。
要停止使用过滤语言,请首先从错误日志记录组件集中将其删除。通常,这意味着使用其他过滤器组件而不是不使用过滤器组件。例如:
SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';
同样,请考虑使用using SET PERSIST
而不是SET GLOBAL
使设置在服务器重新启动后保持不变。
然后卸载过滤器log_filter_dragnet
组件:
UNINSTALL COMPONENT 'file://component_log_filter_dragnet';
以下各节log_filter_dragnet
更详细地描述了操作方面:
- log_filter_dragnet规则语言
- log_filter_dragnet规则操作
- log_filter_dragnet规则字段
log_filter_dragnet规则语言
以下语法定义了log_filter_dragnet
过滤规则的语言。每个规则都是一个IF
以句点(.
)字符结尾的语句。语言不区分大小写。
rule: IF condition THEN ction [ELSEIF condition THEN ction] ... [ELSE ction] . condition: { field comparator value | [NOT] EXISTS field | condition {AND | OR} condition } ction: { drop | throttle {count | count / window_size} | set field [:= | =] value | unset [field] } field: { core_field | optional_field | user_defined_field } core_field: { time | msg | prio | label | err_code | err_symbol | SQL_state | subsystem } optional_field: { OS_errno | OS_errmsg | user | host | thread | query_id | source_file | source_line | function } user_defined_field: sequence of characters in [ -zA-Z0-9_] class comparator: {== | != | < > | >= | = > | <= | =< | < | >} value: { string_literal | integer_literal | float_literal | error_symbol | priority } count: integer_literal window_size: integer_literal string_literal: sequence of characters quoted as '...' or "..." integer_literal: sequence of characters in [0-9] class float_literal: integer_literal[.integer_literal] error_symbol: valid MySQL error symbol such as ER_ACCESS_DENIED_ERROR or ER_STARTUP priority: { ERROR | WARNING | INFORMATION }
简单条件将字段与值或测试字段的存在进行比较。要构造更复杂的条件,请使用AND
和OR
运算符。两个运算符具有相同的优先级,并从左到右求值。
要转义字符串中的字符,请在其前面加上反斜杠(\
)。需要反斜杠以包含反斜杠本身或字符串引号字符,其他字符可选。
为了方便起见,log_filter_dragnet
支持使用符号名称与某些字段进行比较。在适用的情况下,出于可读性和可移植性的考虑,符号值优于数字值。
事件优先级值1,2,和3可被指定为
ERROR
,WARNING
,和INFORMATION
。仅在与该prio
字段进行比较时才能识别优先级符号。这些比较是等效的:IF prio == INFORMATIONTHEN ...IF prio == 3THEN ...错误代码可以以数字形式或作为相应的错误符号指定。例如,
ER_STARTUP
是error的符号名1408
,因此这些比较是等效的:IF err_code == ER_STARTUPTHEN ...IF err_code == 1408THEN ...错误符号仅在与
err_code
字段和用户定义的字段进行比较时才被识别。要查找与给定错误代码编号相对应的错误符号,请使用以下方法之一:
- 在第B.3.1节“服务器错误消息参考”中检查服务器错误列表。
- 使用perror命令,当给定错误号参数时,该命令将显示有关错误的信息,包括其符号。
假设带有错误编号的规则集如下所示:
IF err_code == 10927 OR err_code == 10914THEN drop .IF err_code == 1131THEN drop .使用perror,确定错误符号:
shell>
perror 10927 10914 1131 MySQL error code MY-010927 (ER_ACCESS_DENIED_FOR_USER_ACCOUNT_LOCKED): Access denied for user '%-.48s'@'%-.64s'. Account is locked. MySQL error code MY-010914 (ER_ABORTING_USER_CONNECTION): Aborted connection %u to db: '%-.192s' user: '%-.48s' host: '%-.64s' (%-.64s). MySQL error code MY-001131 (ER_PASSWORD_ANONYMOUS_USER): You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords用错误符号代替数字,规则集变为:
IF err_code == ER_ACCESS_DENIED_FOR_USER_ACCOUNT_LOCKED OR err_code == ER_ABORTING_USER_CONNECTIONTHEN drop .IF err_code == ER_PASSWORD_ANONYMOUS_USERTHEN drop .
可以将符号名称指定为带引号的字符串,以便与字符串字段进行比较,但是在这种情况下,名称是没有特殊含义的字符串,并且log_filter_dragnet
不会将其解析为相应的数值。同样,可能不会检测到错别字,而SET
尝试使用服务器未知的未加引号的符号会立即引发错误。
log_filter_dragnet规则操作
log_filter_dragnet
在过滤规则中支持以下操作:
drop
:删除当前的日志事件(不记录)。throttle
:应用速率限制来减少符合特定条件的事件的日志详细程度。所述参数指示的速率,在形式count
或count
/window_size
。该count
值表示每个时间窗口允许记录的事件数。该window_size
值是时间窗口,以秒为单位;如果省略,则默认窗口为60秒。两个值都必须是整数文字。该规则将插件关闭消息的速度限制为每60秒5条消息:
IF err_code == ER_PLUGIN_SHUTTING_DOWN_PLUGINTHEN throttle 5.此规则将错误和警告限制为每小时1000条,并将信息消息限制为每小时100条:
IF prio <= INFORMATIONTHEN throttle 1000/3600ELSE throttle 100/3600.set
:为一个字段分配一个值(如果尚未存在,则使该字段存在)。在随后的规则中,EXISTS
针对字段名称的测试为true,并且可以通过比较条件来测试新值。unset
:丢弃字段。在后续规则中,EXISTS
针对字段名称的测试为false,而针对任何值的字段比较为false。在特殊情况下,该条件仅指一个字段名,后面的字段名
unset
是可选的,并unset
丢弃命名字段。这些规则是等效的:IF myfield == 2THEN unset myfield.IF myfield == 2THEN unset.
log_filter_dragnet规则字段
log_filter_dragnet
支持规则中的核心,可选和用户定义的字段:
- 将为错误事件自动设置一个核心字段。但是,不能保证其在事件中的存在,因为核心字段(如任何类型的字段)可能未由过滤规则设置。如果是这样,则该字段将被规则集中的后续规则以及过滤器之后执行的组件(例如日志编写器)丢失。
- 通常不存在可选字段,但对于某些事件类型可能存在该字段。如果存在,则可选字段会提供适当且可用的其他事件信息。
- 用户定义的字段是名称尚未定义为核心或可选字段的任何字段。在使用
set
操作创建之前,用户定义的字段不存在。
如前面的描述所隐含的,任何给定字段都可能不存在,因为它根本就不存在,或者被过滤规则所丢弃。对于日志编写者,缺少字段的影响是特定于编写者的。例如,编写者可能会从日志消息中忽略该字段,指示该字段丢失,或替换为默认值。如有疑问,请使用过滤器规则取消设置该字段,然后检查日志编写器对该字段的作用。
这些字段是核心字段:
time
事件时间戳记。
msg
事件消息字符串。
prio
事件优先级,用于指示错误,警告或注释/信息事件。该字段对应于中的严重性
syslog
。在比较中,可以将每个优先级指定为符号优先级名称或整数文字。仅在与该
prio
字段进行比较时才能识别优先级符号。这些比较是等效的:IF prio == INFORMATIONTHEN ...IF prio == 3THEN ...下表显示了允许的优先级。
事件类型 优先符号 数值优先 错误事件 ERROR
1个 警告事件 WARNING
2 笔记/信息事件 INFORMATION
3 优先级也为
SYSTEM
,但是系统消息无法过滤,并且始终写入错误日志。通常,消息优先级确定如下:
情况或事件是否可行?
是:情况或事件可忽略吗?
- 是:优先级为
WARNING
。 - 否:优先级为
ERROR
。
- 是:优先级为
否:这种情况或事件是强制性的吗?
- 是:优先级为
SYSTEM
。 - 否:优先级为
INFORMATION
。
- 是:优先级为
优先级值遵循以下原则:较高优先级具有较低值,反之亦然。对于最严重的事件(错误),优先级值从1开始,对于优先级降低的事件,优先级值从1开始增加。例如,要丢弃优先级低于警告的事件,请测试高于的优先级值
WARNING
:IF prio > WARNINGTHEN drop .以下示例显示了
log_filter_dragnet
实现类似于过滤器log_error_verbosity
允许的每个值的效果的规则log_filter_internal
:仅错误(
log_error_verbosity=1
):IF prio >ERROR THEN drop .错误和警告(
log_error_verbosity=2
):IF prio > WARNINGTHEN drop .错误,警告和注意事项(
log_error_verbosity=3
):IF prio > INFORMATIONTHEN drop .实际上,可以忽略此规则,因为没有
prio
大于的值INFORMATION
,因此有效地它不会丢失任何内容。
err_code
数字事件错误代码。在比较中,可以将要测试的值指定为符号错误名称或整数文字。错误符号仅在与
err_code
字段和用户定义的字段进行比较时才被识别。这些比较是等效的:IF err_code == ER_ACCESS_DENIED_ERRORTHEN ...IF err_code == 1045THEN ...err_symbol
事件错误符号,以字符串形式(例如
'ER_DUP_KEY'
)。err_symbol
值比过滤器规则比较中更多地用于标识日志输出中的特定行,因为它们log_filter_dragnet
不能将指定为字符串的比较值解析为等效的数字错误代码。SQL_state
事件SQLSTATE值,以字符串形式(例如
'23000'
)。subsystem
发生事件的子系统。可能的值为
InnoDB
(InnoDB
存储引擎),Repl
(复制子系统),Server
(否则)。
可选字段分为以下几类:
有关错误的其他信息,例如操作系统发出的错误或错误标签:
OS_errno
操作系统错误号。
OS_errmsg
操作系统错误消息。
label
与
prio
值对应的标签,以字符串形式。筛选器规则可以更改支持自定义标签的日志编写器的标签。label
值比过滤规则比较中更多地用于标识日志输出中的特定行,因为它们log_filter_dragnet
不会将指定为字符串的比较值解析为等效的数字优先级。
标识事件发生的客户端:
user
客户端用户。
host
客户端主机。
thread
线程ID。
query_id
查询ID。
调试信息:
source_file
发生事件的源文件。文件名应省略任何前导路径。例如,要测试
sql/gis/distance.cc
文件,请编写如下比较:IF source_file == "distance.cc"THEN ...source_line
源文件中发生事件的行。
function
事件发生的功能。
component
发生事件的组件或插件。
JSON格式的错误记录
本节介绍如何使用内置过滤器log_filter_internal
和JSON编写器配置错误日志记录log_sink_json
,以立即生效并在随后的服务器启动中生效。有关配置错误日志记录的一般信息,
要启用JSON编写器,请首先加载编写器组件,然后修改log_error_services
值:
INSTALL COMPONENT 'file://component_log_sink_json';SET GLOBAL log_error_services = 'log_filter_internal; log_sink_json';
要设置log_error_services
为在服务器启动时生效,请使用“错误日志组件配置”中的说明。这些指令也适用于其他错误记录系统变量。
允许log_sink_json
在log_error_services
值中多次命名。例如,要为一个实例编写未过滤的事件,为另一个实例编写过滤的事件,可以这样设置log_error_services
:
SET GLOBAL log_error_services = 'log_sink_json; log_filter_internal; log_sink_json';
JSON日志编写器根据默认错误日志目标(由log_error
系统变量指定)确定其输出目标。如果log_error
命名文件,则JSON 编写器将基于该文件名加上一个带编号的后缀(从00开始)来命名输出文件。例如,如果为is ,则值中连续的named 实例将写入,等等。.NN.json
NN
log_error
file_name
log_sink_json
log_error_services
file_name.00.json
file_name.01.json
如果log_error
为stderr
,则JSON编写器将写入控制台。如果log_json_writer
在log_error_services
值中多次命名它们,它们都将写入控制台,这可能没有用。
错误记录到系统日志
可能mysqld将错误日志写入系统日志(Windows,syslog
Unix和类似Unix的系统上的事件日志)。
本节介绍如何使用内置过滤器log_filter_internal
和系统日志编写器配置错误日志记录log_sink_syseventlog
,以立即生效并随后启动服务器。有关配置错误日志记录的一般信息,
要启用系统日志编写器,请首先加载编写器组件,然后修改log_error_services
值:
INSTALL COMPONENT 'file://component_log_sink_syseventlog';SET GLOBAL log_error_services = 'log_filter_internal; log_sink_syseventlog';
要设置log_error_services
为在服务器启动时生效,请使用“错误日志组件配置”中的说明。这些指令也适用于其他错误记录系统变量。
注意对于MySQL 8.0配置,必须显式启用将错误日志记录到系统日志中。这与MySQL 5.7和更早版本不同,MySQL 5.7和更早版本的Windows默认情况下启用了将错误日志记录到系统日志的功能,并且在所有平台上都不需要加载组件。
错误记录到系统日志中可能需要其他系统配置。请查阅所用平台的系统日志文档。
在Windows上,写入应用程序日志中事件日志的错误消息具有以下特征:
- 标记为
Error
,Warning
和的条目Note
将写入事件日志,但不会写入消息(例如来自各个存储引擎的信息语句)。 - 事件日志条目的来源
MySQL
(或如果定义为)。MySQL-tag
syseventlog.tag
tag
在Unix和类似Unix的系统上,使用登录到系统日志syslog
。以下系统变量会影响syslog
消息:
syseventlog.facility
:syslog
消息的默认功能是daemon
。设置此变量以指定其他功能。syseventlog.include_pid
:是否在每行syslog
输出中包括服务器进程ID 。syseventlog.tag
:此变量定义了一个标签,该标签将添加到消息中的服务器标识符(mysqld
)中syslog
。如果已定义,则标签将以前导连字号附加到标识符。
注意在此之前的MySQL 8.0.13,使用
log_syslog_facility
,log_syslog_include_pid
和log_syslog_tag
系统变量,而不是变量。syseventlog.xxx
MySQL将自定义标签“ System ”用于有关非错误情况的重要系统消息,例如启动,关闭以及对设置的一些重大更改。在不支持自定义标签的日志中,包括Windows syslog
上的“事件日志”,以及在Unix和类似Unix的系统上,会为系统消息分配用于信息优先级的标签。但是,即使MySQL log_error_verbosity
设置通常在信息级别排除消息,这些消息也会打印到日志中。
当日志编写者必须以这种方式退回到“信息”而不是“系统”的标签,并且日志事件在MySQL服务器之外进一步处理(例如,由syslog
配置过滤或转发)时,这些事件可能默认情况下,辅助应用程序将其作为“信息”优先级而不是“系统”优先级进行处理。
错误日志消息格式
每个错误日志接收器(写入器)组件都有一种特征输出格式,用于将消息写入其目的地,但是其他因素可能会影响消息的内容:
- 日志编写器可用的信息。如果在执行写入程序组件之前执行的日志过滤器组件删除了日志事件属性,则该属性不可用于写入。有关日志过滤的信息,
- 系统变量可能会影响日志编写器。请参阅影响错误日志格式的系统变量。
对于所有日志编写器,错误日志消息中包含的ID是mysqld中负责编写消息的线程的ID 。这表明服务器的哪个部分产生了该消息,并且与常规查询日志和慢速查询日志消息(包括连接线程ID)一致。
- log_sink_internal的输出格式
- log_sink_json的输出格式
- log_sink_syseventlog的输出格式
- 早期启动日志记录的输出格式
- 影响错误日志格式的系统变量
log_sink_internal的输出格式
该日志编写器生成传统的错误日志输出。它使用以下格式写消息:
timestamp thread_id [priority] [err_code] [subsystem] message
[
和]
方括号字符是在消息格式文本字符。它们并不表示字段是可选的。
在和领域在MySQL 8.0中添加。它们将在旧服务器生成的日志中丢失。日志解析器可以将这些字段视为消息文本的一部分,仅在服务器最近写入的日志(包括它们)中才会出现。解析器必须将指标的一部分视为字符串值。[
err_code
][subsystem]
err_code
[
err_code
]
例子:
2018-03-22T12:35:47.538083Z 0 [Note] [MY-012487] [InnoDB] InnoDB: DDL log recovery : begin 2018-03-22T12:35:47.550565Z 0 [Warning] [MY-010068] [Server] CA certificate /var/mysql/sslinfo/cacert.pem is self signed. 2018-03-22T12:35:47.669397Z 4 [Note] [MY-010051] [Server] Event Scheduler: scheduler thread started with id 4 2018-03-22T12:35:47.550939Z 0 [Note] [MY-010253] [Server] IPv6 is available.
log_sink_json的输出格式
JSON格式的日志编写器将消息生成为包含键值对的JSON对象。例如:
{ "prio": 3, "err_code": 10051, "subsystem": "Server", "source_file": "event_scheduler.cc", "function": "run", "msg": "Event Scheduler: scheduler thread started with id 4", "time": "2018-03-22T12:35:47.669397Z", "thread": 4, "err_symbol": "ER_SCHEDULER_STARTED", "SQL_state": "HY000", "label": "Note" }
log_sink_syseventlog的输出格式
系统日志编写器产生的输出符合本地平台上使用的系统日志格式。
早期启动日志记录的输出格式
服务器在处理启动选项之前以及因此知道错误日志设置(例如log_error_verbosity
和和log_timestamps
值)以及要使用的日志组件之前,会生成一些错误日志消息。服务器处理在启动过程早期生成的错误日志消息,如下所示:
- 在MySQL 8.0.14之前,服务器生成具有默认时间戳,格式和详细级别的消息,并对其进行缓冲。处理启动选项并知道错误日志配置后,服务器将刷新缓冲的消息。由于这些早期消息使用默认的日志配置,因此它们可能与启动选项所指定的不同。此外,除了默认值以外,早期消息不会刷新到日志编写器。例如,登录到JSON编写器不包括这些早期消息,因为它们不是JSON格式。
从MySQL 8.0.14开始,服务器缓冲日志事件而不是格式化日志消息。这样一来,它便可以在已知设置后将配置设置追溯应用到那些事件,结果刷新的消息将使用配置的设置,而不是默认设置。同样,消息将刷新到所有已配置的编写器,而不仅仅是默认的编写器。
如果在知道日志配置之前发生了致命错误,并且服务器必须退出,则服务器不会丢失。如果没有发生致命错误,但是在处理启动选项之前启动速度过慢,则服务器会使用日志记录默认值定期格式化和刷新缓冲的消息,以免显得无响应。尽管这些行为与8.0.14之前的行为类似,但使用的是默认值,但在出现异常情况时,它们比丢失消息更好。
影响错误日志格式的系统变量
该log_timestamps
系统变量控制在写入错误日志消息时间戳的时区(以及一般查询日志和慢查询日志文件)。允许的值为UTC
(默认值)和SYSTEM
(本地系统时区)。
错误日志文件刷新和重命名
如果使用FLUSH ERROR LOGS
,FLUSH LOGS
或mysqladmin flush-logs刷新错误日志,则服务器将关闭并重新打开其正在写入的任何错误日志文件。要重命名错误日志文件,请在刷新前手动进行重命名。刷新日志,然后使用原始文件名打开一个新文件。例如,假设日志文件名为host_name.err
,以重命名该文件并创建一个新文件,请使用以下命令:
mv host_name.err host_name.err-old mysqladmin flush-logs mv host_name.err-old backup-directory
在Windows上,请使用重命名而不是mv。
如果错误日志文件的位置无法由服务器写入,则日志刷新操作将无法创建新的日志文件。例如,在Linux上,服务器可能将错误日志写入该/var/log/mysqld.log
文件,该/var/log
目录root
由mysqld拥有并且不可写。有关处理这种情况的信息,请参见“服务器日志维护”。
如果服务器未写入命名的错误日志文件,则刷新错误日志时不会发生任何错误日志文件重命名。
通用查询日志
常规查询日志是mysqld在做什么的常规记录。当客户端连接或断开连接时,服务器会将信息写入此日志,并记录从客户端收到的每个SQL语句。当您怀疑客户端中的错误并想确切了解客户端发送给mysqld的内容时,常规查询日志可能非常有用。
显示客户端连接时间的每一行还包括指示用于建立连接的协议。是(不使用SSL建立的TCP / IP连接),(使用SSL建立的TCP / IP连接),(Unix套接字文件连接),(Windows命名管道连接)或(Windows共享内存连接)之一。using connection_type
connection_type
TCP/IP
SSL/TLS
Socket
Named Pipe
Shared Memory
mysqld按照接收语句的顺序将语句写入查询日志,这可能与它们执行的顺序不同。该日志记录顺序与二进制日志相反,二进制日志的执行顺序是在语句执行之后但释放任何锁之前。此外,查询日志可能包含仅选择数据的语句,而这些语句从未写入二进制日志。
在复制主服务器上使用基于语句的二进制日志记录时,其从属服务器接收的语句将写入每个从属服务器的查询日志中。如果客户端使用mysqlbinlog实用程序读取事件并将其传递到服务器,则将语句写入主服务器的查询日志。
但是,在使用基于行的二进制日志记录时,更新是作为行更改而不是SQL语句发送的,因此,当binlog_format
is 时,这些语句永远不会写入查询日志ROW
。当此变量设置为时MIXED
,给定的更新也可能不会写入查询日志,具体取决于所使用的语句。有关更多信息,请参见“复制格式”。
默认情况下,常规查询日志处于禁用状态。要明确指定初始常规查询日志状态,请使用--general_log[={0|1}]
。不带参数或参数为1时,--general_log
启用日志。参数为0时,此选项禁用日志。要指定日志文件名,请使用。要指定日志目标,请使用系统变量(如“选择常规查询日志和慢查询日志输出目标”中所述)。--general_log_file=file_name
log_output
注意如果指定
TABLE
日志目标,请参阅日志表和“打开的文件太多”错误。
如果您没有为常规查询日志文件指定名称,则默认名称为host_name.log
。除非给出绝对路径名以指定其他目录,否则服务器将在数据目录中创建文件。
要在运行时禁用或启用常规查询日志或更改日志文件名,请使用全局变量general_log
和general_log_file
系统变量。设置general_log
为0(或OFF
)禁用日志,或设置为1(或ON
)启用日志。设置general_log_file
以指定日志文件的名称。如果日志文件已经打开,则将其关闭并打开新文件。
启用常规查询日志后,服务器会将输出写入log_output
系统变量指定的任何目标。如果启用日志,则服务器将打开日志文件并向其中写入启动消息。但是,除非FILE
选择了日志目标,否则不会将查询进一步记录到文件中。如果目标是NONE
,则即使启用了常规日志,服务器也不会写入查询。如果日志目标值不包含,则设置日志文件名对日志记录无效FILE
。
服务器重新启动,并且日志刷新不会导致生成新的常规查询日志文件(尽管刷新会关闭并重新打开它)。要重命名文件并创建一个新文件,请使用以下命令:
shell>mv host_name.log host_name-old.log shell>mysqladmin flush-logs shell>mv host_name-old.log backup-directory
在Windows上,请使用重命名而不是mv。
您还可以在运行时通过禁用日志来重命名常规查询日志文件:
SET GLOBAL general_log = 'OFF';
在禁用日志的情况下,从外部重命名日志文件(例如,从命令行)。然后再次启用日志:
SET GLOBAL general_log = 'ON';
此方法可在任何平台上使用,并且不需要重新启动服务器。
要为当前会话禁用或启用常规查询日志记录,请将会话sql_log_off
变量设置为ON
或OFF
。(这假定常规查询日志本身已启用。)
服务器将重写写在一般查询日志中的语句中的密码,以使之不会以纯文本的形式出现。通过使用--log-raw
选项启动服务器,可以抑制常规查询日志的密码重写。此选项对于诊断目的可能有用,它可以参见服务器接收到的确切的语句文本,但是出于安全原因,不建议将其用于生产。另
密码重写的含义是,无法解析(例如由于语法错误)的语句不会写入通用查询日志,因为无法知道它们没有密码。需要记录所有语句(包括错误语句)的用例应使用该--log-raw
选项,请牢记这也绕过了密码重写。
仅当需要纯文本密码时才进行密码重写。对于具有期望密码哈希值的语法的语句,不会进行重写。如果错误地为这种语法提供了纯文本密码,则将按给定的密码记录密码,而不进行重写。
所述log_timestamps
系统变量控制在写入到通用查询日志文件消息的时间戳的时区(以及慢查询日志文件和错误日志)。它不影响写入日志表的常规查询日志和慢速查询日志消息的时区,但是CONVERT_TZ()
通过设置会话time_zone
系统变量或通过设置会话系统变量,可以将从本地表时区转换为任何所需时区。