日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

InnoDB的ib_logfile写入策略

發布時間:2025/3/18 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 InnoDB的ib_logfile写入策略 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

ib_logfile是InnoDB的事務日志文件。本文簡要說明其寫入時機、寫入策略及如何保證數據安全。

1、?基本概念

  • redo是物理日志,記錄的是頁的物理修改操作,是冪等的。
  • ib_logfile文件個數由innodb_log_files_in_group配置決定,若為2,則在datadir目錄下有兩個文件,命令從0開始,分別為ib_logfile0和ib_logfile.
  • 文件為順序寫入,當達到最后一個文件末尾時,會從第一個文件開始順序復用。
  • lsn: Log Sequence Number,是一個遞增的整數。?Ib_logfile中的每次寫入操作都包含至少1個log,每個log都帶有一個lsn。在內存page修復過程中,只有大于page_lsn的log才會被使用。
  • lsn的保存在全局內存結構log_sys中。遞增數值等于每個log的實際內容長度。即如果新增的一個log長度是len,則log_sys->lsn += len.
  • ib_logfile每次寫入以512(OS_FILE_LOG_BLOCK_SIZE)字節為單位。實際寫入函數?log_group_write_buf(log/log0log.c)
  • 每次寫盤后是否flush,由參數innodb_flush_log_at_trx_commit控制。
  • 2、?log_sys介紹

    log_sys是一個全局內存結構。以下說明幾個成員的意義。

    lsn

    表示已經分配的最后一個lsn的值。

    written_to_all_lsn

    n表示實際已經寫盤的lsn。需要這個值是因為并非每次生成log后就寫盤。

    flushed_to_disk_lsn

    表示刷到磁盤的lsn。需要這個值是因為并非每次寫盤后就flush。

    buf

    待寫入的內容保存在buf中

    buf_size

    buf的大小。由配置中innodb_log_buffer_size決定,實際大小為innodb_log_buffer_size /16k * 16k。

    buf_next_to_write

    buf中下一個要寫入磁盤的位置

    buf_free

    ?

    buf中實際內容的最后位置。當buf_free> buf_next_to_write時,說明內存中還有數據未寫盤。

    3、相關更新

    用一個簡單的更新語句來說明log_sys以及ib_logfile的更新內容的過程。假設我們的更新只涉及到非索引的固定長度字段。

  • 在bufferpool中寫入undo log。?對于一個單一的語句,需要先創建一個undolog頭。
  • 在bufferpool中寫入undo log的實際內容。
  • 在log_sys->buf中寫入buffer page的更新內容。此處保存了更新的完整信息。
  • 在log_sys->buf中寫入啟動事務(trx_prepare)的日志
  • 將c、d更新的log內容寫入ib_logfile中。
  • 在log_sys->buf中寫入事務結束(trx_commit)的日志
  • 將f步驟的log內容寫入ib_logfile中。
  • 4、?說明

    完成上述所有操作時,數據文件還沒有更新。

  • 每次寫入log_sys->buf時同時更新lsn和buf_free。?每次寫ib_logfile時同時更新written_to_all_lsn和buf_next_to_write;
  • 每次寫ib_logfile時以512字節為對齊,如需寫入600字節,則實際寫入1k。寫到最后一個文件末尾則從第一個文件重復使用。
  • 從上述流程看到,在a~d過程中若出現異常關閉,由于沒有寫入到磁盤中,因此整個事務放棄;若在e剛完成時出現異常關閉,雖然事務內容已經寫盤,但沒有提交。在重啟恢復的時候,發現這個事務還沒有提交,邏輯上整個事務放棄。?(重啟日志中會有Found 1 prepared transaction(s) in InnoDB字樣)。在g完成后出現異常關閉,則能夠在重啟恢復中正常提交。
  • 在e和f之間會寫mysql的bin-log,若bin-log寫完前異常關閉,事務無效,bin-log寫入成功后,則異常重啟后能夠根據bin-log恢復事務的修改。
  • 若涉及到索引更新,在步驟c之后會增加索引更新的log。由于索引可能有merge過程,因此在merge過程中會另外增加寫入一個log。但事務完全提交仍在步驟g中。索引的更新由于已經寫盤,并不會因此丟失。
  • ?

    ?

    更改innodb_log_file_size, 解決InnoDB: ERROR: the ag...

    轉載于:https://my.oschina.net/anxiaole/blog/2222723

    總結

    以上是生活随笔為你收集整理的InnoDB的ib_logfile写入策略的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。