關注微信公眾號【程式設計師白澤】,進入白澤的知識分享星球?
前言
上週五面試了位元組的第三面,深感資料庫知識的重要,我也意識到在平時的學習中,自己對於資料庫的學習較為薄弱。甚至在有過一定實習經驗之後,依舊因為開發分工的原因,對資料庫方面的知識掌握依舊不多。我也相信,很多人對MySQL的索引
、日誌
、多版本併發控制
、ACID
等等都只停留在八股文的階段。
因此我打算接下來一段時間潛心學習一下MySQL資料庫相關的知識點,寫作一系列MySQL相關的文章,並且配合實操,希望等這個系列完成之後,可以將MySQL所有重要的知識點全部覆蓋,下一次直接對線面試官。
作為系列地第一篇文章,本文將重點介紹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之後就要優化它,那麼就牽扯到索引設定和優化,又是一個重要知識點‼️)和二進位制日誌進行資料恢復和同步的實操(也是很重要的知識點‼️)。
八股文不是學習的終點,而是一個提綱,是我們學習的起點~
建了一個春秋招備戰/內推/閒聊群,歡迎大家加入。
關注公眾號【程式設計師白澤】,帶你走近一個有點話癆的程式設計師/學生黨。