MySQL日志

mysql日志的种类,通常来讲,日志有五种,分别为:html

错误日志:-log-err (记录启动,运行,中止mysql时出现的信息)mysql

二进制日志:-log-bin (记录全部更改数据的语句,还用于复制,恢复数据库用)linux

查询日志:-log (记录创建的客户端链接和执行的语句)sql

慢查询日志: -log-slow-queries (记录全部执行超过long_query_time秒的全部查询)shell

更新日志:     -log-update (二进制日志已经代替了老的更新日志,更新日志在MySQL 5.1中再也不使用)数据库

 

官方文档:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#log-files缓存

 

查询当前日志记录的情况: 服务器

mysql>show variables like 'log_%';(是否启用了日志)session

mysql> show master status;(怎样知道当前的日志)工具

mysql> show master logs;(显示二进制日志的数目)

 

错误日志

       错误日志经过记录了MySQL数据库启动关闭信息,以及服务器运行过程当中所发生的任何严重的错误信息。一般,当数据库出现问题不能正常启动,应当首先想到的就是查看错误日志。从中能够看到此日志文件记录的MySQL数据库启动和关闭信息。

        --log-error=[file-name]用来指定错误日志存放的位置。

  若是没有指定[file-name],默认hostname.err(hostname为主机名)作为文件名,默认存放在DATADIR目录中。也能够将log-error配置到my.cnf文件中,这样可省去每次启动mysqld时都手工指定--log-error.

         在mysql配置文件my.ini中添加:

             log-error = D:\ProgramFiles\MySQL\mysqld.err

         若是执行了FLUSH LOGS,错误日志文件将被命名为后缀old文件,而且会建立一个新的空文件。

         错误日志文件的格式:

               时间  [错误级别]  错误信息

MySQL客户端能够经过下列方法来获取错误日志的详细位置:

mysql> show variables like 'log_error';

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

| Variable_name | Value|

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

| log_error     | D:\ProgramFiles\MySQL\Data\jevo.err|

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

1 row in set (0.00 sec)

  

        错误日志文件的记录级别:

        错误日志有3个level:error、warning 和information。

 

二进制日志

       参数:–log-bin=[/path_to/file_name] 用来指定二进制日志存放位置

        启动mysql 的二进制日志步骤以下:

        1)在配置mysql 的my.ini中添加:

# binary logging - not required for slaves, but recommended

log-bin=D:\ProgramFiles\MySQL\logbin

        

       上面是配置mysql二进制日志存放的目录,在指定路径时要注意如下两点:

       i.在目录的文件夹命名中不能有空格,空格会使访问日志时候会报错;

       ii.指定目录时候必定要以文件名结尾,即不能仅仅指定到文件夹的级别,上面配置logbin,生成的日志文件的名称就是logbin.000001 logbin.000002。。。不然不会有日志文件产生。

 

        2)在修改保存mysql.ini后,重启mysql服务。

        重启后服务器将在D:\ProgramFiles\MySQL 目录下会产生logbin.000001 和 logbin.index 两个文件。

 

        二进制日志文件比较大,能够再my.cnf中设置二进制日志文件的过时时间,这样mysql就会自动删除到期的日志文件,节省磁盘空间:

          expire_logs_days=5

 

 

        查看数据库的二进制日志文件名字:

首先确认你日志是否启用了

mysql> show variables like 'log_bin';

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

| Variable_name | Value |

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

| log_bin       | ON   |

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

1 row in set (0.00 sec)

而后查看二进制日志文件名:

mysql> show binary logs;

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

| Log_name      | File_size |

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

| logbin.000001 |       106 |

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

1 row in set (0.00 sec)

之后每次对表的相关操做时候,这个File_size都会增大。

作了几回操做后,它就记录了下来,此时可使用show binlog events对事件进行回放。

mysql> insert into tb values(2,'bb',22);

mysql> insert into tb values(3,'cc',24);

mysql> insert into tb values(4,'dd',26);

 

mysql> show binary logs;

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

| Log_name      | File_size |

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

| logbin.000001 |       688 |

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

        回放日志事件:

mysql> show binlog events;

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

| Log_name      | Pos | Event_type  | Server_id | End_log_pos | Info                                |

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

| logbin.000001 |   4 | Format_desc |         1 |         106 | Server ver: 5.1.33-community-log, Binlog ver: 4 |

| logbin.000001 | 106 | Query       |         1 |         176 | use `testdb`; BEGIN                             |

| logbin.000001 | 176 | Query       |         1 |         273 | use `testdb`; insert into tb values(2,'bb',22)  |

| logbin.000001 | 273 | Xid         |         1 |         300 | COMMIT /* xid=7*/                              |

| logbin.000001 | 300 | Query       |         1 |         370 | use `testdb`; BEGIN                             |

| logbin.000001 | 370 | Query       |         1 |         467 | use `testdb`; insert into tb values(3,'cc',24)  |

| logbin.000001 | 467 | Xid         |         1 |         494 | COMMIT /* xid=8*/                              |

| logbin.000001 | 494 | Query       |         1 |         564 | use `testdb`; BEGIN                             |

| logbin.000001 | 564 | Query       |         1 |         661 | use `testdb`; insert into tb values(4,'dd',26)  |

| logbin.000001 | 661 | Xid         |         1 |         688 | COMMIT /* xid=9*/                              |

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

10 rows in set (0.00 sec)

       二进制日志查看:

       二进制日志须要借助mysqlbinlog这个工具进行查看,该日志里面记录的全部的DDL和DML语句,但select语句除外。

bin> mysqlbinlog d:\programfiles\mysql\logbin.000001

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 4

#130823 13:11:28 server id 1  end_log_pos 106   Start: binlog v 4, server v 5.1.33-community-log created 130823 13:11:28 at startup

# Warning: this binlog was not closed properly. Most probably mysqld crashed writing it.

ROLLBACK/*!*/;

BINLOG '

AO8WUg8BAAAAZgAAAGoAAAABAAQANS4xLjMzLWNvbW11bml0eS1sb2cAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAA7xZSEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC

'/*!*/;

# at 106

#130823 13:46:20 server id 1  end_log_pos 176   Query   thread_id=1     exec_time=0     error_code=0

use testdb/*!*/;

SET TIMESTAMP=1377236780/*!*/;

SET @@session.pseudo_thread_id=1/*!*/;

SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;

SET @@session.sql_mode=1344274432/*!*/;

SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/

;

/*!\C gbk *//*!*/;

SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=28/*!*/;

SET @@session.lc_time_names=0/*!*/;

SET @@session.collation_database=DEFAULT/*!*/;

BEGIN

/*!*/;

# at 176

#130823 13:46:20 server id 1  end_log_pos 273   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1377236780/*!*/;

insert into tb values(2,'bb',22)

/*!*/;

# at 273

#130823 13:46:20 server id 1  end_log_pos 300   Xid = 7

COMMIT/*!*/;

# at 300

#130823 13:46:36 server id 1  end_log_pos 370   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1377236796/*!*/;

BEGIN

/*!*/;

# at 370

#130823 13:46:36 server id 1  end_log_pos 467   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1377236796/*!*/;

insert into tb values(3,'cc',24)

/*!*/;

# at 467

#130823 13:46:36 server id 1  end_log_pos 494   Xid = 8

COMMIT/*!*/;

# at 494

#130823 13:46:48 server id 1  end_log_pos 564   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1377236808/*!*/;

BEGIN

/*!*/;

# at 564

#130823 13:46:48 server id 1  end_log_pos 661   Query   thread_id=1     exec_time=0     error_code=0

SET TIMESTAMP=1377236808/*!*/;

insert into tb values(4,'dd',26)

/*!*/;

# at 661

#130823 13:46:48 server id 1  end_log_pos 688   Xid = 9

COMMIT/*!*/;

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

 

或者将数据导出到一个文本文件中进行查看,如:

.\bin>mysqlbinlog --start-position=4 --stop-position=661 d:\programfiles\mysql\logbin.000001 > d:\programfiles\mysql\test.txt

或者所有导出:

\bin>mysqlbinlog d:\programfiles\mysql\logbin.000001 > d:\programfiles\mysql\test.txt

test.txt的文件内容:

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 4

#130823 13:11:28 server id 1  end_log_pos 106          Start: binlog v 4, server v 5.1.33-community-log created 130823 13:11:28 at startup

# Warning: this binlog was not closed properly. Most probably mysqld crashed writing it.

ROLLBACK/*!*/;

BINLOG '

AO8WUg8BAAAAZgAAAGoAAAABAAQANS4xLjMzLWNvbW11bml0eS1sb2cAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAA7xZSEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC

'/*!*/;

# at 106

#130823 13:46:20 server id 1  end_log_pos 176          Query     thread_id=1          exec_time=0         error_code=0

use testdb/*!*/;

SET TIMESTAMP=1377236780/*!*/;

SET @@session.pseudo_thread_id=1/*!*/;

SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;

SET @@session.sql_mode=1344274432/*!*/;

SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;

/*!\C gbk *//*!*/;

SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=28/*!*/;

SET @@session.lc_time_names=0/*!*/;

SET @@session.collation_database=DEFAULT/*!*/;

BEGIN

/*!*/;

# at 176

#130823 13:46:20 server id 1  end_log_pos 273          Query     thread_id=1          exec_time=0         error_code=0

SET TIMESTAMP=1377236780/*!*/;

insert into tb values(2,'bb',22)

/*!*/;

# at 273

#130823 13:46:20 server id 1  end_log_pos 300          Xid = 7

COMMIT/*!*/;

# at 300

#130823 13:46:36 server id 1  end_log_pos 370          Query     thread_id=1          exec_time=0         error_code=0

SET TIMESTAMP=1377236796/*!*/;

BEGIN

/*!*/;

# at 370

#130823 13:46:36 server id 1  end_log_pos 467          Query     thread_id=1          exec_time=0         error_code=0

SET TIMESTAMP=1377236796/*!*/;

insert into tb values(3,'cc',24)

/*!*/;

# at 467

#130823 13:46:36 server id 1  end_log_pos 494          Xid = 8

COMMIT/*!*/;

# at 494

#130823 13:46:48 server id 1  end_log_pos 564          Query     thread_id=1          exec_time=0         error_code=0

SET TIMESTAMP=1377236808/*!*/;

BEGIN

/*!*/;

# at 564

#130823 13:46:48 server id 1  end_log_pos 661          Query     thread_id=1          exec_time=0         error_code=0

SET TIMESTAMP=1377236808/*!*/;

insert into tb values(4,'dd',26)

/*!*/;

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

 

mysqlbinlog 工具除了能够显示记录的二进制结果外,还能够从中恢复数据,详细过程以下:

先查看相关的tb表,而后将其中的id不为1的数据删除(注意,id不为1的数据已经被记录在二进制日志文件中,见上)

mysql> select * from tb;

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

| id | Name       | Age |

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

|  1 | changename |  20 |

|  2 | bb         |  22 |

|  3 | cc         |  24 |

|  4 | dd         |  26 |

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

 

mysql> delete from tb where id <> 1;

mysql> select * from tb;

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

| id | Name       | Age |

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

|  1 | changename |  20 |

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

 

        使用mysqlbinlog --start-position=106 --stop-position=661 d:\programfiles\mysql\logbin.000001 | mysql -uroot –p进行数据恢复:

        \bin>mysqlbinlog --start-position=106 --stop-position=661 d:\programfiles\mysql\logbin.000001 | mysql -uroot -p

Enter password: ********

     后再查看数据表:

mysql> select * from tb;

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

| id | Name       | Age |

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

|  1 | changename |  20 |

|  2 | bb         |  22 |

|  3 | cc         |  24 |

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

 

        注意:这里缺乏了最后一条,最由于最后一条记录的commit是在661处,不能使用‘mysqlbinlog --start-position=106 d:\programfiles\mysql\logbin.000001 | mysql -uroot –p’,缺乏stop-position选项,命令不能插入数据。

               另外,在日志文件中已经选择了数据库:在106处存在记录 user testdb。

 

或者先导出文件,而后再利用source命令导入数据:

\bin>mysqlbinlog --start-position=106 --stop-position=661 d:\programfiles\mysql\logbin.000001 >test1.txt

而后进入MYSQL导入:

    mysql> source c:\\test1.txt

 

还有一种办法是根据日期来恢复

\bin>mysqlbinlog --start-datetime="2013-08-23 13:46:00" --stop-datetim="2013-08-23 13:47:00" d:\programfiles\mysql\logbin.000001 | mysql -uroot -p

Enter password: ********

        这样能够把选定时间段中的数据恢复到数据库中。

 

维护二进制日志文件:

        每次重启服务都会从新生成一个二进制文件,而且文件达到最到限度也会按顺序自动生成下一个文件。所以有必要按期对其进行清理。下面介绍几种方法。

       Option 1. mysql> reset master;    (删除全部binlog文件,而后重新生成一个从000001开始的文件)

        Option 2. mysql> purge master logs to ‘mysql-bin.000017′;    (删除mysql-bin.000017以前的全部日志)

        Option 3. # mysqladmin flush-log    (根据配置文件my.ini中的expire_logs_day参数,触发日志文件更新,将从当前日期开始前多少天的日志所有删除)

 

在linux下还能够利用linux命令,如:

        //保留最近7天的日志,以前的都删掉

        find /var/intra -type f -mtime +7 -name "*.log" -exec rm -f {} ;

        //用键盘左上角(也就是Esc下面)那个键包围起来,说明是命令。-1d是昨天,以此类推-1m是上个月等等

        day=`/bin/date -v -1d +%Y%m%d`;

        //给文件更名

         mv xxx.log xxx-${day}.log;

 

能够在my.cnf中指定--expire_logs_days=#,此参数设置了binlog日志的过时天数

 

查询日志

       查询日志记录客户端操做的全部sql语句,包括select查询语句在内。

注意:因为查询日志纪录了全部数据库的操做,所以对于访问频繁的应用,该日志会对系统性能形成必定影响,一般建议关闭此日志。)

      参数:–log[=/path_to/file_name]  用来指定错误日志存放位置。

   若是没有指定[file-name],默认为主机名(hostname)作为文件名,默认存放在DATADIR目录中。

       也能够将log配置到my.cnf文件中,这样可省去每次启动mysqld时手工指定—log。

  # The MySQL server

  [mysqld]

  ......

  #query-log

  log = d:\programfiles\mysql\query_log.log

  ......

 

        查询日志是纯文本格可,可使用操做系统的文本读取工具直接打开查看。例如:在linux下可用tail命令查看。

例:查询日志的记录以下:

D:\ProgramFiles\MySQL\ bin\mysqld.exe, Version: 5.1.33-community-log (MySQL Community Server (GPL)). started with:

TCPPort: 3306, Named Pipe: (null)

Time                 Id Command    Argument

130823 15:25:33    1 Connect          root@localhost on testdb

                                    1 Query              select * from tb

130823 15:26:37    1 Query              insert into testdb values(5,'ee',28)

130823 15:26:43    1 Query              SELECT DATABASE()

                                    1 Init DB           testdb

130823 15:26:44    1 Query              insert into testdb values(5,'ee',28)

130823 15:26:50    1 Query              insert into tb values(5,'ee',28)

注意:即使是执行不成功的操做也会被记录在该文件中。

 

若是是查看当前执行的SQL,还能够在mysql控制台中使用命令进行查看:

         mysql>show processlist;

也可使用mysqladmin命令:

         mysqladmin -uroot -p processlist

若是有 SUPER 权限,则能够看到所有的线程,不然,只能看到本身发起的线程(这是指,当前对应的 MySQL 账户运行的线程)。

         (http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#show-processlist)

例:

mysql> show processlist;

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

| Id | User  | Host                | db     | Command | Time | State | Info        |

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

|  3 | test4 | xxxx:1419 | NULL   | Sleep   |  347 |       | NULL        |

|  6 | root  | localhost:1972      | testdb | Query   |    0 | NULL  | show processlist |

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

2 rows in set (0.00 sec)

id :标识。

User:显示当前用户,若是不是 root ,这个命令就只显示你权限范围内的 sql 语句。

host :显示这个语句是从哪台机器 的哪一端口上发来的。

db :显示这个进程链接的是哪一数据库

command :显示当前链接的执行的命令,通常就是休眠( sleep ),查询( query ),链接( connect )。

time :状态持续的时间,单位是秒。

state :使用当前链接的 sql 语句的状态,很重要的列,后续会有全部的状态的描述,请注意, state 只是语句执行中的某一个状态,一个 sql 语句,已查询为例,可能须要通过 copying to tmp table , Sorting result , Sending data 等状态才能够完成,

info :显示这个 sql 语句,因为长度限制,长的 sql 语句会显示不全。

 

关于sql语句状态主要有如下几种:

Checking table

正在检查数据表(这是自动的)。

Closing tables

正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操做,若是不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。

Connect Out

复制从服务器正在链接主服务器

Copying to tmp table on disk

因为临时结果集大于 tmp_table_size ,正在将临时表从内存存储转为磁盘存储以此节省内存

Creating tmp table

正在建立临时表以存放部分查询结果

deleting from main table

服务器正在执行多表删除中的第一部分,刚删除第一个表。

deleting from reference tables

服务器正在执行多表删除中的第二部分,正在删除其余 表的记录。

Flushing tables

正在执行 FLUSH TABLES ,等待其余线程关闭数据表

Killed

发送了一个 kill 请求给某线程,那么这个线程将会检查 kill 标志位,同时会放弃下一个 kill 请求。 MySQL 会在每次的主循环中检查 kill 标志位,不过有些状况下该线程可能会过一小段才能死掉。若是该线程程被其余线程锁住了,那么 kill 请求会在锁释放时立刻生效。

Locked

被其余查询锁住了

Sending data

正在处理 SELECT 查询的记录,同时正在把结果发送给客户端

Sorting for group

正在为 GROUP BY 作排序

Sorting for order

正在为 ORDER BY 作排序

Opening tables

这个过程应该会很快,除非受到其余因素的干扰。例如,在执 ALTER TABLE 或 LOCK TABLE 语句行完之前,数据表没法被其余线程打开。 正尝试打开一个表

Removing duplicates

正在执行一个 SELECT DISTINCT 方式的查询,可是 MySQL 没法在前一个阶段优化掉那些重复的记录。所以, MySQL 须要再次去掉重复的记录,而后再把结果发送给客户端

Reopen table

得到了对一个表的锁,可是必须在表结构修改以后才能得到这个锁。已经释放锁,关闭数据表,正尝试从新打开数据表

Repair by sorting

修复指令正在排序以建立索引

Repair with keycache

修复指令正在利用索引缓存一个一个地建立新索引。它会比 Repair by sorting 慢些

Searching rows for update

正在讲符合条件的记录找出来以备更新。它必须在 UPDATE 要修改相关的记录以前就完成了

Sleeping

正在等待客户端发送新请求

System lock

正在等待取得一个外部的系统锁。若是当前没有运行多个 mysqld 服务器同时请求同一个表,那么能够经过增长 --skip-external-locking 参数来禁止外部系统锁

Upgrading lock

INSERT DELAYED 正在尝试取得一个锁表以插入新记录

Updating

正在搜索匹配的记录,而且修改它们

User Lock

正在等待 GET_LOCK()

Waiting for tables

该线程获得通知,数据表结构已经被修改了,须要从新打开数据表以取得新的结构。而后,为了能的从新打开数据表,必须等到全部其余线程关闭这个表。如下几种状况下会产生这个通知: FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或 OPTIMIZE TABLE

waiting for handler insert

INSERT DELAYED 已经处理完了全部待处理的插入操做,正在等待新的请求

 

 

慢查询日志

        慢查询日志里记录了执行时间超过long_query_time参数值的sql语句。慢查询日志能够有效的帮助咱们发现实际应用中sql的性能问题,找出执行效率低下的sql语句。

        参数:–log-slow-queries[=/path_to/file_name]       用来指定慢查询日志存放的位置。

  若是没有指定[file-name],默认为hostname-slow.log作为文件名,默认存放在DATADIR目录中。

  也能够将log-slow-queries配置到配置文件my.ini(my.cnf)文件中,这样就省去了每次在启动mysqld时都手工指定--log-slow-queries。例如:

              # 执行超过1秒的sql会被log下来

              long_query_time =1

              # 将查询返回较慢的语句进行记录,注意这里要使用//,我设置D:\ProgramFiles\MySQL\slowquery.log时,文件并无生成

              log-slow-queries=D://ProgramFiles//MySQL//slowquery.log

          从新启动mysql后,mysql即开始记录slow-log;

 

查看设置:

mysql> show variables like 'long%';  注:long_query_time变量是定义慢于多少秒的才算“慢查询”

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

| Variable_name   | Value    |

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

| long_query_time | 1.000000 |

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

1 row in set (0.00 sec)

 

mysql> set long_query_time=1;   注: 设置1, 也就是执行时间超过1秒的都算慢查询。

 

mysql> show variables like 'slow%';

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

| Variable_name       | Value                                  |

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

| slow_launch_time    | 2                                      |

| slow_query_log      | ON                                     |                                       注:是否打开日志记录

| slow_query_log_file | D://ProgramFiles//MySQL//slowquery.log |           注: 日志文件

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

3 rows in set (0.00 sec)


mysql> set global slow_query_log='ON'   注:打开日志记录

一旦slow_query_log变量被设置为ON,mysql会当即开始记录。

在MySQL 5.1中,经过--log-slow-admin-statements服务器选项,你能够请求将慢管理语句,例如OPTIMIZE TABLE、ANALYZE TABLE和 ALTER TABLE写入慢查询日志。

用查询缓存处理的查询不加到慢查询日志中,由于表有零行或一行而不能从索引中受益的查询也不写入慢查询日志。

 

慢查询日志查看:

        慢查询日志是纯文本格可,可使用操做系统的文本读取工具直接打开查看。如:

          [mysql@test2]$ cat slow_query_log.log

       

        若是慢查询日志记录不少可使用mysqldumpslow进行分类汇总。经过shell直接输入mysqldumpslow /log/slowquery.log 能够得到日志的摘要信息,包括:出现次数(Count)、执行最长时间(Time)、累计总耗费时间(Time)、等待锁的时间(Lock)、发送给客户端的行总数(Rows)、扫描的行总数(Rows)、用户以及sql语句自己。

        常用几个命令

    -s,是order的顺序,主要有c, t, l, r和ac, at, al, ar,分别是按照query次数,查询时间,lock的时间和返回的记录数来排序,前面加了a的表明平均数

    -t, 即top n,返回前面多少条的数据

    -g,后边能够写一个正则匹配模式,大小写不敏感的

    -r     Reverse the sort order

如:/mysqldumpslow -s c -t 10 /log/slowquery.log
        这会输出记录次数最多的10条SQL语句,其中:-s, 是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙; -t, 是top n的意思,即为返回前面多少条的数据; -g, 后边能够写一个正则匹配模式,大小写不敏感的;

好比  /mysqldumpslow -s r -t 10 /log/slowquery.log
       获得返回记录集最多的10个查询。
/mysqldumpslow -s t -t 10 -g “left join” /log/slowquery.log
       获得按照时间排序的前10条里面含有左链接的查询语句。

http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#log-file-maintenance

相关文章
相关标签/搜索