Selecting General Query Log and Slow Query Log Output Destinations

为一般查询日志和慢查询日志输出指定输出路径

翻译文档链接:https://dev.mysql.com/doc/refman/5.6/en/log-destinations.html

如果一般查询日志和慢查询日志有启用的话,MySQL服务端对这些日志的输出保存位置做了灵活的控制。日志可以保存在文件中或者mysql这个系统数据库的general_log和slow_log表中,而且两者可以共同选择。

在服务端启动时候做日志控制

log_output 这个系统变量可以指定日志输出的目标位置。设置该变量本身不会启用日志;它们必须要分开设置启用(log_ouput只是控制日志设置存储地方,是否启用查询日志和慢查询日志,还要取决于其他的变量的设置)。

  • 如果log_output 在启动的时候默认不指定,默认记录是FILE(文件中)。
  • 如果log_output 在启动的时候指定了,它的值可以是一个或者多个(多个之间使用逗号隔开),值可以是TABLE(表示把日志记录在系统表中),FILE(表示把日志记录在文件中),NONE(不记录日志到表或者文件中)。如果多个值中包含了NONE,不管它出现的前后位置,其优先级要高于FILE和TABLE,即不会把日志记录到文件或者表中,就是不记录。

general_log系统变量控制是否启用一般查询日志(控制记录一般查询日志到指定的目标路径)。如果在服务端启动的时候,general_log可以选择设置为1或者0表示启用或者不启用一般查询日志。如果想要自定义记录到的日志文件名,可以使用general_log_file变量。

同理地,slow_query_log变量控制是否启用慢查询日志。slow_query_log_file用于指定慢查询日志文件的文件名。如果服务端启动了一般查询日志和慢查询日志中的其中任何一个,服务端会打开相应的日志文件,并且会把启动消息记录到日志中。然而,除非选择了记录日志的文件,否则不会进一步记录内容到日志文件中。

例如:

  • 把一般查询日志记录到日志表和日志文件中,使用命令行选择 --log_output=TABLE,FILE指定日志记录到的位置,–general_log来启动一般查询日志的记录功能。
  • 只把一般查询日志和慢查询日志记录到日志表中,使用 --log_output=TABLE来选择记录的目标位置, --general_log和 --slow_query_log来启用一般查询日志和慢查询日志。
  • 只把慢查询日志记录到日志文件中,使用 --log_output=FILE来选定日志记录目标位置,使用 --slow_query_log来启用慢查询日志记录。这种情况中,因为log_output默认设置为FILE,可以不用显式指明–log_output=FILE
在运行时做日志控制

在运行时控制日志记录日志和日志文件相关的系统变量有:

  • 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格式的文件也很容易被导入到其他诸如电子表格(例如excel)这样的能处理CSV格式的程序。

    日志表可以被修改成MyISAM存储引擎。而且日志表在使用过程中,不能使用ALTER TABLE来修改。日志必须首先被禁止。没有比CSV或MyISAM存储引擎更适合做日志表的存储引擎了。(CSV是因为格式比较方便,MyISAM是因为日志表读多写少,这个也视具体情况而言,默认应该是符合这种基准)

  • 为了能够修改(或者删除)日志表,你可以使用以下策略来先关闭日志的记录。案例中是以一般查询日志表设置为说明,对于慢查询日志原理一样,无非是使用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;
    
    #思想是先使用一个变量来存储全局变量的值,然后使用SET语句修改关闭,然后调整之后,然后修改回来。
    
    • 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 不能用于日志表。

    • INSERT, DELETE 以及 UPDATE不能用于日志表。这些操作只在MySQL服务端内部允许的。

    • FLUSH TABLES WITH READ LOCK 以及 read_only系统变量的状态对日志表的记录没有影响。MySQL服务端总是能写日志表。

    • 写入日志表的内容不会写入到二进制日志中,因此,这部分操作并不会同步到从服务器。

    • 刷新日志表或日志文件,分别使用FLUSH TABLES或FLUSH LOGS。

    • 日志表上不允许建分区。

    • 使用mysqldump导出的时候,日志表的内容并不会导出。日志表的表结构语句会被导出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值