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 existmysql> 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 existmysql>?
?
?
?
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
轉載于:https://www.cnblogs.com/kerrycode/p/7130403.html
總結
以上是生活随笔為你收集整理的MySQL查询日志总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程-Thread-Runnable
- 下一篇: 记一次死锁问题的排查和解决