1. 程式人生 > 其它 >MySQL日誌詳解(下篇)

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_student
View 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 命令。