InnoDB存儲引擎的文件簡述(表空間文件和重做日誌文件)

除了mysql數據庫本身的文件外,各個存儲引擎還有自己獨有的文件,與innodb密切相關的文件有:
  1)表空間文件:
      innodb採用將存儲的數據按表空間進行存放的設計,在默認配置下會有一個初始大小爲10mb.名爲ibdata1的文件,該文件即爲默認的表空間文件,可以通過參數innodb_data_file_path進行設置,用戶可以通過多個文件組成一個表空間,同時制定文件的 屬性(大小,是否自動擴大等),若設置了參數innodb_file_per_table,則用戶可以每個基於innodb存儲引擎的表產生一個獨立的 表空間,命名爲表名.ibd,這樣就不用將所有數據都存放在默認的表空間中了,這些單獨的表空間文件只存儲該表的數據、索引和插入緩衝bitmap的信息,其餘的還是存放在默認的表空間中。
2)重做日誌文件:
      innodb數據目錄下默認有兩個名爲ib_logfile0和ib_logfile1的文件,記錄了對於innodb存儲引擎的事務日誌。當實例或者介質失敗後,比如數據庫由於其所在的主機掉電導致實例失敗。則可以通過重做日誌恢復到掉電前的時刻,保證數據的完整性,
      每個innodb存儲引擎至少有一個重做日誌文件組,每個文件至少有兩個重做日誌文件,爲了得到更高的可靠性,用戶可以設置多個鏡像日誌組,將不同的文件組放在不同的磁盤上,以此提高重做日誌的高可用性,在日誌組中每個重做日誌文件的大小一致,並以循環寫入的方式運行(先寫重做日誌文件1,達到文件最後時,切換到文件2,文件2被寫滿後,再切換到文件1).
    下面參數影響着重做日誌文件的屬性:
    innodb_log_file_size:
         指定每個重做日誌文件的大小,innodb1.2.x版本之前大小不得大於4GB,1.2.x之後擴大爲512GB,
    innodb_log_files_in_group:
          指定了 日誌文件組中重做日誌文件的數量,默認爲2,
   innodb_mirrored_log_groups:
         指定了日誌鏡像文件組的數量,默認爲1,表示只有一個文件組,沒有鏡像
 innodb_log_group_home_dir:
      指定了日誌文件組所在的路徑,默認爲./,表示在mysql數據庫的數據目錄下。
   與二進制日誌的區別:
    1.二進制日誌記錄所有與mysql數據庫有關的日誌記錄,包括其他的存儲引擎的日誌,而重做日誌只記錄有關該存儲引擎的事務日誌。
    2.記錄的內容不同,二進制日誌記錄的都是關於一個事務的具體操作內容,即邏輯日誌,而重做日誌記錄的是關於每個頁的更改的物理情況,
    3.寫入的時間也不同,二進制日誌文件僅在事務提交前進行提交,即只寫磁盤一次,無論這個事務多大,而在事務的進行過程中,不斷有重做日誌條目被寫入重做日誌文件中,
innodb存儲引擎中,對於不同的操作有不同的重做日誌格式,但是他們都有基本的格式,
   

       寫入重做日誌文件的操作不是直接寫,而是先寫入一個重做日誌緩衝,再按照一定的條件順序寫入,從重做日誌緩衝寫入磁盤時,按512個字節 也就是一個扇區的大小寫入,扇區是最小的寫入單位,因此一定會成功,也就不需要有doublewrite.
     從日誌文件緩衝寫入磁盤的條件是:
   1.主線程(master thread)每秒會將重做日誌緩衝寫入磁盤
   2.參數innodb_flush_log_at_trx_commit控制,表示在提交的時候,處理重做日誌的方式,0(提交事務時,不將事務的重做日誌寫入磁盤的日誌文件,而是等待主線程的每秒刷新)、1(提交時將重做日誌寫入磁盤的日誌文件,伴有fysnc的調用)、2(將重做日誌異步寫入磁盤,即寫到文件系統的緩存,因此不能保證提交時肯定會寫入日誌文件中,只有這一個動作發生)三個有效值,爲了保證事務的持久性,必須設置爲1,即每當有事務提交時,就必須確保事務都已經寫入重做日誌文件,那麼當數據庫發生宕機,也可以通過重做日誌文件恢復, 設置爲2,可以保證數據庫發生宕機而操作系統及服務器沒有發生宕機,可以恢復數據,

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