MySQL查詢日志總結


 

MySQL查詢日志介紹

 

 

MySQL的查詢日志記錄了所有MySQL數據庫請求的信息。無論這些請求是否得到了正確的執行。默認文件名為hostname.log。默認情況下MySQL查詢日志是關閉的。生產環境,如果開啟MySQL查詢日志,對性能還是有蠻大的影響的。另外很多時候,MySQL慢查詢日志基本可以定位那些出現性能問題的SQL,所以MySQL查詢日志應用的場景其實不多,有點雞肋的感覺,它跟SQL Server中的profiler有點類似,但是這個不能跟蹤某個會話、用戶、客戶端。它只能對整個數據庫進行跟蹤。MySQL查詢日志本身比較簡單,網上介紹的不多,官方資料也就那么短短一篇。

 

 

 

MySQL查詢日志配置

 

 

MySQL中的參數general_log用來控制開啟、關閉MySQL查詢日志,參數general_log_file用來控制查詢日志的位置。所以如果你要判斷MySQL數據庫是否開啟了查詢日志,可以使用下面命令。general_log為ON表示開啟查詢日志,OFF表示關閉查詢日志。

 

mysql> show variables like '%general_log%';
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log      | OFF                          |
| general_log_file | /var/lib/mysql/DB-Server.log |
+------------------+------------------------------+
2 rows in set (0.00 sec)
 
mysql> 

 

 

另外,MySQL的查詢日志支持寫入文件或寫入數據表兩種形式,這個由參數log_output控制,如下所示:

 

 

mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.00 sec)
 
mysql> 

 

這三個參數general_log、 general_log_file、 log_output都是動態參數,可以隨時動態修改。

 

 

1、開啟MySQL查詢日志

 

 

mysql> set global general_log = on;
Query OK, 0 rows affected (0.11 sec)
 
mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log   | ON    |
+---------------+-------+
1 row in set (0.02 sec)
 
mysql> 

 

 

2:關閉MySQL查詢日志

 

mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log   | ON    |
+---------------+-------+
1 row in set (0.01 sec)
 
mysql> set global general_log=off;
Query OK, 0 rows affected (0.01 sec)
 
mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log   | OFF   |
+---------------+-------+
1 row in set (0.00 sec)
 
mysql> 

 

 

 

3:設置日志輸出方式為表(如果設置log_output=table的話,則日志結果會記錄到名為gengera_log的表中,這表的默認引擎是CSV):

 

mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.00 sec)
 
mysql> set global log_output='table';
Query OK, 0 rows affected (0.00 sec)
 
mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | TABLE |
+---------------+-------+
1 row in set (0.01 sec)
 
mysql> 

 

查看查詢日志信息。

 

mysql> select * from mysql.general_log;
+---------------------+---------------------------+-----------+-----------+--------------+----------------------------------+
| event_time          | user_host                 | thread_id | server_id | command_type | argument                         |
+---------------------+---------------------------+-----------+-----------+--------------+----------------------------------+
| 2017-07-06 12:32:05 | root[root] @ localhost [] |         1 |         1 | Query        | show variables like 'general%'   |
| 2017-07-06 12:32:28 | root[root] @ localhost [] |         1 |         1 | Query        | show variables like 'log_output' |
| 2017-07-06 12:32:41 | root[root] @ localhost [] |         1 |         1 | Query        | select * from MyDB.test          |
| 2017-07-06 12:34:36 | [root] @ localhost []     |         3 |         1 | Connect      | root@localhost on                |
| 2017-07-06 12:34:36 | root[root] @ localhost [] |         3 |         1 | Query        | KILL QUERY 1                     |
| 2017-07-06 12:34:36 | root[root] @ localhost [] |         3 |         1 | Quit         |                                  |
| 2017-07-06 12:34:51 | root[root] @ localhost [] |         1 |         1 | Query        | select * from mysql.general_log  |
+---------------------+---------------------------+-----------+-----------+--------------+----------------------------------+
7 rows in set (0.02 sec)
 
mysql> 

 

 

4: 查詢日志歸檔

 

 

mysql> system mv /var/lib/mysql/DB-Server.log  /var/lib/mysql/DB-Server.log.20170706

mysql> system mysqladmin flush-logs -p

Enter password:

 

或者你在shell中執行下面命令

 

[root@DB-Server mysql]# mv /var/lib/mysql/DB-Server.log  /var/lib/mysql/DB-Server.log.20170706

[root@DB-Server mysql]# mysqladmin flush-logs -p

Enter password:

 

 

 

5: 修改查詢日志名稱或位置

 

 

mysql> show variables like 'general_log%';
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log      | ON                           |
| general_log_file | /var/lib/mysql/DB-Server.log |
+------------------+------------------------------+
2 rows in set (0.00 sec)
 
mysql> set global general_log='OFF';
Query OK, 0 rows affected (0.00 sec)
 
mysql> set global general_log_file='/u02/mysql_log.log';
Query OK, 0 rows affected (0.00 sec)
mysql> set global general_log='ON';
Query OK, 0 rows affected (0.02 sec)

 

 

如果你遇到下面類似問題,這個是因為權限問題導致。

 

mysql> set global general_log_file='/u02/mysql_log.log';

ERROR 1231 (42000): Variable 'general_log_file' can't be set to the value of '/u02/mysql_log.log'

 

將對應目錄的owner修改為mysql即可解決問題。如下所示:

 

[root@DB-Server u02]# chown -R mysql:mysql  /u02

 

 

另外,MySQL的查詢日志記錄了所有MySQL數據庫請求的信息。無論這些請求是否得到了正確的執行。這個就是即使我查詢一個不存在的表的SQL,查詢日志依然會記錄。如下測試所示:

 

mysql> select * from MyDB.test1;
ERROR 1146 (42S02): Table 'MyDB.test1' doesn't exist
mysql> select * from MyDB.test2;
+-------+------+
| id    | sex  |
+-------+------+
| 10001 |      |
| 10002 |      |
| 10003 |     |
+-------+------+
3 rows in set (0.07 sec)
 
mysql> select * from MyDB.kkk;
ERROR 1146 (42S02): Table 'MyDB.kkk' doesn't exist
mysql> 

 

 

clip_image001

 

 

MySQL查詢日志的應用場景

 

 

    存在即是合理,既然MySQL提供了查詢日志,那么肯定有其應用的地方。比如,我就遇到這樣一個例子,前陣子碰到別人問mysqlslap壓力測試工具中參數的問題,問題如下: 

 

     -c, --concurrency=name     Number of clients to simulate for query to run.

 

     --number-of-queries=#      Limit each client to this number of queries (this is not exact).

 

   比如我指定:--concurrency=50  --number-of-queries=100, 那么這次測試總的sql執行次數是=100 還是 50*100=5000 ?

 

我們不知道--number-of-queries這個參數代表所有客戶端的執行次數還是每一個客戶端的執行次數,這些英文如果看得不是太明白,那么我們就動手測試一下,這個時候MySQL查詢日志就能發揮其用武之地了。

 

 

[root@DB-Server u02]# mysqlslap -u root -p --concurrency=50 --create-schema='MyDB'  --query='select * from MyDB.test2'  --number-of-queries=100;
 
Enter password: 
 
Benchmark
 
        Average number of seconds to run all queries: 0.023 seconds
 
        Minimum number of seconds to run all queries: 0.023 seconds
 
        Maximum number of seconds to run all queries: 0.023 seconds
 
        Number of clients running queries: 50
 
        Average number of queries per client: 2

 

 

如下所示,我們可以查到這個SQL總共執行了100次,也就是說number-of-queries代表總共要運行多少次查詢。每個客戶運行的查詢數量可以用查詢總數/並發數來計算。--concurrency  表示並發量,也就是模擬多少個客戶端同時執行select。  如果你指定 --number-of-queries=100, --concurrency=50  測試總的SQL執行應該是100

 

 

    clip_image002

 

 

 

參考資料:

 

https://dev.mysql.com/doc/refman/5.6/en/query-log.html


免責聲明!

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



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