如果启用了通用查询日志和慢查询日志,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
不能用于日志表。FLUSH TABLES WITH READ LOCK
和read_only
系统变量的状态对日志表没有影响。服务器始终可以写入日志表。写入日志表的条目不会写入二进制日志,因此不会复制到副本。
要刷新日志表或日志文件,请分别使用
FLUSH TABLES
或FLUSH LOGS
。不允许对日志表进行分区。
mysqldump 转储包含用于重新创建这些表的语句,以便在重新加载转储文件后它们不会丢失。不会转储日志表内容。