暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

5.4.1选择常规查询日志和慢查询日志输出目标

原创 由迪 2020-07-27
608

如果启用了MySQL日志服务器,则MySQL Server可以灵活控制写入普通查询日志和慢速查询日志的输出目标。日志条目的可能目标是日志文件或 系统数据库中的general_logslow_logmysql。可以选择文件输出,表输出或两者。

服务器启动时的日志控制

所述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变量指示当前的日志记录目标。可以在运行时对其进行修改以更改目标。
  • general_logslow_query_log变量指示一般查询日志和慢查询日志是否已启用(ON)或禁用(OFF)。您可以在运行时设置这些变量,以控制是否启用日志。
  • general_log_fileslow_query_log_file 变量指示一般查询日志和慢查询日志文件的名称。您可以在服务器启动时或在运行时设置这些变量,以更改日志文件的名称。
  • 要禁用或启用当前会话的常规查询日志记录,请将会话sql_log_off变量设置 为 ONOFF。(这假定常规查询日志本身已启用。)

日志表的优点和特征

使用表进行日志输出具有以下好处:

  • 日志条目具有标准格式。要显示日志表的当前结构,请使用以下语句:

    SHOW CREATE TABLE mysql.general_log; SHOW CREATE TABLE mysql.slow_log;
  • 日志内容可通过SQL语句访问。这样可以使用仅选择满足特定条件的日志条目的查询。例如,要选择与特定客户端关联的日志内容(这对于识别来自该客户端的有问题的查询很有用),使用日志表比使用日志文件更容易做到这一点。

  • 可以通过可以连接到服务器并发出查询的任何客户端远程访问日志(如果客户端具有适当的日志表特权)。无需登录到服务器主机并直接访问文件系统。

日志表实现具有以下特征:

  • 通常,日志表的主要目的是为用户提供一个界面,以观察服务器的运行时执行情况,而不干扰服务器的运行时执行情况。

  • CREATE TABLEALTER TABLEDROP TABLE是对日志表的有效操作。对于ALTER TABLEDROP 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 不能在日志表上使用。

  • INSERTDELETEUPDATE不能在日志表上使用。这些操作仅在服务器内部允许。

  • FLUSH TABLES WITH READ LOCKread_only系统变量的状态 对日志表没有影响。服务器始终可以写入日志表。

  • 写入日志表的条目不会写入二进制日志,因此不会复制到副本。

  • 要刷新日志表或日志文件,请分别使用 FLUSH TABLESFLUSH LOGS

  • 不允许对日志表进行分区。

  • 一个mysqldump的转储包括报表中重新创建这些表,以便它们不会重新加载转储文件后失踪。日志表的内容不转储。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论