MySQL查詢日誌介紹html
MySQL的查詢日誌記錄了全部MySQL數據庫請求的信息。不管這些請求是否獲得了正確的執行。默認文件名爲hostname.log。默認狀況下MySQL查詢日誌是關閉的。生產環境,若是開啓MySQL查詢日誌,對性能仍是有蠻大的影響的。另外不少時候,MySQL慢查詢日誌基本能夠定位那些出現性能問題的SQL,因此MySQL查詢日誌應用的場景其實很少,有點雞肋的感受,它跟SQL Server中的profiler有點相似,可是這個不能跟蹤某個會話、用戶、客戶端。它只能對整個數據庫進行跟蹤。MySQL查詢日誌自己比較簡單,網上介紹的很少,官方資料也就那麼短短一篇。mysql
MySQL查詢日誌配置sql
MySQL中的參數general_log用來控制開啓、關閉MySQL查詢日誌,參數general_log_file用來控制查詢日誌的位置。因此若是你要判斷MySQL數據庫是否開啓了查詢日誌,能夠使用下面命令。general_log爲ON表示開啓查詢日誌,OFF表示關閉查詢日誌。shell
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都是動態參數,能夠隨時動態修改。併發
一、開啓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查詢日誌post
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>
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
參考資料:
https://dev.mysql.com/doc/refman/5.6/en/query-log.html