《MySQL技術內幕-InnoDB存儲引擎》整理2-文件

一、參數文件

Mysql實例啓動時,數據庫會讀取配置參數文件,用來尋找數據庫各種文件所在位置以及指定某些初始化參數

1、什麼是參數

簡單來說,數據庫參數可以看成一個鍵值對,可以通過命令Show Variables查看數據庫中的所有參數

2、參數類型

Mysql數據庫中的參數分爲兩類:動態參數和靜態參數。動態參數意味着可以再Mysql實例運行中進行修改,靜態參數指再整個實例生命週期內都不能更改。動態參數可以通過Set命令進行修改,可以指定global和session關鍵字,分別代表是整個實例的生命週期還是基於當前會話,對變量的全局值修改後僅在當前生命週期內有效,若想永久生效需要修改參數文件。

二、日誌文件

日誌文件記錄了影響Mysql數據庫的各種類型活動,常見的日誌文件有錯誤日誌、二進制日誌、慢查詢日誌和查詢日誌

1、錯誤日誌

錯誤日誌文件對MySql的啓動、運行、關閉過程進行了記錄,用戶可以適用Show Variables Like 'log_error'來定位該文件,當數據庫不能重啓時,第一個查找的文件就應該是錯誤日誌文件

2、慢查詢日誌

Mysql啓動時可以設置一個閾值,所有運行時間超過該閾值的SQL語句都可以記錄到慢查詢日誌文件中,閾值可以通過參數long_query_time進行設置,默認值爲10代表10秒。默認情況下Mysql不啓動慢查詢日誌,需要手動開啓。

long_queries_not_using_indexes參數指查詢語句沒有使用索引,Mysql同樣會將其記錄到慢查詢日誌中,該參數需要手動開啓。log_throttle_queries_not_using_indexes參數表示每分鐘允許記錄到慢查詢日誌且未使用索引的SQL語句的次數,默認爲0表示沒有限制。

隨着越來越多的查詢被記錄到了慢查詢日誌文件中,分析就會變得複雜,這時可以使用mysqldumpslow命令進行查看。從5.1版本開始可以查看mysql架構下的slow_log表(通過設定log_output爲Table)

3、查詢日誌

查詢日誌記錄了所有對MySQL數據庫請求的信息,無論請求是否得到了正確的執行,默認文件名爲主機名.log,可以使用tail 文件名進行查看。從5.1版本開始,可以將查詢日誌的記錄放入mysql架構下的general_log表中

4、二進制日誌

二進制日誌記錄了對Mysql數據庫執行更改的所有操作,不包括Select和Show操作,若操作沒有導致數據庫的變化,該操作可能也會寫入二進制日誌。二進制日誌主要有數據恢復複製(實時同步)、審計(判斷是否有注入攻擊)等功能。通過配置參數log-bin[=name]可以啓動二進制日誌,若不指定會使用主機名,後綴名爲二進制日誌的序列號。查看二進制文件可以使用Mysql提供的mysqlbinlog工具

使用以下配置文件會影響二進制日誌記錄的信息和行爲:

  • max_binlog_size:制定了單個二進制日誌文件的最大值,超過該值則產生新的二進制日誌文件,後綴名+1,並記錄到.index文件,默認值爲1.0G
  • binlog_cache_size:當一個線程開啓一個事務時,Mysql會分配一個大小爲該值的緩存來記錄二進制日誌,當事務的記錄大小超過該值,Mysql會將緩衝中的日誌寫入一個臨時文件中。可以使用binlog_cache_use和binlog_cache_disk_use的狀態來判斷該值是否合適
  • sync_binlog:該值表示每寫緩衝多少次就同步到磁盤,爲1時表示採取同步的方式寫入磁盤不使用,其默認值爲0,表示MySQL不控制binlog的刷新,由文件系統自己控制它的緩存的刷新,這樣設置性能最佳但是風險最大
  • binlog-do-db和binlog-ignore-db:表示需要寫入或忽略寫入哪些庫的日誌,默認爲空表示需要同步所有庫的日誌到二進制日誌
  • binlog_format:會影響記錄二進制日誌的格式。設置爲Statement時記錄的是日誌的邏輯SQL語句,設置爲Row時記錄的是行更改情況,設置爲MIXED格式表示Mysql默認使用Statement格式但在一些情況下使用Row格式。通常情況下將其設置爲Row,但是對磁盤的佔用會較大。

三、表結構定義文件

Mysql數據的存儲是根據表進行的,每個表都有與之對應的文件,其後綴爲frm,記錄了表結構定義

四、InnoDB存儲引擎文件

1、表空間文件

InnoDB採用將存儲的數據按表空間進行存放的設計,默認配置下會有一個初始大小爲10M名爲ibdata1的默認表空間文件,用戶可以通過參數innodb_data_file_path對其進行設置,設置後所有基於InnoDB存儲引擎的表的數據都會記錄到該共享表空間中,若設置了參數innodb_file_per_table爲ON,則用戶可以將每個基於InnoDB存儲引擎的表產生一個獨立表空間,獨立表空間的命名規則爲:表名.idb

2、重做日誌文件

默認情況下,InnoDB存儲引擎的數據目錄下會有名爲ib_logfile0和ib_logfile1的文件,它們是存儲引擎的重做日誌文件,它們記錄了對於InnoDB存儲引擎的事務日誌,當因斷電導致的實例失敗時,就可以使用重做日誌文件了。

每個InnoDB存儲引擎至少有1個重做日誌文件組,每個文件組下至少有兩個重做日誌文件,爲了得到更高的可靠性可以設置多個的鏡像日誌組,將不同的文件組放在不同的磁盤上,以提高重做日誌的高可用性。日誌組中的每個重做日誌文件大小一致,並且回以循環寫入的方式運行

下述屬性會影響重做日誌的屬性:

  • innodb_log_file_size:指定重做日誌文件的大小,1.2.x版本後該限制爲512G
  • innodb_log_files_in_group:指定日誌文件組中國重做日誌文件的數量,默認爲2
  • innodb_mirrored_log_groups:指定日誌鏡像文件組的數量,默認爲1
  • innodb_log_group_home_dir:指定文件組所在的路徑,默認爲./,表示再數據庫的數據目錄下

二進制日誌文件記錄的是所有與MySQL數據庫有關的日誌記錄,而重做日誌文件只記錄了存儲引擎有關的事務日誌,且記錄的是每個頁的更改的物理情況,而非具體的操作內容

主線程中每秒會將重做日誌緩衝寫入磁盤的重做日誌文件中,不論事務是否已經提交,另一個觸發寫磁盤的過程由innodb_flush_log_at_txr_commit控制,表示在提交操作時,處理重做日誌的方式。0表示不講事務的重做日誌寫入磁盤上的日誌文件,1表示在執行commit時將重做日誌緩衝同步寫到磁盤,2表示將重做日誌異步寫道磁盤,即寫到文件系統的緩存中,通常爲了保證ACID原則中的持久性,必須將innodb_flush_log_at_txr_commit參數設置爲1

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