文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  选择通用查询日志和慢查询日志输出目标

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

如果启用了通用查询日志和慢查询日志,MySQL 服务器可以灵活控制写入这些日志的输出目标。日志条目的可能目标是日志文件或 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 不能用于日志表。

  • INSERT、DELETE 和 UPDATE 不能用于日志表。这些操作仅在服务器内部允许。

  • FLUSH TABLES WITH READ LOCK 和 read_only 系统变量的状态对日志表没有影响。服务器始终可以写入日志表。

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

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

  • 不允许对日志表进行分区。

  • mysqldump 转储包含用于重新创建这些表的语句,以便在重新加载转储文件后它们不会丢失。不会转储日志表内容。