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

来自泡泡学习笔记
跳到导航 跳到搜索

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之外,其他存储引擎都不适用于日志表。

日志表和“Too many open files”错误。如果选择将TABLE作为日志目标,并且日志表使用CSV存储引擎,您可能会发现在运行时反复禁用和启用常规查询日志或慢查询日志会导致.CSV文件的许多打开文件描述符,可能会导致“Too many open files”错误。为解决此问题,请执行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转储文件包括重新创建这些表的语句,以便在重新加载转储文件后不丢失它们。日志表的内容不会被转储。