5.4.1 选择常规查询日志和慢查询日志输出目标

如果启用了 MySQL 日志,则 MySQL Server 可以灵活控制写入普通查询日志和慢速查询日志的输出目标。日志条目的可能目标是日志文件或mysql系统数据库中的general_logslow_logtable。可以选择文件输出,table 输出或两者。

服务器启动时的日志控制

log_output系统变量指定日志输出的目标。设置此变量本身并不会启用日志。必须分别启用它们。

  • 如果启动时未指定log_output,则默认日志记录目标为FILE

  • 如果在启动时指定了log_output,则其值是一个列 table,该列 table 是从TABLE(登录到 table),FILE(登录到文件)或NONE(不登录到 table 或文件)中选择的一个或多个逗号分隔的单词。 NONE(如果存在)优先于任何其他说明符。

general_log系统变量控制记录到选定查询目标的常规查询日志。如果在服务器启动时指定,则general_log接受可选参数 1 或 0 以启用或禁用日志。要指定文件记录默认名称以外的其他文件名称,请设置general_log_file变量。同样,slow_query_log变量控制将日志记录到慢速查询日志中以选择目标,而设置slow_query_log_file则指定用于文件记录的文件名。如果启用了任何一个日志,则服务器将打开相应的日志文件并向其中写入启动消息。但是,除非选择FILE日志目标,否则不会对文件进行进一步的查询日志记录。

Examples:

  • 要将常规查询日志条目写入日志 table 和日志文件,请使用--log_output=TABLE,FILE选择两个日志目标,并使用--general_log启用常规查询日志。

  • 要将常规查询日志和慢速查询日志条目仅写入日志 table,请使用--log_output=TABLE选择 table 作为日志目标,并使用--general_log--slow_query_log启用这两个日志。

  • 要将慢速查询日志条目仅写入日志文件,请使用--log_output=FILE选择文件作为日志目标,并使用--slow_query_log启用慢速查询日志。在这种情况下,因为默认的日志目标是FILE,所以您可以省略log_output设置。

运行时的日志控制

与日志 table 和文件相关联的系统变量可对日志进行运行时控制:

  • log_output变量指示当前的日志记录目标。可以在运行时对其进行修改以更改目标。

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

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

  • 要禁用或启用当前会话的常规查询日志记录,请将会话sql_log_off变量设置为ONOFF。 (这假定常规查询日志本身已启用.)

日志 table 的优点和 Feature

使用 table 进行日志输出具有以下好处:

  • 日志条目具有标准格式。要显示日志 table 的当前结构,请使用以下语句:
SHOW CREATE TABLE mysql.general_log;
SHOW CREATE TABLE mysql.slow_log;
  • 日志内容可通过 SQL 语句访问。这样可以使用仅选择满足特定条件的日志条目的查询。例如,要选择与特定 Client 端关联的日志内容(这对于识别来自该 Client 端的有问题的查询很有用),使用日志 table 比使用日志文件更容易做到这一点。

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

日志 table 实现具有以下 Feature:

  • 通常,日志 table 的主要目的是为用户提供一个界面,以观察服务器的运行时执行情况,而不干扰服务器的运行时执行情况。

  • CREATE TABLEALTER TABLEDROP TABLE是对日志 table 的有效操作。对于ALTER TABLEDROP TABLE,日志 table 无法使用,必须禁用,如下所述。

  • 默认情况下,日志 table 使用CSV存储引擎,该引擎以逗号分隔的值格式写入数据。对于有权访问包含日志 table 数据的.CSV文件的用户,这些文件很容易导入到其他程序中,例如可以处理 CSVImporting 的电子 table 格。

可以将日志 table 更改为使用MyISAM存储引擎。您不能使用ALTER TABLE来更改正在使用的日志 table。必须先禁用日志。 CSVMyISAM以外的任何引擎均不可用于日志 table。

日志 table 和“打开的文件太多”错误. 如果您选择TABLE作为日志目标并且日志 table 使用CSV存储引擎,则可能会反复禁用和启用常规查询日志或慢速查询日志在运行时会导致.CSV文件的许多打开文件 Descriptors,可能会导致“打开的文件太多”错误。要变通解决此问题,执行FLUSH TABLES或确保open_files_limit的值大于table_open_cache_instances的值。

  • 要禁用日志记录以便您可以更改(或删除)日志 table,可以使用以下策略。该示例使用常规查询日志;慢查询日志的过程与此类似,但使用的是slow_logtable 和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是对日志 table 的有效操作。它可用于使日志条目过期。

  • RENAME TABLE是对日志 table 的有效操作。您可以使用以下策略自动重命名日志 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是对日志 table 的有效操作。

  • LOCK TABLES不能在日志 table 上使用。

  • INSERTDELETEUPDATE不能在日志 table 上使用。这些操作仅在服务器内部允许。

  • 带读取锁的平桌子read_only系统变量的状态对日志 table 没有影响。服务器始终可以写入日志 table。

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

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

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

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