7.4.1 选择一般查询日志和慢查询日志输出目的地
MySQL Server 提供了灵活的控制方式,以便将一般查询日志和慢查询日志的输出结果写入到指定的目的地。如果启用了这两个日志,那么可能的输出目的地是日志文件或 MySQL 系统数据库中的 general_log
和 slow_log
表。可以选择将输出结果写入到文件、表中,或者同时写入到这两个地方。
系统变量 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_log ENGINE = 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_log TO general_log_backup, general_log2 TO general_log;
-
CHECK TABLE
是对日志表的有效操作。 -
LOCK TABLES
无法在日志表上使用。 -
FLUSH TABLES WITH READ LOCK
和read_only
系统变量对日志表没有影响。服务器总是可以写入日志表。 -
写入到日志表的条目不会被写入到二进制日志中,因此不会被复制到副本上。
-
要刷新日志表或日志文件,请分别使用
FLUSH TABLES
或FLUSH LOGS
。 -
日志表的分区不允许。
-
使用mysqldump将dump语句包含在备份文件中,以便重新加载时可以重建这些表。日志表的内容不包括在dump文件中。