MySQL日志--查询日志

来源:互联网 发布:网络打印机怎么连接 编辑:程序博客网 时间:2024/04/30 08:17

因为为了性能考虑,一般通用查询日志general log不会开启。slow log可以定位一些有性能问题的sql,而general log会记录所有的SQL

mysql5.0版本,如果要开启slow loggeneral log,需要重启,从MySQL5.1.6版开始,general query logslow query log开始支持写到文件或者数据库表两种方式,并且日志的开启,输出方式的修改,都可以在Global级别动态修改。

 

Mysql可以将某些特定类型的信息已日志文件方式存储起来。但是在默认环境下面是不会开启这些日志的。

 

当一个用户向mysqld进程发出查询,mysqld进程是分为两层的,第一个是把用户的SQL语句通过SQL解释器转换为二进制格式的流,即机器语言。之后对优化器进行访问,优化器看是否当前的缓存里面是否有需要的数据,如果没有就要去物理的空间里面读取,即第二层,对应的各种不同的存储引擎。引擎以各种各样的格式来保存数据。当第一次查询,可能会去对应的存储引擎读取表,读取表的信息缓存起来,当第二个用户使用相同的查询语句,SQL解释器看到是执行过的代码,而且优化器发现内存里面有需要的数据,就直接从内存里面读取。这样就省去了频繁访问磁盘产生的i/o


但是现在开启了日志。

第一种日志,常规查询日志,会记录所以查询的语句,只要是服务器接受客户端的语句。无论是增,删,改,其中的任何一种行为,都会写到查询日志里面。当用户写了一条Insert语句,会把这个信息记录到日志里面。服务器进程将其记录到查询日志。如果用户有做了select,那么会像日志的尾部进行追加,这样下去日志文件会变得非常的大,因为总是不断的在文件的尾部进行添加。如果很多用户,这个日志文件不仅没有提高性能,反而对日志文件产生了i/o,这是不合理的。


查询日志有查询日志使用的途径,查询日志包含了客户端连进来,断开,以及在这个过程当中产生的每一条sql语句,这便于我们去分析。

比如说数据库下面有大量的表,用户对哪些表进行频繁的访问,这样可以开启一天的查询日志,这一天由于产生大量的查询日志,性能会低一点。对这个开启的查询日志的结果拿回去分析可以看到用户绝大部分操作是插入呢还是删除等等。

当然查询日志要去手动开启,默认条件下是不会去开启的,如果默认开启会产生大量的I/O


可以看到在第一行,即查询日志的信息。--log-bin就是二进制格式的日志,--log-slow-queries就是缓慢查询日志。


第一种:在配置文件里面开启查询日志

vim /etc/my.cnf


my.cnf里面进行配置,加上log这一行,代表开启日志文件。上面可以看到有log-bin的开启。

加上log这行之后先不要重新启动Mysql。进入数据目录夹可以查看到


之后重启mysql服务。



重启之后和之前的数据文件进行对比,可以发现多了mysqld.log这个文件。

之后对这个文件进行监控。


因为刚刚创建这个文件里面没有多少消息,通过不断写入sql语句可以监控这个日志。


第二种:通过sql语句开启查询日志功能

设置日志输出方式为文件

mysql> set global log_output=file;

Query OK, 0 rows affected (0.00 sec)

 

 开启general log:

mysql> set global general_log=on;

Query OK, 0 rows affected (0.06 sec)

 

开启之后查看数据目录下面的文件

[root@localhost test]# ls /var/lib/mysql

auto.cnf     ib_logfile1    mysqld-bin.000001  mysql.sock

ibdata1      localhost.log  mysqld-bin.000002  performance_schema

ib_logfile0  mysql          mysqld-bin.index   test

 localhost.log 为查询日志文件。

现在开始监控这个文件

[root@localhost mysql]# tail -f localhost.log

Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock

Time                 Id Command    Argument

171023 17:39:59     2 Quit

171023 17:41:15     3 Connect root@localhost on

    3 Query select @@version_comment limit 1

171023 17:41:26     3 Query set global general_log=off

/usr/sbin/mysqld, Version: 5.6.38 (MySQL Community Server (GPL)). started with:

Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock

Time                 Id Command    Argument

171024  9:19:05     2 Quit

 

 

 

在另外一个终端登入mysql并且进行一系列的操作

[root@localhost test]# mysql

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 3

Server version: 5.6.38 MySQL Community Server (GPL)

 

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

4 rows in set (0.01 sec)

 

mysql> use test;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

mysql> show tables;

+----------------+

| Tables_in_test |

+----------------+

| t              |

+----------------+

1 row in set (0.00 sec)

 

mysql> drop table t;

Query OK, 0 rows affected (0.01 sec)

 

在另外一个监控日志文件的终端可以看到日志文件里面的内容有变化,并且随着查询变化而变化。

/usr/sbin/mysqld, Version: 5.6.38 (MySQL Community Server (GPL)). started with:

Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock

Time                 Id Command    Argument

171024  9:19:05     2 Quit

171024  9:22:36     3 Connect root@localhost on

    3 Query select @@version_comment limit 1

171024  9:23:03     3 Query show databases

171024  9:23:10     3 Query SELECT DATABASE()

    3 Init DB test

    3 Query show databases

    3 Query show tables

    3 Field List t

171024  9:23:15     3 Query show tables

171024  9:23:22     3 Query drop table t

 

 

最后记得将查询日志这个功能关闭

mysql> set global general_log=off;

Query OK, 0 rows affected (0.00 sec)

 

 

通过上面两种开启查询日志的方式可以看到对数据库操作的sql语句都写在这个文件里面。可以通过查询日志分析出哪些是查询,哪些是修改等等。注意如果不需要将这个查询日志关闭,因为会增加磁盘的I/O