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

相關文章
相關標籤/搜索