MySQL日志

<p>MySQL日志</p><p>mysql日志的种类,一般来说,日志有五种,分别为:</p><p>错误日志:-log-err (记录启动,运行,停止mysql时出现的信息)</p><p>二进制日志:-log-bin (记录所有更改数据的语句,还用于复制,恢复数据库用)</p><p>查询日志:-log (记录建立的客户端连接和执行的语句)</p><p>慢查询日志: -log-slow-queries (记录所有执行超过long_query_time秒的所有查询)</p><p>更新日志: -log-update (二进制日志已经代替了老的更新日志,更新日志在MySQL 5.1中不再使用)</p><p>官方文档:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#log-files</p><p>查询当前日志记录的状况:</p><pre class="brush:bash;toolbar:false">mysql&gt;showvariableslike&#39;log_%&#39;;(是否启用了日志) mysql&gt;showmasterstatus;(怎样知道当前的日志) mysql&gt;showmasterlogs;(显示二进制日志的数目)</pre><p></p><p>错误日志<br/></p><p> 错误日志通过记录了MySQL数据库启动关闭信息,以及服务器运行过程中所发生的任何严重的错误信息。通常,当数据库出现问题不能正常启动,应当首先想到的就是查看错误日志。从中可以看到此日志文件记录的MySQL数据库启动和关闭信息。</p><p> --log-error=[file-name]用来指定错误日志存放的位置。<br/></p><p>  如果没有指定[file-name],默认hostname.err(hostname为主机名)做为文件名,默认存放在DATADIR目录中。也可以将log-error配置到my.cnf文件中,这样可省去每次启动mysqld时都手工指定--log-error.<br/></p><p> 在mysql配置文件my.ini中添加:<br/></p><p> log-error = D:\ProgramFiles\MySQL\mysqld.err</p><p> 如果执行了FLUSH LOGS,错误日志文件将被命名为后缀old文件,并且会创建一个新的空文件。</p><p> 错误日志文件的格式:</p><p> 时间 [错误级别] 错误信息</p><p>MySQL客户端可以通过下列方法来获取错误日志的详细位置:</p><p>mysql&gt; show variables like &#39;log_error&#39;;</p><p>+---------------+---------------------------------------------------------------+</p><p>| Variable_name | Value|</p><p>+---------------+---------------------------------------------------------------+</p><p>| log_error | D:\ProgramFiles\MySQL\Data\jevo.err|</p><p>+---------------+---------------------------------------------------------------+</p><p>1 row in set (0.00 sec)</p><p> 错误日志文件的记录级别:</p><p> 错误日志有3个level:error、warning 和information。</p><p>二进制日志</p><p> 参数:–log-bin=[/path_to/file_name] 用来指定二进制日志存放位置</p><p> 启动mysql 的二进制日志步骤如下:</p><p> 1)在配置mysql 的my.ini中添加:</p><p># binary logging - not required for slaves, but recommended</p><p>log-bin=D:\ProgramFiles\MySQL\logbin </p><p> 上面是配置mysql二进制日志存放的目录,在指定路径时要注意以下两点:</p><p> i.在目录的文件夹命名中不能有空格,空格会使访问日志时候会报错;</p><p> ii.指定目录时候一定要以文件名结尾,即不能仅仅指定到文件夹的级别,上面配置logbin,生成的日志文件的名称就是logbin.000001 logbin.000002。。。否则不会有日志文件产生。</p><p> 2)在修改保存mysql.ini后,重启mysql服务。</p><p> 重启后服务器将在D:\ProgramFiles\MySQL 目录下会产生logbin.000001 和 logbin.index 两个文件。</p><p> 二进制日志文件比较大,可以再my.cnf中设置二进制日志文件的过期时间,这样mysql就会自动删除到期的日志文件,节省磁盘空间:</p><p> expire_logs_days=5</p><p> 查看数据库的二进制日志文件名字:</p><p>首先确认你日志是否启用了</p><pre class="brush:bash;toolbar:false">mysql&gt;showvariableslike&#39;log_bin&#39;; +---------------+-------+ |Variable_name|Value| +---------------+-------+ |log_bin|ON| +---------------+-------+ 1rowinset(0.00sec)</pre><p>然后查看二进制日志文件名:</p><pre class="brush:bash;toolbar:false">mysql&gt;showbinarylogs; +---------------+-----------+ |Log_name|File_size| +---------------+-----------+ |logbin.000001|106| +---------------+-----------+ 1rowinset(0.00sec)</pre><p>以后每次对表的相关操作时候,这个File_size都会增大。</p><p>做了几次操作后,它就记录了下来,此时可以使用show binlog events对事件进行回放。</p><pre class="brush:bash;toolbar:false">mysql&gt;insertintotbvalues(2,&#39;bb&#39;,22); mysql&gt;insertintotbvalues(3,&#39;cc&#39;,24); mysql&gt;insertintotbvalues(4,&#39;dd&#39;,26); mysql&gt;showbinarylogs; +---------------+-----------+ |Log_name|File_size| +---------------+-----------+ |logbin.000001|688| +---------------+-----------+ 回放日志事件: mysql&gt;showbinlogevents; +---------------+-----+-------------+-----------+-------------+-------------------------------------------------+ |Log_name|Pos|Event_type|Server_id|End_log_pos|Info| +---------------+-----+-------------+-----------+-------------+-------------------------------------------------+ |logbin.000001|4|Format_desc|1|106|Serverver:5.1.33-community-log,Binlogver:4| |logbin.000001|106|Query|1|176|use`testdb`;BEGIN| |logbin.000001|176|Query|1|273|use`testdb`;insertintotbvalues(2,&#39;bb&#39;,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`;insertintotbvalues(3,&#39;cc&#39;,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`;insertintotbvalues(4,&#39;dd&#39;,26)| |logbin.000001|661|Xid|1|688|COMMIT/*xid=9*/| +---------------+-----+-------------+-----------+-------------+-------------------------------------------------+ 10rowsinset(0.00sec)</pre><p> 二进制日志查看:</p><p> 二进制日志需要借助mysqlbinlog这个工具进行查看,该日志里面记录的所有的DDL和DML语句,但select语句除外。</p><pre class="brush:bash;toolbar:false">bin&gt;mysqlbinlogd:\programfiles\mysql\logbin.000001 /*!40019SET@@session.max_insert_delayed_threads=0*/; /*!50003SET@OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER/*!*/; #at4 #13082313:11:28serverid1end_log_pos106Start:binlogv4,serverv5.1.33-community-logcreated13082313:11:28atstartup #Warning:thisbinlogwasnotclosedproperly.Mostprobablymysqldcrashedwritingit. ROLLBACK/*!*/; BINLOG&#39; AO8WUg8BAAAAZgAAAGoAAAABAAQANS4xLjMzLWNvbW11bml0eS1sb2cAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA7xZSEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC &#39;/*!*/; #at106 #13082313:46:20serverid1end_log_pos176Querythread_id=1exec_time=0error_code=0 usetestdb/*!*/; SETTIMESTAMP=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/*!*/ ; /*!\Cgbk*//*!*/; 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 /*!*/; #at176 #13082313:46:20serverid1end_log_pos273Querythread_id=1exec_time=0error_code=0 SETTIMESTAMP=1377236780/*!*/; insertintotbvalues(2,&#39;bb&#39;,22) /*!*/; #at273 #13082313:46:20serverid1end_log_pos300Xid=7 COMMIT/*!*/; #at300 #13082313:46:36serverid1end_log_pos370Querythread_id=1exec_time=0error_code=0 SETTIMESTAMP=1377236796/*!*/; BEGIN /*!*/; #at370 #13082313:46:36serverid1end_log_pos467Querythread_id=1exec_time=0error_code=0 SETTIMESTAMP=1377236796/*!*/; insertintotbvalues(3,&#39;cc&#39;,24) /*!*/; #at467 #13082313:46:36serverid1end_log_pos494Xid=8 COMMIT/*!*/; #at494 #13082313:46:48serverid1end_log_pos564Querythread_id=1exec_time=0error_code=0 SETTIMESTAMP=1377236808/*!*/; BEGIN /*!*/; #at564 #13082313:46:48serverid1end_log_pos661Querythread_id=1exec_time=0error_code=0 SETTIMESTAMP=1377236808/*!*/; insertintotbvalues(4,&#39;dd&#39;,26) /*!*/; #at661 #13082313:46:48serverid1end_log_pos688Xid=9 COMMIT/*!*/; DELIMITER; #Endoflogfile ROLLBACK/*addedbymysqlbinlog*/; /*!50003SETCOMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;</pre><p></p><p>或者将数据导出到一个文本文件中进行查看,如:</p><p>.\bin&gt;mysqlbinlog --start-position=4 --stop-position=661 d:\programfiles\mysql\logbin.000001 &gt; d:\programfiles\mysql\test.txt</p><p>或者全部导出:</p><p>\bin&gt;mysqlbinlog d:\programfiles\mysql\logbin.000001 &gt; d:\programfiles\mysql\test.txt</p><p>test.txt的文件内容:</p><p>/*!40019 SET @@session.max_insert_delayed_threads=0*/;</p><p>/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;</p><p>DELIMITER /*!*/;</p><p># at 4</p><p>#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</p><p># Warning: this binlog was not closed properly. Most probably mysqld crashed writing it.</p><p>ROLLBACK/*!*/;</p><p>BINLOG &#39;</p><p>AO8WUg8BAAAAZgAAAGoAAAABAAQANS4xLjMzLWNvbW11bml0eS1sb2cAAAAAAAAAAAAAAAAAAAAA</p><p>AAAAAAAAAAAAAAAAAAAA7xZSEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC</p><p>&#39;/*!*/;</p><p># at 106</p><p>#130823 13:46:20 server id 1 end_log_pos 176 Query thread_id=1 exec_time=0 error_code=0</p><p>use testdb/*!*/;</p><p>SET TIMESTAMP=1377236780/*!*/;</p><p>SET @@session.pseudo_thread_id=1/*!*/;</p><p>SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;</p><p>SET @@session.sql_mode=1344274432/*!*/;</p><p>SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;</p><p>/*!\C gbk *//*!*/;</p><p>SET @@session.character_set_client=28,@@session.collation_connection=28,@@session.collation_server=28/*!*/;</p><p>SET @@session.lc_time_names=0/*!*/;</p><p>SET @@session.collation_database=DEFAULT/*!*/;</p><p>BEGIN</p><p>/*!*/;</p><p># at 176</p><p>#130823 13:46:20 server id 1 end_log_pos 273 Query thread_id=1 exec_time=0 error_code=0</p><p>SET TIMESTAMP=1377236780/*!*/;</p><p>insert into tb values(2,&#39;bb&#39;,22)</p><p>/*!*/;</p><p># at 273</p><p>#130823 13:46:20 server id 1 end_log_pos 300 Xid = 7</p><p>COMMIT/*!*/;</p><p># at 300</p><p>#130823 13:46:36 server id 1 end_log_pos 370 Query thread_id=1 exec_time=0 error_code=0</p><p>SET TIMESTAMP=1377236796/*!*/;</p><p>BEGIN</p><p>/*!*/;</p><p># at 370</p><p>#130823 13:46:36 server id 1 end_log_pos 467 Query thread_id=1 exec_time=0 error_code=0</p><p>SET TIMESTAMP=1377236796/*!*/;</p><p>insert into tb values(3,&#39;cc&#39;,24)</p><p>/*!*/;</p><p># at 467</p><p>#130823 13:46:36 server id 1 end_log_pos 494 Xid = 8</p><p>COMMIT/*!*/;</p><p># at 494</p><p>#130823 13:46:48 server id 1 end_log_pos 564 Query thread_id=1 exec_time=0 error_code=0</p><p>SET TIMESTAMP=1377236808/*!*/;</p><p>BEGIN</p><p>/*!*/;</p><p># at 564</p><p>#130823 13:46:48 server id 1 end_log_pos 661 Query thread_id=1 exec_time=0 error_code=0</p><p>SET TIMESTAMP=1377236808/*!*/;</p><p>insert into tb values(4,&#39;dd&#39;,26)</p><p>/*!*/;</p><p>DELIMITER ;</p><p># End of log file</p><p>ROLLBACK /* added by mysqlbinlog */;</p><p>/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;</p><p></p><p>mysqlbinlog 工具除了可以显示记录的二进制结果外,还可以从中恢复数据,详细过程如下:</p><p>先查看相关的tb表,然后将其中的id不为1的数据删除(注意,id不为1的数据已经被记录在二进制日志文件中,见上)</p><p>mysql&gt; select * from tb;</p><p>+----+------------+-----+</p><p>| id | Name | Age |</p><p>+----+------------+-----+</p><p>| 1 | changename | 20 |</p><p>| 2 | bb | 22 |</p><p>| 3 | cc | 24 |</p><p>| 4 | dd | 26 |</p><p>+----+------------+-----+</p><p></p><p>mysql&gt; delete from tb where id &lt;&gt; 1;</p><p>mysql&gt; select * from tb;</p><p>+----+------------+-----+</p><p>| id | Name | Age |</p><p>+----+------------+-----+</p><p>| 1 | changename | 20 |</p><p>+----+------------+-----+</p><p></p><p> 使用mysqlbinlog --start-position=106 --stop-position=661 d:\programfiles\mysql\logbin.000001 | mysql -uroot –p进行数据恢复:</p><p> \bin&gt;mysqlbinlog --start-position=106 --stop-position=661 d:\programfiles\mysql\logbin.000001 | mysql -uroot -p</p><p>Enter password: ********</p><p> 后再查看数据表:</p><p>mysql&gt; select * from tb;</p><p>+----+------------+-----+</p><p>| id | Name | Age |</p><p>+----+------------+-----+</p><p>| 1 | changename | 20 |</p><p>| 2 | bb | 22 |</p><p>| 3 | cc | 24 |</p><p>+----+------------+-----+</p><p></p><p> 注意:这里缺少了最后一条,最因为最后一条记录的commit是在661处,不能使用&#39;mysqlbinlog --start-position=106 d:\programfiles\mysql\logbin.000001 | mysql -uroot –p&#39;,缺少stop-position选项,命令不能插入数据。</p><p> 另外,在日志文件中已经选择了数据库:在106处存在记录 user testdb。</p><p></p><p>或者先导出文件,然后再利用source命令导入数据:</p><p>\bin&gt;mysqlbinlog --start-position=106 --stop-position=661 d:\programfiles\mysql\logbin.000001 &gt;test1.txt</p><p>然后进入MYSQL导入:</p><p> mysql&gt; source c:\\test1.txt</p><p></p><p>还有一种办法是根据日期来恢复</p><p>\bin&gt;mysqlbinlog --start-datetime=&quot;2013-08-23 13:46:00&quot; --stop-datetim=&quot;2013-08-23 13:47:00&quot; d:\programfiles\mysql\logbin.000001 | mysql -uroot -p</p><p>Enter password: ********</p><p> 这样可以把选定时间段中的数据恢复到数据库中。</p><p></p><p>维护二进制日志文件:</p><p> 每次重启服务都会重新生成一个二进制文件,并且文件达到最到限度也会按顺序自动生成下一个文件。因此有必要定期对其进行清理。下面介绍几种方法。</p><p> Option 1. mysql&gt; reset master; (删除所有binlog文件,然后从新生成一个从000001开始的文件)</p><p> Option 2. mysql&gt; purge master logs to &#39;mysql-bin.000017′; (删除mysql-bin.000017之前的所有日志)</p><p> Option 3. # mysqladmin flush-log (根据配置文件my.ini中的expire_logs_day参数,触发日志文件更新,将从当前日期开始前多少天的日志全部删除)</p><p></p><p>在linux下还可以利用linux命令,如:</p><p> //保留最近7天的日志,之前的都删掉</p><p> find /var/intra -type f -mtime +7 -name &quot;*.log&quot; -exec rm -f {} ;</p><p> //用键盘左上角(也就是Esc下面)那个键包围起来,说明是命令。-1d是昨天,以此类推-1m是上个月等等</p><p> day=`/bin/date -v -1d +%Y%m%d`;</p><p> //给文件改名</p><p> mv xxx.log xxx-${day}.log;</p><p></p><p>可以在my.cnf中指定--expire_logs_days=#,此参数设置了binlog日志的过期天数</p><p></p><p>查询日志</p><p> 查询日志记录客户端操作的所有sql语句,包括select查询语句在内。</p><p>注意:由于查询日志纪录了所有数据库的操作,因此对于访问频繁的应用,该日志会对系统性能造成一定影响,通常建议关闭此日志。)</p><p> 参数:–log[=/path_to/file_name] 用来指定错误日志存放位置。</p><p>  如果没有指定[file-name],默认为主机名(hostname)做为文件名,默认存放在DATADIR目录中。</p><p> 也可以将log配置到my.cnf文件中,这样可省去每次启动mysqld时手工指定—log。</p><p>  # The MySQL server</p><p>  [mysqld]</p><p>  ......</p><p>  #query-log</p><p>  log = d:\programfiles\mysql\query_log.log</p><p>  ......</p><p></p><p> 查询日志是纯文本格可,可以使用操作系统的文本读取工具直接打开查看。例如:在linux下可用tail命令查看。</p><p>例:查询日志的记录如下:</p><p>D:\ProgramFiles\MySQL\ bin\mysqld.exe, Version: 5.1.33-community-log (MySQL Community Server (GPL)). started with:</p><p>TCPPort: 3306, Named Pipe: (null)</p><p>Time Id Command Argument</p><p>130823 15:25:33 1 Connect root@localhost on testdb</p><p> 1 Query select * from tb</p><p>130823 15:26:37 1 Query insert into testdb values(5,&#39;ee&#39;,28)</p><p>130823 15:26:43 1 Query SELECT DATABASE()</p><p> 1 Init DB testdb</p><p>130823 15:26:44 1 Query insert into testdb values(5,&#39;ee&#39;,28)</p><p>130823 15:26:50 1 Query insert into tb values(5,&#39;ee&#39;,28)</p><p>注意:即便是执行不成功的操作也会被记录在该文件中。</p><p></p><p>如果是查看当前执行的SQL,还可以在mysql控制台中使用命令进行查看:</p><p> mysql&gt;show processlist;</p><p>也可以使用mysqladmin命令:</p><p> mysqladmin -uroot -p processlist</p><p>如果有 SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的 MySQL 帐户运行的线程)。</p><p> (http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#show-processlist)</p><p>例:</p><p>mysql&gt; show processlist;</p><p>+----+-------+---------------------+--------+---------+------+-------+------------------+</p><p>| Id | User | Host | db | Command | Time | State | Info |</p><p>+----+-------+---------------------+--------+---------+------+-------+------------------+</p><p>| 3 | test4 | xxxx:1419 | NULL | Sleep | 347 | | NULL |</p><p>| 6 | root | localhost:1972 | testdb | Query | 0 | NULL | show processlist |</p><p>+----+-------+---------------------+--------+---------+------+-------+------------------+</p><p>2 rows in set (0.00 sec)</p><p>id :标识。</p><p>User:显示当前用户,如果不是 root ,这个命令就只显示你权限范围内的 sql 语句。</p><p>host :显示这个语句是从哪台机器 的哪一端口上发来的。</p><p>db :显示这个进程连接的是哪一数据库 。</p><p>command :显示当前连接的执行的命令,一般就是休眠( sleep ),查询( query ),连接( connect )。</p><p>time :状态持续的时间,单位是秒。</p><p>state :使用当前连接的 sql 语句的状态,很重要的列,后续会有所有的状态的描述,请注意, state 只是语句执行中的某一个状态,一个 sql 语句,已查询为例,可能需要经过 copying to tmp table , Sorting result , Sending data 等状态才可以完成,</p><p>info :显示这个 sql 语句,由于长度限制,长的 sql 语句会显示不全。</p><p></p><p>关于sql语句状态主要有以下几种:</p><p>Checking table</p><p>正在检查数据表(这是自动的)。</p><p>Closing tables</p><p>正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。</p><p>Connect Out</p><p>复制从服务器正在连接主服务器</p><p>Copying to tmp table on disk</p><p>由于临时结果集大于 tmp_table_size ,正在将临时表从内存存储转为磁盘存储以此节省内存</p><p>Creating tmp table</p><p>正在创建临时表以存放部分查询结果</p><p>deleting from main table</p><p>服务器正在执行多表删除中的第一部分,刚删除第一个表。</p><p>deleting from reference tables</p><p>服务器正在执行多表删除中的第二部分,正在删除其他 表的记录。</p><p>Flushing tables</p><p>正在执行 FLUSH TABLES ,等待其他线程关闭数据表</p><p>Killed</p><p>发送了一个 kill 请求给某线程,那么这个线程将会检查 kill 标志位,同时会放弃下一个 kill 请求。 MySQL 会在每次的主循环中检查 kill 标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么 kill 请求会在锁释放时马上生效。</p><p>Locked</p><p>被其他查询锁住了</p><p>Sending data</p><p>正在处理 SELECT 查询的记录,同时正在把结果发送给客户端</p><p>Sorting for group</p><p>正在为 GROUP BY 做排序</p><p>Sorting for order</p><p>正在为 ORDER BY 做排序</p><p>Opening tables</p><p>这个过程应该会很快,除非受到其他因素的干扰。例如,在执 ALTER TABLE 或 LOCK TABLE 语句行完以前,数据表无法被其他线程打开。 正尝试打开一个表</p><p>Removing duplicates</p><p>正在执行一个 SELECT DISTINCT 方式的查询,但是 MySQL 无法在前一个阶段优化掉那些重复的记录。因此, MySQL 需要再次去掉重复的记录,然后再把结果发送给客户端</p><p>Reopen table</p><p>获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表</p><p>Repair by sorting</p><p>修复指令正在排序以创建索引</p><p>Repair with keycache</p><p>修复指令正在利用索引缓存一个一个地创建新索引。它会比 Repair by sorting 慢些</p><p>Searching rows for update</p><p>正在讲符合条件的记录找出来以备更新。它必须在 UPDATE 要修改相关的记录之前就完成了</p><p>Sleeping</p><p>正在等待客户端发送新请求</p><p>System lock</p><p>正在等待取得一个外部的系统锁。如果当前没有运行多个 mysqld 服务器同时请求同一个表,那么可以通过增加 --skip-external-locking 参数来禁止外部系统锁</p><p>Upgrading lock</p><p>INSERT DELAYED 正在尝试取得一个锁表以插入新记录</p><p>Updating</p><p>正在搜索匹配的记录,并且修改它们</p><p>User Lock</p><p>正在等待 GET_LOCK()</p><p>Waiting for tables</p><p>该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知: FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或 OPTIMIZE TABLE</p><p>waiting for handler insert</p><p>INSERT DELAYED 已经处理完了所有待处理的插入操作,正在等待新的请求</p><p></p><p> </p><p>慢查询日志</p><p> 慢查询日志里记录了执行时间超过long_query_time参数值的sql语句。慢查询日志可以有效的帮助我们发现实际应用中sql的性能问题,找出执行效率低下的sql语句。</p><p> 参数:–log-slow-queries[=/path_to/file_name] 用来指定慢查询日志存放的位置。</p><p>  如果没有指定[file-name],默认为hostname-slow.log做为文件名,默认存放在DATADIR目录中。</p><p>  也可以将log-slow-queries配置到配置文件my.ini(my.cnf)文件中,这样就省去了每次在启动mysqld时都手工指定--log-slow-queries。例如:</p><p> # 执行超过1秒的sql会被log下来</p><p> long_query_time =1</p><p> # 将查询返回较慢的语句进行记录,注意这里要使用//,我设置D:\ProgramFiles\MySQL\slowquery.log时,文件并没有生成</p><p> log-slow-queries=D://ProgramFiles//MySQL//slowquery.log</p><p> 重新启动mysql后,mysql即开始记录slow-log;</p><p></p><p>查看设置:</p><p>mysql&gt; show variables like &#39;long%&#39;; 注:long_query_time变量是定义慢于多少秒的才算&quot;慢查询&quot;</p><p>+-----------------+----------+</p><p>| Variable_name | Value |</p><p>+-----------------+----------+</p><p>| long_query_time | 1.000000 |</p><p>+-----------------+----------+</p><p>1 row in set (0.00 sec)</p><p></p><p>mysql&gt; set long_query_time=1; 注: 设置1, 也就是执行时间超过1秒的都算慢查询。</p><p></p><p>mysql&gt; show variables like &#39;slow%&#39;;</p><p>+---------------------+----------------------------------------+</p><p>| Variable_name | Value |</p><p>+---------------------+----------------------------------------+</p><p>| slow_launch_time | 2 |</p><p>| slow_query_log | ON | 注:是否打开日志记录</p><p>| slow_query_log_file | D://ProgramFiles//MySQL//slowquery.log | 注: 日志文件</p><p>+---------------------+----------------------------------------+</p><p>3 rows in set (0.00 sec)</p><p>mysql&gt; set global slow_query_log=&#39;ON&#39; 注:打开日志记录</p><p>一旦slow_query_log变量被设置为ON,mysql会立即开始记录。</p><p>在MySQL 5.1中,通过--log-slow-admin-statements服务器选项,你可以请求将慢管理语句,例如OPTIMIZE TABLE、ANALYZE TABLE和 ALTER TABLE写入慢查询日志。</p><p>用查询缓存处理的查询不加到慢查询日志中,因为表有零行或一行而不能从索引中受益的查询也不写入慢查询日志。</p><p></p><p>慢查询日志查看:</p><p> 慢查询日志是纯文本格可,可以使用操作系统的文本读取工具直接打开查看。如:</p><p> [mysql@test2]$ cat slow_query_log.log</p><p> </p><p> 如果慢查询日志记录很多可以使用mysqldumpslow进行分类汇总。通过shell直接输入mysqldumpslow /log/slowquery.log 可以获得日志的摘要信息,包括:出现次数(Count)、执行最长时间(Time)、累计总耗费时间(Time)、等待锁的时间(Lock)、发送给客户端的行总数(Rows)、扫描的行总数(Rows)、用户以及sql语句本身。</p><p> 经常使用几个命令</p><p> -s,是order的顺序,主要有c, t, l, r和ac, at, al, ar,分别是按照query次数,查询时间,lock的时间和返回的记录数来排序,前面加了a的代表平均数</p><p> -t, 即top n,返回前面多少条的数据</p><p> -g,后边可以写一个正则匹配模式,大小写不敏感的</p><p> -r Reverse the sort order</p><p>如:/mysqldumpslow -s c -t 10 /log/slowquery.log</p><p> 这会输出记录次数最多的10条SQL语句,其中:-s, 是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙; -t, 是top n的意思,即为返回前面多少条的数据; -g, 后边可以写一个正则匹配模式,大小写不敏感的;</p><p>比如 /mysqldumpslow -s r -t 10 /log/slowquery.log</p><p> 得到返回记录集最多的10个查询。</p><p>/mysqldumpslow -s t -t 10 -g &quot;left join&quot; /log/slowquery.log</p><p> 得到按照时间排序的前10条里面含有左连接的查询语句。</p><p>http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#log-file-maintenance</p>
返回顶部 留言