MySQL日志


mysql日志的種類,一般來說,日志有五種,分別為:

錯誤日志:-log-err (記錄啟動,運行,停止mysql時出現的信息)

二進制日志:-log-bin (記錄所有更改數據的語句,還用於復制,恢復數據庫用)

查詢日志:-log (記錄建立的客戶端連接和執行的語句)

慢查詢日志: -log-slow-queries (記錄所有執行超過long_query_time秒的所有查詢)

更新日志:     -log-update (二進制日志已經代替了老的更新日志,更新日志在MySQL 5.1中不再使用)

 

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

 

查詢當前日志記錄的狀況: 

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM