日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL查询日志总结

發布時間:2025/4/9 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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查询日志总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。