MySQL裡的那些日誌們

愛笑的Gao發表於2022-02-15

該系列博文會告訴你如何從入門到進階,從sql基本的使用方法,從MySQL執行引擎再到索引、事務等知識,一步步地學習MySQL相關技術的實現原理,更好地瞭解如何基於這些知識來優化sql,減少SQL執行時間,通過執行計劃對SQL效能進行分析,再到MySQL的主從複製、主備部署等內容,以便讓你更完整地瞭解整個MySQL方面的技術體系,形成自己的知識框架。

Table of Contents

重新學習MySQL資料庫10:MySQL裡的那些日誌們

同大多數關係型資料庫一樣,日誌檔案是MySQL資料庫的重要組成部分。MySQL有幾種不同的日誌檔案,通常包括錯誤日誌檔案,二進位制日誌,通用日誌,慢查詢日誌,等等。這些日誌可以幫助我們定位mysqld內部發生的事件,資料庫效能故障,記錄資料的變更歷史,使用者恢復資料庫等等。本文主要描述錯誤日誌檔案。

1.MySQL日誌檔案系統的組成

a、錯誤日誌:記錄啟動、執行或停止mysqld時出現的問題。 b、通用日誌:記錄建立的客戶端連線和執行的語句。 c、更新日誌:記錄更改資料的語句。該日誌在MySQL 5.1中已不再使用。 d、二進位制日誌:記錄所有更改資料的語句。還用於複製。 e、慢查詢日誌:記錄所有執行時間超過long_query_time秒的所有查詢或不使用索引的查詢。 f、Innodb日誌:innodb redo log 和undo log

預設情況下,所有日誌建立於mysqld資料目錄中。 可以通過重新整理日誌,來強制mysqld來關閉和重新開啟日誌檔案(或者在某些情況下切換到一個新的日誌)。 當你執行一個FLUSH LOGS語句或執行mysqladmin flush-logs或mysqladmin refresh時,則日誌被老化。 對於存在MySQL複製的情形下,從複製伺服器將維護更多日誌檔案,被稱為接替日誌。

2.錯誤日誌

錯誤日誌是一個文字檔案。 錯誤日誌記錄了MySQL Server每次啟動和關閉的詳細資訊以及執行過程中所有較為嚴重的警告和錯誤資訊。 可以用--log-error[=file_name]選項來開啟mysql錯誤日誌,該選項指定mysqld儲存錯誤日誌檔案的位置。 對於指定--log-error[=file_name]選項而未給定file_name值,mysqld使用錯誤日誌名host_name.err 並在資料目錄中寫入日誌檔案。 在mysqld正在寫入錯誤日誌到檔案時,執行FLUSH LOGS 或者mysqladmin flush-logs時,伺服器將關閉並重新開啟日誌檔案。 建議在flush之前手動重新命名錯誤日誌檔案,之後mysql服務將使用原始檔名開啟一個新檔案。 以下為錯誤日誌備份方法: shell> mv host_name.err host_name.err-old shell> mysqladmin flush-logs shell> mv host_name.err-old backup-directory

3.InnoDB中的日誌

MySQL資料庫InnoDB儲存引擎Log漫遊

1 – Undo Log

Undo Log 是為了實現事務的原子性,在MySQL資料庫InnoDB儲存引擎中,還用Undo Log來實現多版本併發控制(簡稱:MVCC)。

  • 事務的原子性(Atomicity) 事務中的所有操作,要麼全部完成,要麼不做任何操作,不能只做部分操作。如果在執行的過程中發生 了錯誤,要回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過。

  • 原理 Undo Log的原理很簡單,為了滿足事務的原子性,在操作任何資料之前,首先將資料備份到一個地方 (這個儲存資料備份的地方稱為Undo Log)。然後進行資料的修改。如果出現了錯誤或者使用者執行了 ROLLBACK語句,系統可以利用Undo Log中的備份將資料恢復到事務開始之前的狀態。

除了可以保證事務的原子性,Undo Log也可以用來輔助完成事務的持久化

  • 事務的永續性(Durability) 事務一旦完成,該事務對資料庫所做的所有修改都會持久的儲存到資料庫中。為了保證永續性,資料庫 系統會將修改後的資料完全的記錄到持久的儲存上。

  • 用Undo Log實現原子性和持久化的事務的簡化過程 假設有A、B兩個資料,值分別為1,2。 A.事務開始. B.記錄A=1到undo log. C.修改A=3. D.記錄B=2到undo log. E.修改B=4. F.將undo log寫到磁碟。 G.將資料寫到磁碟。 H.事務提交 這裡有一個隱含的前提條件:‘資料都是先讀到記憶體中,然後修改記憶體中的資料,最後將資料寫回磁碟’。

    之所以能同時保證原子性和持久化,是因為以下特點: A. 更新資料前記錄Undo log。 B. 為了保證永續性,必須將資料在事務提交前寫到磁碟。只要事務成功提交,資料必然已經持久化。 C. Undo log必須先於資料持久化到磁碟。如果在G,H之間系統崩潰,undo log是完整的, 可以用來回滾事務。 D. 如果在A-F之間系統崩潰,因為資料沒有持久化到磁碟。所以磁碟上的資料還是保持在事務開始前的狀態。

缺陷:每個事務提交前將資料和Undo Log寫入磁碟,這樣會導致大量的磁碟IO,因此效能很低。

如果能夠將資料快取一段時間,就能減少IO提高效能。但是這樣就會喪失事務的永續性。因此引入了另外一 種機制來實現持久化,即Redo Log.

2 – Redo Log

  • 原理 和Undo Log相反,Redo Log記錄的是新資料的備份。在事務提交前,只要將Redo Log持久化即可, 不需要將資料持久化。當系統崩潰時,雖然資料沒有持久化,但是Redo Log已經持久化。系統可以根據 Redo Log的內容,將所有資料恢復到最新的狀態。

  • Undo + Redo事務的簡化過程 假設有A、B兩個資料,值分別為1,2. A.事務開始. B.記錄A=1到undo log. C.修改A=3. D.記錄A=3到redo log. E.記錄B=2到undo log. F.修改B=4. G.記錄B=4到redo log. H.將redo log寫入磁碟。 I.事務提交

    undo log 儲存的是修改前的資料,並且儲存到記憶體中,回滾的時候在讀取裡面的內容(從而實現了原子性),redolog儲存的是修改後的資料(對新資料的備份,同時也會將redo log備份),在事務提交寫入到磁碟,從而保證了永續性

4- 慢查詢日誌

概述   資料庫查詢快慢是影響專案效能的一大因素,對於資料庫,我們除了要優化 SQL,更重要的是得先找到需要優化的 SQL。如何找到低效的 SQL 是寫這篇文章的主要目的。

  MySQL 資料庫有一個“慢查詢日誌”功能,用來記錄查詢時間超過某個設定值的SQL,這將極大程度幫助我們快速定位到問題所在,以便對症下藥。至於查詢時間的多少才算慢,每個專案、業務都有不同的要求,傳統企業的軟體允許查詢時間高於某個值,但是把這個標準放在網際網路專案或者訪問量大的網站上,估計就是一個bug,甚至可能升級為一個功能性缺陷。

  為避免誤導讀者,特申明本文的討論限制在 Win 64位 + MySQL 5.6 範圍內。其他平臺或資料庫種類及版本,我沒有嘗試過,不做贅述。

設定日誌功能 關於慢查詢日誌,主要涉及到下面幾個引數:

slow_query_log :是否開啟慢查詢日誌功能(必填) long_query_time :超過設定值,將被視作慢查詢,並記錄至慢查詢日誌檔案中(必填) log-slow-queries :慢查詢日誌檔案(不可填),自動在 \data\ 建立一個 [hostname]-slow.log 檔案   也就是說,只有滿足以上三個條件,“慢查詢功能”才可能正確開啟或關閉。

5.二進位制日誌

  • 主從複製的基礎:binlog日誌和relaylog日誌

什麼是MySQL主從複製 簡單來說就是保證主SQL(Master)和從SQL(Slave)的資料是一致性的,向Master插入資料後,Slave會自動從Master把修改的資料同步過來(有一定的延遲),通過這種方式來保證資料的一致性,就是主從複製

複製方式 MySQL5.6開始主從複製有兩種方式:基於日誌(binlog)、基於GTID(全域性事務標示符)。 本文只涉及基於日誌binlog的主從配置

複製原理 1、Master將資料改變記錄到二進位制日誌(binary log)中,也就是配置檔案log-bin指定的檔案,這些記錄叫做二進位制日誌事件(binary log events) 2、Slave通過I/O執行緒讀取Master中的binary log events並寫入到它的中繼日誌(relay log) 3、Slave重做中繼日誌中的事件,把中繼日誌中的事件資訊一條一條的在本地執行一次,完成資料在本地的儲存,從而實現將改變反映到它自己的資料(資料重放)

1、什麼是binlog binlog是一個二進位制格式的檔案,用於記錄使用者對資料庫更新的SQL語句資訊,例如更改資料庫表和更改內容的SQL語句都會記錄到binlog裡,但是對庫表等內容的查詢不會記錄。

預設情況下,binlog日誌是二進位制格式的,不能使用檢視文字工具的命令(比如,cat,vi等)檢視,而使用mysqlbinlog解析檢視。

2.binlog的作用 當有資料寫入到資料庫時,還會同時把更新的SQL語句寫入到對應的binlog檔案裡,這個檔案就是上文說的binlog檔案。使用mysqldump備份時,只是對一段時間的資料進行全備,但是如果備份後突然發現資料庫伺服器故障,這個時候就要用到binlog的日誌了。

主要作用是用於資料庫的主從複製及資料的增量恢復。

1.啥是binlog? 記錄資料庫增刪改,不記錄查詢的二進位制日誌. 2.作用:用於資料同步. 3、如何開啟binlog日誌功能 在mysql的配置檔案my.cnf中,增加log_bin引數即可開啟binlog日誌,也可以通過賦值來指定binlog日誌的檔名,例項如下:

[root@DB02 ~]# grep log_bin /etc/my.cnf log_bin = /application/mysql/logs/dadong-bin

log_bin

[root@DB02 ~]# 提示:也可以按“log_bin = /application/mysql/logs/dadong-bin”命名,目錄要存在 為什麼要重新整理binlog?找到全備資料和binlog檔案的恢復臨界點.

總結

mysql資料庫的binlog和relay log日誌有著舉足輕重的作用,並且relay log僅僅存在於mysql 的slave庫,它的作用就是記錄slave庫中的io程式接收的從主庫傳過來的binlog,然後等待slave庫的sql程式去讀取和應用,保證主從同步,但是binlog主庫和從庫(slave)都可以存在,記錄對資料發生或潛在發生更改的SQL語句,並以二進位制的形式儲存在磁碟,所以可以通過binlog來實時備份和恢復資料庫。

1、什麼是binlog binlog是一個二進位制格式的檔案,用於記錄使用者對資料庫更新的SQL語句資訊,例如更改資料庫表和更改內容的SQL語句都會記錄到binlog裡,但是對庫表等內容的查詢不會記錄。

預設情況下,binlog日誌是二進位制格式的,不能使用檢視文字工具的命令(比如,cat,vi等)檢視,而使用mysqlbinlog解析檢視。

2.binlog的作用 當有資料寫入到資料庫時,還會同時把更新的SQL語句寫入到對應的binlog檔案裡,這個檔案就是上文說的binlog檔案。使用mysqldump備份時,只是對一段時間的資料進行全備,但是如果備份後突然發現資料庫伺服器故障,這個時候就要用到binlog的日誌了。

主要作用是用於資料庫的主從複製及資料的增量恢復。

相關文章