如果启用了MySQL日志服务器,则MySQL Server可以灵活控制写入普通查询日志和慢速查询日志的输出目标。日志条目的可能目标是日志文件或 系统数据库中的general_log和 slow_log表mysql。可以选择文件输出,表输出或两者。
服务器启动时的日志控制
所述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的转储包括报表中重新创建这些表,以便它们不会重新加载转储文件后失踪。日志表的内容不转储。




