Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Selecting General Query Log and Slow Query Log Output Destinations

7.4.1 选择一般查询日志和慢查询日志输出目的地

MySQL Server 提供了灵活的控制方式,以便将一般查询日志和慢查询日志的输出结果写入到指定的目的地。如果启用了这两个日志,那么可能的输出目的地是日志文件或 MySQL 系统数据库中的 general_logslow_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变量指示当前的日志目标。它可以在运行时修改,以更改目标。

  • general_logslow_query_log 变量指示是否启用了一般查询日志和慢查询日志(ON)或禁用它们(OFF)。您可以在运行时设置这些变量来控制日志的启用状态。

  • general_log_fileslow_query_log_file 变量指示一般查询日志和慢查询日志文件的名称。您可以在服务器启动或运行时设置这些变量来更改日志文件的名称。

  • 要禁用或启用当前会话的一般查询日志,请将会话sql_log_off 变量设置为 ONOFF。(假设一般查询日志本身已经启用。)

使用表格输出日志具有以下优点:

  • 日志条目具有标准格式。要显示当前日志表的结构,请使用以下语句:

    SHOW CREATE TABLE mysql.general_log;
    SHOW CREATE TABLE mysql.slow_log;
  • 日志内容可以通过 SQL 语句访问。这使得可以使用查询语句选择满足特定条件的日志条目。例如,要选择与特定客户相关的日志条目(这对于从该客户识别问题查询非常有用),使用日志表比使用日志文件更方便。

  • 日志可以通过任何连接到服务器并发出查询的客户端远程访问(如果客户端具有适当的日志表权限)。不需要登录到服务器主机并直接访问文件系统。

日志表实现具有以下特点:

  • 一般来说,日志表的主要目的是为用户提供观察服务器运行时执行的接口,而不是干扰其运行时执行。

  • CREATE TABLEALTER TABLEDROP TABLE是日志表的有效操作。对于ALTER TABLEDROP TABLE,日志表不能在使用中且必须被禁用,如后面所述。

  • 默认情况下,日志表使用CSV存储引擎将数据写入逗号分隔值格式。对于具有访问包含日志表数据的.CSV文件权限的用户,可以轻松地将文件导入其他程序,如可以处理 CSV 输入的电子表格软件。

    可以将日志表更改为使用MyISAM存储引擎。不能使用ALTER TABLE语句来更改正在使用的日志表。日志必须先被禁用。除了CSVMyISAM外,其他存储引擎对日志表不合法。

    日志表和“太多打开文件”错误 如果您选择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 无法在日志表上使用。

  • INSERTDELETEUPDATE 在日志表上不可用。这些操作只能在服务器内部使用。

  • FLUSH TABLES WITH READ LOCKread_only 系统变量对日志表没有影响。服务器总是可以写入日志表。

  • 写入到日志表的条目不会被写入到二进制日志中,因此不会被复制到副本上。

  • 要刷新日志表或日志文件,请分别使用FLUSH TABLESFLUSH LOGS

  • 日志表的分区不允许。

  • 使用mysqldump将dump语句包含在备份文件中,以便重新加载时可以重建这些表。日志表的内容不包括在dump文件中。