Innodb WAL物理格式

概述

任何對Innodb表的更新,Innodb都會將更新操作轉化為WAL(write ahead log)並寫入日誌文件,WAL中記錄了修改的詳細信息。WAL日誌在事務提交時會保證被寫入持久化存儲設備以保證事務的可靠性,WAL技術是保證數據庫可靠存儲以及提升性能的最重要手段。本文將詳細描述WAL日誌在磁盤上的物理組織格式。

WAL文件組

MySQL WAL日誌是一組日誌文件集合,它們在數據庫實例創建時預創建,並在數據庫運行中被循環使用。WAL文件大小和數目可以通過參數設置,見innodb_log_file_size 和 innodb_log_files_in_group 。

WAL文件

每個WAL文件的前2048字節存放文件頭信息。文件頭後面是WAL內容,按照BLOCK為單位分割,BLOCK大小默認為512字節。日誌文件佈局如下圖所示:

Innodb WAL物理格式

其中幾個重要的字段:

日誌文件頭共佔用4個OS_FILE_LOG_BLOCK_SIZE的大小,即2048,有以下字段:

  • LOG_GROUP_ID:該log文件所屬的日誌組,佔用4個字節,當前均為0
  • LOG_FILE_START_LSN: 該log文件記錄的開始日誌的lsn,佔用8字節
  • LOG_FILE_WAS_CRATED_BY_HOT_BACKUP 備份程序所佔用的字節數,共佔用32字節
  • LOG_CHECKPOINT_1/LOG_CHECKPOINT_2 兩個記錄InnoDB checkpoint信息的字段,分別從文件頭的第二個和第四個block開始記錄,只使用日誌文件組的第一個日誌文件。 從地址2KB偏移量開始,其後就是順序寫入的各個日誌塊(log block)

WAL日誌塊

所有WAL以日誌塊為單位組織在日誌文件中,塊默認為512字節。所有的日誌以塊為單位順序寫入文件。每一條記錄都有自己的LSN(log sequence number, 表示從日誌記錄創建開始到特定的日誌記錄已經寫入的字節數)。每個日誌塊包含一個日誌頭(12字節)、一個尾部(4字節,主要是Block內容的crc校驗),以及一組日誌記錄(最多512 – 12 – 4 = 496字節) 。

Innodb WAL物理格式

日誌塊頭包含以下幾個字段:

  • block_number:4B,表示這是第幾個block塊。 可通過LSN計算: log_block_convert_lsn_to_no
  • block_data_len:2B,表示該block中已經寫入的字節數,若是整個塊都寫滿了的話,該值是 512
  • first_rec_offset:2B,表示該block中第一個全新的log record的開始log record的偏移量
  • log_record_data:496B,存放真正的redo日誌內容
  • checksum:4B,此block數據校驗和,用於正確性校驗

這裡需要特別解釋的是first_rec_offset字段:在innodb事務層產生的wal日誌其實是被組織成為一條條的log record,每個record都有特定的類型以及相應的內容。當log record被存儲至日誌文件中時,可能會出現一個log record跨Block存儲的情況,因而需要在Block Header中存儲first_rec_offset來代表該Block中第一個起始log record在該Block內的偏移,需要注意的是:first_rec_offset包含Block Header的大小。如下例:

Innodb WAL物理格式

該例中,MLOG_RENAME該log record跨了兩個Block,其中8B落在了第二個Block,於是第二個Block的Block Header字段中的first_rec_offset值為12 + 8 = 20。

存在兩種特殊情況:1. Block中的緊接著Header的就是一個新log record的起始字節,那麼first_rec_offset便是Block Header Size,即12;2. 若Block內的所有有效數據存儲的都是上一個Block內最後一個log record的內容,那麼first_rec_offset便為0。

LSN和文件偏移量之間轉換

在Innodb中LSN是一個非常重要的概念,表示某個log record從日誌記錄創建開始已經寫入的字節數。LSN的計算是包含BLOCK的頭和尾字段的。

那如何由一個給定LSN的日誌,在日誌文件中找到它存儲的位置(文件以及在文件內的偏移)是一個比較有意思的問題,原理也比較簡單,感興趣的朋友可以研究下函數log_files_real_offset_for_lsn,這裡便不再贅述。


分享到:


相關文章: