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 导出包含重新创建这些表的语句,以便在重新加载导出文件后不会丢失这些表。不会导出日志表内容。