mysql技術內幕(三)文件

文件

  數據庫和InnoDB 存儲引擎表的各種類型文件。這些文件有以下這些。

  • 參數文件:告訴MySQL 實例啓動時在哪裏可以找到數據庫文件,並且指定某些初始化參數,這些參數定義了某種內存結構的大小等設置,還會介紹各種參數的類型。
  • 日誌文件:用來記錄MySQL 實例對某種條件做出響應時寫人的文件,如錯誤日誌文件、二進制日誌文件、慢查詢日誌文件、查詢日誌文件等。
  • socket 文件: 當用UNIX 域套接字方式進行連接時需要的文件。
  • pid 文件: MySQL 實例的進程ID 文件。
  • MySQL 表結構文件:用來存放MySQL 表結構定義文件。
  • 存儲引擎文件:因爲MySQL 表存儲引擎的關係,每個存儲引擎都會有自己的文件來保存各種數據。這些存儲引擎真正存儲了記錄和索引等數據。

3.1 參數文件

  當MySQL 實例啓動時,數據庫會先去讀一個配置參數文件,用來尋找數據庫的各種文件所在位置以及指定某些初始化參數,這些參數通常定義了某種內存結構有多大等。
  MySQL 數據庫中的參數可以分爲兩類:

  • 動態( dynamic) 參數
  • 靜態(static) 參數

  動態參數意味着可以在MySQL 實例運行中進行更改,靜態參數說明在整個實例生命週期內都不得進行更改,就好像是隻讀(read only ) 的。

3.2 日誌文件

  日誌文件記錄了影響MySQL 數據庫的各種類型活動。MySQL 數據庫中常見的日誌文件有:

  • 錯誤日誌(eηor log)
  • 二進制日誌(binlog)
  • 慢查詢日誌(slow que叩log )
  • 查詢日誌(log)

3.2.1 錯誤日誌

  錯誤日誌文件對MySQL 的啓動、運行、關閉過程進行了記錄。該文件不僅記錄了所有的錯誤信息,也記錄一些警告信息或正確的信息。

3.2.2 慢查詢日誌

  慢查詢日誌(slow log) 可幫助DBA 定位可能存在問題的SQL 語句,從而進行SQL 語句層面的優化

3.2.3 查詢日誌

  查詢日誌記錄了所有對MySQL 數據庫請求的信息,無論這些請求是否得到了正確的執行。

3.2.4 二進制日誌

  二進制日誌( binary log) 記錄了對MySQL 數據庫執行更改的所有操作,但是不包括SELECT 和SHOW 這類操作,因爲這類操作對數據本身並沒有修改。然而,若操作本身並沒有導致數據庫發生變化,那麼該操作可能也會寫入二進制日誌。

  二進制日誌主要有以下幾種作用。

  • 恢復(recover):某些數據的恢復需要二進制日誌,例如,在一個數據庫全備文件恢復後,用戶可以通過二進制日誌進行point-in-time 的恢復。
  • 複製(replication) :其原理與恢復類似,通過複製和執行二進制日誌使一臺遠程的MySQL 數據庫( 一般稱爲slave 或standby) 與一臺MySQL 數據庫( 一般稱爲master 或primary)進行實時同步。
  • 審計(audit) :用戶可以通過二進制日誌中的信息來進行審計,判斷是否有對數據庫進行注入的攻擊。

3.3 套接字文件

  在UNIX 系統下本地連接MySQL 可以採用UNIX 域套接字方式,這種方式需要一個套接字(socket) 文件。套接字文件可由參數socket 控制

3.4 pid 文件

  當MySQL 實例啓動時,會將自己的進程ID 寫人一個文件中一一該文件即爲pid 文件

3.5 表結構定義文件

  因爲MySQL 插件式存儲引擎的體系結構的關係, MySQL 數據的存儲是根據表進行的,每個表都會有與之對應的文件。但不論表採用何種存儲引擎, MySQL 都有一個以frm 爲後綴名的文件,這個文件記錄了該表的表結構定義。frm 還用來存放視圖的定義。

3.6 InnoDB 存儲引擎文件

  每個表存儲引擎還有其自己獨有的文件。InnoDB 存儲引擎密切相關的文件,包括重做日誌文件、表空間文件。

3.6.1 表空間文件

  InnoDB 採用將存儲的數據按表空間( tablespace) 進行存放的設計。在默認配置下會有一個初始大小爲10MB , 名爲ibdatal 的文件。該文件就是默認的表空間文件( tablespace file)。

3.6.2 重做日誌文件

  在默認情況下,在InnoDB 存儲引擎的數據目錄下會有兩個名爲ib_logfileO 和iblogfile1 的文件。在MySQL 官方手冊中將其稱爲InnoDB 存儲引擎的日誌文件,不過更準確的定義應該是重做日誌文件(redo log file) 。它們記錄了對於InnoDB 存儲引擎的事務日誌。
  當實例或介質失敗(media failure) 時, 重做日誌文件就能派上用場。例如,數據庫由於所在主機掉電導致實例失敗, InnoDB 存儲引擎會使用重做日誌恢復到掉電前的時
刻,以此來保證數據的完整性。每個InnoDB 存儲引擎至少有1 個重做日誌文件組(group) ,每個文件組下至少有2 個重做日誌文件,如默認的ib_logfileO 和ib_logfile1 。爲了得到更高的可靠性, 用戶可以設置多個的鏡像日誌組( mirrored log groups ),將不同的文件組放在不同的磁盤上,以此提高重做日誌的高可用性。在日誌組中每個重做日誌文件的大小一致, 並以循環寫人的方式運行。InnoDB存儲引擎先寫重做日誌文件1 當達到文件的最後Md至重做日誌文件2 ,再當重做日誌文件2 也被寫滿時,會再切換到重做日誌文件1 中。

  記錄事務日誌, 和之前介紹的二進制日誌有什麼區別?

  • 1、二進制日誌會記錄所有與MySQL 數據庫有關的日誌記錄,包括InnoDB 、MylSAM 、Heap 等其他存儲引擎的日誌。而InnoDB 存儲引擎的重做日誌只記錄有關該存儲引擎本身的事務日誌。
  • 2、記錄的內容不同,無論用戶將二進制日誌文件記錄的格式設爲STATEMENT還是, ROW , 又或者是MIXED ,其記錄的都是關於一個事務的具體操作內容,即該日誌是邏輯日誌。而Inno DB 存儲引擎的重做日誌文件記錄的是關於每個頁( Page) 的更改的物理情況。
  • 3、寫人的時間也不同, 二進制日誌文件僅在事務提交前進行提交,即只寫磁盤一次,不論這時該事務多大。而在事務進行的過程中,卻不斷有重做日誌條目( redo entry )被寫入到重做日誌文件中。

3.7 小結

  與MySQL 數據庫有關的文件中,錯誤文件和二進制日誌文件非常重要。當MySQL 數據庫發生任何錯誤時, DBA 首先就應該去查看錯誤文件,從文件提示的內容中找出問題的所在。當然,錯誤文件不僅記錄了錯誤的內容,也記錄了警告的信息,通過一些警告也有助於DBA對於數據庫和存儲引擎進行優化。
  二進制日誌的作用非常關鍵,可以用來進行point in time 的恢復以及複製(replication) 環境的搭建。因此,建議在任何時候時都啓用二進制日誌的記錄。從MySQL 5.1 開始, 二進制日誌支持STATEMENT 、ROW 、MIX 三種格式,這樣可以更好地保證從數據庫與主數據庫之間數據的一致性。
  最後介紹了和InnoDB 存儲引擎相關的文件,包括表空間文件和重做日誌文件。表空間文件是用來管理InnoDB 存儲引擎的存儲,分爲共享表空間和獨立表空間。重做日誌非常的重要,用來記錄InnoDB 存儲引擎的事務日誌,也因爲重做日誌的存在,才使得InnoDB 存儲引擎可以提供可靠的事務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章