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
指示当前的日志目标。可以在运行时修改它以更改目标。 -
通用日志和慢查询日志变量指示通用查询日志和慢查询日志是否启用 (
ON
) 或禁用 (OFF
)。您可以在运行时设置这些变量以控制日志是否启用。 -
通用日志文件和慢查询日志文件变量指示通用查询日志和慢查询日志文件的名称。您可以在服务器启动或运行时设置这些变量以更改日志文件的名称。
-
要禁用或启用当前会话的通用查询日志,请设置会话
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
不能用于日志表。 -
FLUSH TABLES WITH READ LOCK
和read_only
系统变量对日志表没有影响。服务器总是可以写入日志表。 -
写入日志表的条目不会写入二进制日志,因此不会复制到副本中。
-
要刷新日志表或日志文件,请使用
FLUSH TABLES
或FLUSH LOGS
,分别。 -
日志表不允许分区。
-
一个 mysqldump 转储包括重新创建这些表的语句,以便在重新加载转储文件后它们不会丢失。日志表内容不会被转储。