本文將重點介紹MySQL的日誌文件類型,並講解其作用,並結合一定實操演示,相信跟着做下來你會對MySQL有更深的理解。
文件的概念
在開始講MySQL日誌文件之前,首先我們要明確一下文件的概念。MySQL數據庫是存放在硬盤上的,用戶進程通過和一個運行的MySQL實例進程通信(也就是需要一個運行的MySQL服務),通過這個服務去操作磁盤上的MySQL數據庫文件,實現數據存取修改的目的,因此,我們先來看看都有哪些文件。
# 在MySQL登錄狀態下,執行這個命令可以查看我們數據庫主要數據文件的位置
mysql> show variables like 'datadir';
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| datadir | /usr/local/mysql/data/ |
+---------------+------------------------+
# 得知路徑之後在Linux終端進行查看
sudo ls -lh /usr/local/mysql/data/
# 下面是執行了命令之後的部分展示(這裏列出了MySQL的各種日誌文件、索引相關的文件、你建立的數據庫的文件等,先有個概念,等閱讀下面講到的各種文件時可以回上來看一看)
-rw-r----- 1 _mysql _mysql 6.7K 1 19 10:51 binlog.000006
-rw-r----- 1 _mysql _mysql 179B 1 24 15:04 binlog.000007
-rw-r----- 1 _mysql _mysql 48B 1 24 15:05 binlog.index
-rw-r----- 1 _mysql _mysql 4.1K 1 24 15:04 ib_buffer_pool
-rw-r----- 1 _mysql _mysql 48M 2 26 14:06 ib_logfile0
-rw-r----- 1 _mysql _mysql 48M 10 11 11:37 ib_logfile1
drwxr-x--- 5 _mysql _mysql 160B 10 13 15:01 blog
-rw-r----- 1 _mysql _mysql 12M 2 26 14:04 ibdata1
-rw-r----- 1 _mysql _mysql 12M 1 24 15:05 ibtmp1
-rw-r----- 1 _mysql _mysql 180B 3 2 17:28 lilithgamesdeMacBook-Pro-42-slow.log
-rw-r----- 1 _mysql _mysql 249B 3 2 17:55 lilithgamesdeMacBook-Pro-42.log
-rw-r----- 1 _mysql _mysql 24M 2 26 14:04 mysql.ibd
-rw-r----- 1 _mysql _mysql 11K 1 24 15:05 mysqld.local.err
-rw-r----- 1 _mysql _mysql 4B 1 24 15:05 mysqld.local.pid
-rw-r----- 1 _mysql _mysql 16M 2 26 14:06 undo_001
-rw-r----- 1 _mysql _mysql 16M 2 26 14:06 undo_002
參數文件
MySQL登錄狀態下使用show variables
命令查看所有參數(key-value形式),這些參數控制着MySQL的各種狀態屬性。這個命令在我們需要獲取MySQL的各種狀態時會被高頻使用到。
# 查詢所有參數
mysql> show variables;
# 也可以使用like參數指定需要查詢的參數
mysql> show variables like 'warning_count';
# 設置全局參數值,鍵值對的形式
mysql> set global 參數名=參數值
日誌文件
錯誤日誌(error log)
錯誤日誌記錄了MySQL的啓動、運行、關閉的過程。遇到例如MySQL無法正常啓動,可以查看錯誤日誌文件。而且錯誤日誌會記錄MySQL運行過程中的警告(warning),通過查看這些警告⚠️可以針對出現警告的原因進行優化,從而達到優化數據庫的目的。
# 在MySQL登錄狀態下,使用下面命令可以查看error log在服務器上的位置
mysql> show variables like 'log_error';
+---------------+----------------------------------------+
| Variable_name | Value |
+---------------+----------------------------------------+
| log_error | /usr/local/mysql/data/mysqld.local.err |
+---------------+----------------------------------------+
# 然後通過tail -n 50 查看倒數50行的錯誤日誌內容去定位錯誤(不是在MySQL登錄狀態下,而是在Linux用戶態下,sudo獲取訪問權限)
sudo tail -n 50 /usr/local/mysql/data/mysqld.local.err
# 具體日誌內容不作展示
慢查詢日誌(slow query log)
慢查詢日誌的作用是將運行時間超過設定值的所有SQL語句都記錄到慢查詢日誌中,通過定期檢查慢查詢日誌,通過定位到慢SQL語句之後,對其進行分析,是否是因爲索引未生效的等原因導致查詢過慢,可以對查詢過慢的SQL語句進行優化。
# 在MySQL登錄狀態下查看慢查詢日誌閾值,執行時間超過這個值的SQL會被記錄下來
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
# 查詢是否開啓慢查詢日誌(默認關閉)
mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+
# 開啓慢查詢日誌
mysql> set global slow_query_log=on;
一個和慢查詢日誌有關的參數是log_queries_not_using_indexes
,開啓之後。如果運行的SQL沒有使用索引,則MySQL數據庫同樣會將這條SQL語句記錄到慢查詢日誌文件中。
# 查詢是否將未執行索引的SQL加入到慢查詢日誌當中(默認關閉)
mysql> show variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF |
+-------------------------------+-------+
# 開啓參數
mysql> set global log_queries_not_using_indexes=on;
查看慢查詢日誌的路徑,以及通過linux命令查看慢查詢日誌內容。
# 確保在MySQL登錄狀態下
mysql> show variables like 'slow%';
+---------------------+------------------------------------------------------------+
| Variable_name | Value |
+---------------------+------------------------------------------------------------+
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /usr/local/mysql/data/lilithgamesdeMacBook-Pro-42-slow.log |
+---------------------+------------------------------------------------------------+
# 在Linux用戶終端查看慢查詢日誌文件後50頁的內容(這個命令我們在上面查看錯誤日誌的時候也用到了)
sudo tail -n 50 /usr/local/mysql/data/lilithgamesdeMacBook-Pro-42-slow.log
除此之外,MySQL還提供了其他參數用於控制每分鐘允許插入到慢查詢日誌中的未使用索引的SQL的語句次數(防止慢查詢日誌增長過快),以及提供了命令用於篩選慢查詢日誌中的數據,如展示執行時間最長的10條SQL等等功能,在此不多贅述,大家用到時再多作了解。
查詢日誌(log)
查詢日誌記錄了所有MySQL數據庫的請求信息,如論請求是否得到執行。因爲有慢查詢日誌的存在,一般情況下對查詢日誌的使用依賴較小,開啓後也會有一定的性能損耗,默認關閉。
# 查看查詢日誌的開啓狀態和位置
mysql> show variables like 'general_log%';
+------------------+-------------------------------------------------------+
| Variable_name | Value |
+------------------+-------------------------------------------------------+
| general_log | OFF |
| general_log_file | /usr/local/mysql/data/lilithgamesdeMacBook-Pro-42.log |
+------------------+-------------------------------------------------------+
# 開啓查詢日誌
mysql> set global general_log = on;
# 查看查詢日誌文件(在Linux用戶終端,而不是MySQL登錄態)
sudo tail -n 50 /usr/local/mysql/data/lilithgamesdeMacBook-Pro-42.log
二進制日誌(binary log)
二進制日誌記錄了對MySQL數據庫執行更改的所有操作(不包括select和show命令,但這些會被記錄到查詢日誌中)。二進制日誌主要作用有以下幾點:
- 數據恢復:用戶可以通過二進制日誌進行精確的數據恢復。
- 主從複製:通過複製和執行二進制日誌使得一臺遠程的MySQL數據庫與另一臺提供數據的MySQL數據庫進行實時同步。
# 通過命令查看二進制日誌的開啓狀態
mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------------+
| log_bin | ON |
| log_bin_basename | /usr/local/mysql/data/binlog |
| log_bin_index | /usr/local/mysql/data/binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+------------------------------------+
結束語
本文初步介紹了MySQL擁有的日誌文件的類型及其作用,其中慢查詢日誌和二進制日誌兩個點也是面試的高頻重點,因此光掌握到本文講解的程度是略微不夠的,後面的文章我講用例子講述慢查詢日誌定位SQL問題的實操(定位到慢SQL之後就要優化它,那麼就牽扯到索引設置和優化,又是一個重要知識點‼️)和二進制日誌進行數據恢復和同步的實操