目录
如果启用了这些日志,MySQL Server 可以灵活地控制常规查询 log 和慢查询 log 的输出目标。 日志项的可能目标是 log files 或mysql
系统数据库中的general_log
和slow_log
表。可以选择文件输出,table 输出或两者都选。
服务器启动时 Log 控制
log_output系统变量指定 log 输出的目标。设置此变量本身不会启用日志;必须单独启用它们
-
如果在启动时未指定log_output,则默认 logging 目标为
FILE
。 -
如果在启动时指定了log_output,则其 value 是一个列表,从
TABLE
(log 到表),FILE
(log 到 files)或NONE
(不要 log 到表或 files)中选择一个或多个逗号分隔的词。NONE
(如果存在)优先于任何其他说明符。
general_log系统变量控制记录到一般查询日志选定的日志目的地。如果在服务器启动时指定,则general_log采用可选参数 1 或 0 来启用或禁用 log。要指定文件记录默认名称以外的其他文件名称,请设置generallog_log_file变量。类似地,slow_query_log变量控制着将慢速查询日志记录到所选目标的日志中,并且该设置 slow_query_log_file
指定用于文件日志记录的文件名。如果启用了 log,则服务器将打开相应的 log 文件并将启动消息写入其中。但是,如果没有启用,则不会将查询日志记录到文件中。
例子:
-
要将常规查询日志条目写入日志表和日志文件,请使用
--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语句访问。这样可以仅选择满足特定条件的日志条目查询。例如,要选择与特定客户端关联的日志内容(这对于识别来自该客户端的有问题的查询很有用),使用日志表比使用日志文件更容易做到这一点。
-
可以通过可以连接到服务器并发出查询的任何客户端远程访问日志(如果客户端具有适当的日志表特权)。无需登录到服务器主机并直接访问文件系统。
日志表实现具有以下特征:
-
通常,log 表的主要目的是为用户提供一个接口,以观察服务器的运行时执行情况,而不干扰服务器的运行时执行情况。
-
CREATE TABLE
,ALTER TABLE
和DROP TABLE
是对日志表的有效操作。对于ALTER TABLE
和DROP TABLE
,日志表无法使用,必须禁用,如下所述。 -
默认情况下,日志表使用
CSV
以逗号分隔的值格式写入数据的存储引擎。对于有权访问.CSV
包含日志表数据的文件的用户,这些文件很容易导入到其他程序中,例如可以处理CSV输入的电子表格。
可以更改 log 表以使用MyISAM
存储引擎。您不能使用 ALTER TABLE
来更改正在使用的日志表。必须先禁用日志.除CSV
或MyISAM
之外的任何引擎对于 log 表都不合法。
Log Tables and “Too many open files” Errors. 如果选择TABLE
作为日志目标并且日志表使用 CSV
存储引擎,则可能会发现在运行时重复禁用和启用常规查询日志或慢速查询日志.CSV文件
,可能导致“Too many open files”错误.要变通解决此问题,执行 FLUSH TABLES
或确保 open_files_limit
的值大于table_open_cache_instances
的值 。
- 要禁用日志记录,以便您可以更改(或删除)log table,可以使用以下策略。该示例使用常规查询日志;慢查询日志的过程类似,但使用
slow_log
表和slow_querylog系统变量。
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的转储包括报表中重新创建这些表,以便它们不会重新加载转储文件后失踪。日志表的内容不转储。