MySQL日誌詳解(下篇)
上篇我們講了錯誤日誌和二進位制日誌(Mysql日誌上篇),下篇繼續介紹其他型別日誌
1.MySQL通用查詢日誌(General Query Log)
通用查詢日誌(General Query Log)用來記錄使用者的所有操作,包括啟動和關閉 MySQL 服務、更新語句和查詢語句等。
預設情況下,通用查詢日誌功能是關閉的。可以通過以下命令檢視通用查詢日誌是否開啟,命令如下:
mysql> SHOW VARIABLES LIKE '%general%'; +------------------+----------------------------------------------------------------+ | Variable_name | Value | +------------------+----------------------------------------------------------------+ | general_log | OFF | | general_log_file | C:\ProgramData\MySQL\MySQL Server 5.7\Data\LAPTOP-UHQ6V8KP.log | +------------------+----------------------------------------------------------------+ 2 rows in set, 1 warning (0.01 sec)
從結果可以看出,通用查詢日誌是關閉的,general_log_file 變數指定了通用查詢日誌檔案所在的位置。
啟動和設定通用查詢日誌
在 MySQL 中,可以通過在 MySQL 配置檔案新增 log 選項來開啟通用查詢日誌,格式如下:
[mysqld]
log=dir/filename
其中,dir 引數指定通用查詢日誌的儲存路徑;filename 引數指定日誌的檔名。如果不指定儲存路徑,通用查詢日誌將預設儲存到 MySQL 資料庫的資料資料夾下。如果不指定檔名,預設檔名為 hostname.log,其中 hostname 表示主機名。
檢視通用查詢日誌
如果希望瞭解使用者最近的操作,可以檢視通用查詢日誌。通用查詢日誌以文字檔案的形式儲存,可以使用普通文字檔案檢視該型別日誌內容。
例 1
首先我們檢視通用查詢日誌功能是否是開啟狀態,然後查詢 tb_student 表的記錄,SQL 命令和執行過程如下:
mysql> SHOW VARIABLES LIKE '%general%'; +------------------+----------------------------------------------------------------+ | Variable_name | Value | +------------------+----------------------------------------------------------------+ | general_log | ON | | general_log_file | C:\ProgramData\MySQL\MySQL Server 5.7\Data\LAPTOP-UHQ6V8KP.log | +------------------+----------------------------------------------------------------+ 2 rows in set, 1 warning (0.02 sec) mysql> use test; Database changed mysql> SELECT * FROM tb_student; +----+--------+ | id | name | +----+--------+ | 1 | Java | | 2 | MySQL | | 3 | Python | +----+--------+ 3 rows in set (0.06 sec)
執行成功後,開啟通用查詢日誌,這裡日誌名稱為 LAPTOP-UHQ6V8KP.log,下面是通用查詢日誌中的部分內容。
C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe, Version: 5.7.29-log (MySQL Community Server (GPL)). started with: TCP Port: 3306, Named Pipe: MySQL Time Id Command Argument 2020-05-29T06:43:44.382878Z 7 Quit 2020-05-29T06:44:10.001382Z 8 Connect root@localhost on using SSL/TLS 2020-05-29T06:44:10.007532Z 8 Query select @@version_comment limit 1 2020-05-29T06:44:11.748179Z 8 Query SHOW VARIABLES LIKE '%general%' 2020-05-29T06:44:25.487472Z 8 Query SELECT DATABASE() 2020-05-29T06:44:25.487748Z 8 Init DB test 2020-05-29T06:44:35.390523Z 8 Query SELECT * FROM tb_studentView Code
可以看出,該日誌非常清晰地記錄了客戶端的所有行為。
停止通用查詢日誌
通用查詢日誌啟動後,可以通過兩種方法停止該日誌。一種是將 MySQL 配置檔案中的相關配置註釋掉,然後重啟伺服器,來停止通用查詢日誌。具體內容如下:
[mysqld]
#log=dir\filename
上述方法需要重啟 MySQL 伺服器,這在某些場景,比如有業務量訪問的情況下是不允許的,這時可以通過另一種方法來動態地控制通用查詢日誌的開啟和關閉。
設定 MySQL 的環境變數 general_log 為關閉狀態可以停止該日誌,示例如下:
mysql> SET GLOBAL general_log=off; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE '%general_log%' \G *************************** 1. row *************************** Variable_name: general_log Value: OFF *************************** 2. row *************************** Variable_name: general_log_file Value: C:\ProgramData\MySQL\MySQL Server 5.7\Data\LAPTOP-UHQ6V8KP.log 2 rows in set, 1 warning (0.01 sec)
刪除通用查詢日誌
在 MySQL 中,可以使用 mysqladmin 命令來開啟新的通用查詢日誌。新的通用查詢日誌會直接覆蓋舊的查詢日誌,不需要再手動刪除了。
mysqladmin 命令的語法如下:
mysqladmin -uroot -p flush-logs
需要注意的是,如果希望備份舊的通用查詢日誌,必須先將舊的日誌檔案拷貝出來或者改名。然後,再執行 mysqladmin 命令。
除了上述方法之外,還可以手工刪除通用查詢日誌。刪除之後需要重新啟動 MySQL 服務。重啟之後就會生成新的通用查詢日誌。如果希望備份舊的日誌檔案,可以將舊的日誌檔案改名,然後重啟 MySQL 服務。
由於通用查詢日誌會記錄使用者的所有操作,如果資料庫的使用非常頻繁,通用查詢日誌將會佔用非常大的磁碟空間,對系統性能影響較大。一般情況下,資料管理員可以刪除很長時間之前的通用查詢日誌或關閉此日誌,以保證 MySQL 伺服器上的硬碟空間。
2.MySQL慢查詢日誌(Slow Query Log)
慢查詢日誌用來記錄在 MySQL 中執行時間超過指定時間的查詢語句。通過慢查詢日誌,可以查找出哪些查詢語句的執行效率低,以便進行優化。
通俗的說,MySQL 慢查詢日誌是排查問題的 SQL 語句,以及檢查當前 MySQL 效能的一個重要功能。如果不是調優需要,一般不建議啟動該引數,因為開啟慢查詢日誌會或多或少帶來一定的效能影響。
預設情況下,慢查詢日誌功能是關閉的。可以通過以下命令檢視是否開啟慢查詢日誌功能。命令和執行過程如下:
mysql> SHOW VARIABLES LIKE 'slow_query%'; +---------------------+---------------------------------------------------------------------+ | Variable_name | Value | +---------------------+---------------------------------------------------------------------+ | slow_query_log | OFF | | slow_query_log_file | C:\ProgramData\MySQL\MySQL Server 5.7\Data\LAPTOP-UHQ6V8KP-slow.log | +---------------------+---------------------------------------------------------------------+ 2 rows in set, 1 warning (0.02 sec) mysql> SHOW VARIABLES LIKE 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set, 1 warning (0.01 sec)
引數說明如下:
- slow_query_log:慢查詢開啟狀態
- slow_query_log_file:慢查詢日誌存放的位置(一般設定為 MySQL 的資料存放目錄)
- long_query_time:查詢超過多少秒才記錄
啟動和設定慢查詢日誌
可以通過 log-slow-queries 選項開啟慢查詢日誌。通過 long_query_time 選項來設定時間值,時間以秒為單位。如果查詢時間超過了這個時間值,這個查詢語句將被記錄到慢查詢日誌。
將 log_slow_queries 選項和 long_query_time 選項加入到配置檔案的 [mysqld] 組中。格式如下:
[mysqld] log-slow-queries=dir\filename long_query_time=n
其中:
- dir 引數指定慢查詢日誌的儲存路徑,如果不指定儲存路徑,慢查詢日誌將預設儲存到 MySQL 資料庫的資料資料夾下。
- filename 引數指定日誌的檔名,生成日誌檔案的完整名稱為 filename-slow.log。 如果不指定檔名,預設檔名為 hostname-slow.log,hostname 是 MySQL 伺服器的主機名。
- “n”引數是設定的時間值,該值的單位是秒。如果不設定 long_query_time 選項,預設時間為 10 秒。
還可以通過以下命令啟動慢查詢日誌、設定指定時間:
SET GLOBAL slow_query_log=ON/OFF;
SET GLOBAL long_query_time=n;
檢視慢查詢日誌
如果你想檢視哪些查詢語句的執行效率低,可以從慢查詢日誌中獲得資訊。和錯誤日誌、查詢日誌一樣,慢查詢日誌也是以文字檔案的形式儲存的,可以使用普通的文字檔案檢視工具來檢視。
例 1
開啟 MySQL 慢查詢日誌功能,並設定時間,命令和執行過程如下:
mysql> SET GLOBAL slow_query_log=ON; Query OK, 0 rows affected (0.05 sec) mysql> SET GLOBAL long_query_time=0.001; Query OK, 0 rows affected (0.00 sec)
由於需要演示這裡我們將時間設定為了 0.001 秒,執行時間超過 0.001 秒的 SQL 語句將被記錄到日誌中。
查詢 tb_student 表中的資料,SQL 語句和執行過程如下:
mysql> USE test; Database changed mysql> SELECT * FROM tb_student; +----+--------+ | id | name | +----+--------+ | 1 | Java | | 2 | MySQL | | 3 | Python | +----+--------+ 3 rows in set (0.08 sec)
相應的,慢查詢日誌的部分內容如下:
# Time: 2020-06-01T01:59:18.368780Z # User@Host: root[root] @ localhost [::1] Id: 3 # Query_time: 0.006281 Lock_time: 0.000755 Rows_sent: 2 Rows_examined: 1034 use test; SET timestamp=1590976758; SHOW VARIABLES LIKE 'slow_query%';
刪除慢查詢日誌
慢查詢日誌的刪除方法與通用日誌的刪除方法是一樣的。可以使用 mysqladmin 命令來刪除。也可以使用手工方式來刪除。mysqladmin 命令的語法如下:
mysqladmin -uroot -p flush-logs
執行該命令後,命令列會提示輸入密碼。輸入正確密碼後,將執行刪除操作。新的慢查詢日誌會直接覆蓋舊的查詢日誌,不需要再手動刪除。
資料庫管理員也可以手工刪除慢查詢日誌,刪除之後需要重新啟動 MySQL 服務。
注意:通用查詢日誌和慢查詢日誌都是使用這個命令,使用時一定要注意,一旦執行這個命令,通用查詢日誌和慢查詢日誌都只存在新的日誌檔案中。
如果需要備份舊的慢查詢日誌檔案,必須先將舊的日誌改名,然後重啟 MySQL 服務或執行 mysqladmin 命令。