mysql文件类型-->查询日志文件

来源:互联网 发布:paint it black 编辑:程序博客网 时间:2024/06/06 01:58

Mysql的查询日志有两种,一是慢查询日志,一是通用查询日志,后者记录所有查询的语句。

Mysql的查询日志不仅能记录在日志,还能自动保存到数据库的表对象里。

一. 慢查询日志

慢查询日志:所有查询语句执行时间超过系统变量log_query_time(默认值为10s)指定的参数值,并且访问记录超过min_examined_row_limit(默认值为0)的数量的语句。Sql语句执行时间不超过初始化表锁的开销。

Sql语句执行完毕并且完成对其锁定的资源的释放后,mysqld进程会将符合条件的sql语句写入慢查询日志,因此慢查询日志的顺序有可能跟执行的顺序不同。

默认情况下慢查询日志是被禁用的,启用和禁用慢查询日志通过mysql的系统参数控制

Slow_query_log:指定是否输出慢查询日志

mysql> show variables like 'slow_query_log';+----------------+-------+| Variable_name  | Value |+----------------+-------+| slow_query_log | ON    |+----------------+-------+1 row in set (0.00 sec)

Slow_query_log_file:指定日志文件存储路径和文件名。默认存放文件名为[host-name]-slow.log,保存在mysql数据库data目录下。

mysql> show variables like 'slow_query_log_file';+---------------------+--------------------------+| Variable_name       | Value                    |+---------------------+--------------------------+| slow_query_log_file | /u01/my3306/log/slow.log |+---------------------+--------------------------+1 row in set (0.00 sec)
上述两个参数可以在mysql服务运行时在线修改,不需要重启服务。禁用或启用输出慢查询日志:

mysql> set global slow_query_log='OFF';Query OK, 0 rows affected (0.00 sec)mysql> set global slow_query_log='ON';Query OK, 0 rows affected (0.01 sec)
其他慢查询相关的参数:

Long_query_time:执行慢查询执行时间的阈值,以秒为单位,最小可以指定到微妙,默认为10秒

mysql> show variables like 'long_query_time';+-----------------+----------+| Variable_name   | Value    |+-----------------+----------+| long_query_time | 1.000000 |+-----------------+----------+1 row in set (0.00 sec)

Log_short_format:用来控制输出到慢查询日志的信息,指定该选项后,会减少向慢查询日志中输出的信息

Log_slow_admin_statements:用来控制是否将一些执行时间较长的管理类型语句写入慢查询日志,如OPTIMIZE TABLE、ANALYZE TABLE、ALTER TABLE;

mysql> show variables like 'log_slow_admin_statements';+---------------------------+-------+| Variable_name             | Value |+---------------------------+-------+| log_slow_admin_statements | ON    |+---------------------------+-------+1 row in set (0.00 sec)

Log_queries_not_using_indexes:用来控制是否将未使用索引的语句输出到慢查询日志。

mysql> show variables like 'log_queries_not_using_indexes';+-------------------------------+-------+| Variable_name                 | Value |+-------------------------------+-------+| log_queries_not_using_indexes | OFF   |+-------------------------------+-------+1 row in set (0.00 sec)

Log_throttle_queries_not_using_indexes:与log_queries_not_using_indexes参数组合使用,用来控制每分钟输出到慢查询日志的未使用索引的记录数,默认为0,表示不限制。

mysql> show variables like 'log_throttle_queries_not_using_indexes';+----------------------------------------+-------+| Variable_name                          | Value |+----------------------------------------+-------+| log_throttle_queries_not_using_indexes | 0     |+----------------------------------------+-------+1 row in set (0.00 sec)

Log_slow_slave_statements:mysql复制环境专用的参数,用来控制是否将复制的查询语句输出到慢查询日志

mysql> show variables like 'log_slow_slave_statements'    -> ;+---------------------------+-------+| Variable_name             | Value |+---------------------------+-------+| log_slow_slave_statements | OFF   |+---------------------------+-------+1 row in set (0.00 sec)

结合以上条件,下面的顺序决定了所执行的语句是否输出到慢查询日志中

1. 所执行的必须为查询语句,而非管理性语句,除非启用了log_slow_admin_statements

2. 查询语句执行的时间达到或超过了log_query_time所指定的值,或者是符合log_queries_not_using_indexes条件

3. 查询的记录量达到了min_examined_row_limit参数指定的值

4. 查询语句不违反log_throttle_queries_not_using_indexes参数设置

当然,最重要的前提是mysql启用了慢查询输出

二. 普通查询日志

不仅仅记录查询语句,而是能够记录mysqld进程所做的几乎所有操作,不仅仅是客户端发出的sql语句,对于数据库或对象的管理操作也会记录下来,甚至连客户端连接或断开连接,服务器都会向该文件写入信息。

启用普通查询日志最大的功能是审计,通过浏览这个日志文件,可以了解客户端都做了什么。

默认情况下:普通查询日志不会被启用,因为其记录的信息太过详细,涉及到安全性和效率方面。

普通查询日志通过mysql的系统参数控制,主要有下面两个:

General_log:可选0,1,设置为0表示禁用,也是默认值。1为启用。

mysql> show variables like 'general_log';+---------------+-------+| Variable_name | Value |+---------------+-------+| general_log   | OFF   |+---------------+-------+1 row in set (0.00 sec)

General_log_file:默认情况下普通查询日志保存在mysql数据库的data目录,通过本参数可以控制普通查询日志文件的存储路径和文件名

mysql> show variables like 'general_log_file';+------------------+----------------------------+| Variable_name    | Value                      |+------------------+----------------------------+| general_log_file | /u01/my3306/data/mysql.log |+------------------+----------------------------+1 row in set (0.00 sec)

除了在启动mysql服务 时指定外,这两个参数还可以在mysql服务运行时在线修改,而不需重启mysql服务。

禁用或启用普通查询服务:

mysql> set global general_log=on;Query OK, 0 rows affected (0.32 sec)[mysql@mysql data]$ tail -30f mysql.log /u01/my3306/bin/mysqld, Version: 5.6.36-log (Source distribution). started with:Tcp port: 3306  Unix socket: /u01/my3306/run/mysql.sockTime                 Id Command    Argument171111  5:46:26    10 Connect   root@localhost on                    10 Query     select @@version_comment limit 1171111  5:46:29    10 Query     show databases

如果要启用或禁用某个会话产生的普通查询日志,那么就在会话级sql_log_off参数的值位为off/on来控制,sql_log_off仅作用于当前回话,用户必须要有super权限才能够色会话自该选项。

mysql> set sql_log_off='on';Query OK, 0 rows affected (0.00 sec)

5.6版本之后,对于关系到数据库用户的语句,在记录时都会自动重写,涉及用户密码的部分会自动处理成编码加密后的形式。而如果在启动mysql服务时指定了—log-raw选项,密码就会以原样形式保存。

与慢查询日志不一样,普通查询是以mysql先接收到的语句为顺序。也就是说在遇到锁的情况,后接受的语句也可能会先执行


配置查询日志:

mysql的查询日志不仅可以被保存在文件里,同时也能够以表的形式保存在数据库mysql中的同名表中。但是将查询日志输出到表里面要比输出到文件耗费更多的系统资源,因此对于需要启用查询日志,并希望获得更高的系统性能,建议优先输出到文件。

不过记录到系统表之后,可以通过简单的授权,让所有连接到mysql的用户都能查询到日志中的内容。而且日志表可以通过sql语句访问,进而通过sql语法对日志进行过滤。

Mysql提供有相应的功能选项log_output来控制查询日志的输出方式,即用来决定查询日志保存在操作系统的文件还是保存在数据库系统中的专用表。

--log_put选项有三个值可选:TABLE:输出信息到数据库的日志表,对应general_log和slow_log两个表FILE:输出信息到日志文件,默认值为fileNone:不输出查询日志

上述参数值可以同时制定多个,相互之间以”,”分割,也就是既输出到数据库表也输出到日志文件。

仅启用普通查询日志,并记录到日志文件和日志表:

--log_output=TABLE,FILE –general_log

启用普通日志和慢查询日志,日志记录到数据库表

--log_output=TABLE –general_log –slow_query_log

仅启用慢查询日志,记录到日志文件:

--log_output=FILE –slow_query_low

仅启用慢查询日志,记录到日志文件,并指定输出路径

--log_out_put=FILE –slow_query_log –slow_log_file=/u01/my3306/log/slow.log

注意:当—log_output选项为none时,不管general_log和slow_log两个参数值是什么,都不会再输出查询日志了。

Mysql服务运行时修改:

与查询日志相关的选项可以在mysql服务运行时实时修改,因为这些选项都有同名的系统变量:

Log_outputGeneral_log&slow_query_logGeneral_log_file&slow_query_log_file这几个参数都支持全局动态修改,修改即时生效。
查询日志表的特点:

查询日志表general_log与slow_log与其他普通的表不太一样。

1. 日志表能够CREATETABLE,DROP TABLE,ALTER TABLE,TRUNCATE TABLE操作

2. 默认情况下,日志表使用CSV存储引擎,因此可以直接复制这个表到其他位置,或者导入其他数据库。

mysql> show create table slow_log;+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Table    | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| slow_log | CREATE TABLE `slow_log` (  `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  `user_host` mediumtext NOT NULL,  `query_time` time NOT NULL,  `lock_time` time NOT NULL,  `rows_sent` int(11) NOT NULL,  `rows_examined` int(11) NOT NULL,  `db` varchar(512) NOT NULL,  `last_insert_id` int(11) NOT NULL,  `insert_id` int(11) NOT NULL,  `server_id` int(10) unsigned NOT NULL,  `sql_text` mediumtext NOT NULL,  `thread_id` bigint(21) unsigned NOT NULL) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log' |+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)

从5.1.12版本开始,日志表也可以修改成myiasm引擎。如果要执行alter,drop,等操作,需要先禁用日志功能,而后修改对象,最后再重新启用日志功能。

例如将普通查询日志表general_log变更存储引擎为myisam

mysql> set @old_log_state=@@global.general_log;Query OK, 0 rows affected (0.00 sec)mysql> set global general_log='OFF';Query OK, 0 rows affected (0.00 sec)mysql> alter table mysql.general_log ENGINE=MyISAM;Query OK, 0 rows affected (0.08 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> set GLOBAL general_log=@old_log_state;Query OK, 0 rows affected (0.00 sec)

日志表能支持rename,truncate/check操作

日志表不支持lock_tables操作,并且也不允许用户在其上进行insert,delete,update操作,该表的增删改查是由mysql服务器内部操作的。

Flush tables with read lock以及设置全局变量readonly,均对日志表无效,再次期间MySQL仍能向其中写入数据。

日志表的写操作不会记录二进制日志,同样,如果有复制环境的话,日志表的内容也不会被复制到其他slave节点。

刷新日志表或日志文件,可以使用flush tables或flush logs

不允许在日志表创建分区

Mysql5.6之前,mysqldump命令行工具在处理数据时,会自动忽略general_log和slow_query_log两张表,不过从mysql5.6.6开始,mysqldump命令能够自动查询日志表,不过导出的只有表结构没有数。