Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

7.4.1 选择通用查询日志和慢查询日志输出目标

MySQL 服务器提供了对通用查询日志和慢查询日志输出目标的灵活控制,如果启用了这些日志。可能的日志目标是日志文件或 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 指示当前的日志目标。可以在运行时修改它以更改目标。

  • 通用日志和慢查询日志变量指示通用查询日志和慢查询日志是否启用 (ON) 或禁用 (OFF)。您可以在运行时设置这些变量以控制日志是否启用。

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

  • 要禁用或启用当前会话的通用查询日志,请设置会话 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 转储包括重新创建这些表的语句,以便在重新加载转储文件后它们不会丢失。日志表内容不会被转储。