MySQL InnoDB事務日志


ib_logfile 文件原理

ib_logfile0 是innodb中事務日志,記錄系統的回滾,重做日志,記錄的是文件的物理更改,存放位置my.ini 中的 datadir="D:\phpStudy\MySQL\data",目錄下。

事務日志或稱redo日志,在mysql中默認以ib_logfile0,ib_logfile1名稱存在,可以手工修改參數,調節
開啟幾組日志來服務於當前mysql數據庫,mysql采用順序,循環寫方式,每開啟一個事務時,
會把一些相關信息記錄事務日志中(記錄對數據文件數據修改的物理位置或叫做偏移量)

作用:在系統崩潰重啟時,作事務重做;在系統正常時,每次checkpoint時間點,會將之前寫入事務
應用到數據文件中。

redo日志寫入方式:

  1. ib_logfile寫入當前事務更新數據,並標上事務准備trx_prepare
  2. 寫入bin-log
  3. ib_logfile當前事務提交提交trx_commit

恢復方式:  

  如果ib_logfile已經寫入事務准備,那么在恢復過程中,會依據bin-log中該事務是否存在恢復數據。

相關參數:

innodb_log_buffer_size  

事務日志緩存區,可設置1M~8M,默認8M,延遲事務日志寫入磁盤,把事務日志緩存區想象形如"漏斗"狀,會不停向磁盤記錄緩存的日志記錄,而何時寫入通過參數

innodb_log_file_size

控制事務日志ib_logfile的大小,范圍5MB~4G;所有事務日志ib_logfile0+ib_logfile1+..累加大小不能超過4G,事務日志大,checkpoint會少,節省磁盤IO,但是大的事務日
志意味着數據庫crash時,恢復起來較慢。

引入問題:修改該參數大小,導致ib_logfile文件的大小和之前存在的文件大小不匹配
解決方式:在干凈關閉數據庫情況下,刪除ib_logfile,而后重啟數據庫,會自行創建該文件;

innodb_log_files_in_group

設置幾組事務日志,默認是2

innodb_log_group_home_dir

事務日志存放目錄,不設置,ib_logfile0存在在數據文件目錄下

innodb_flush_log_at_trx_commit

控制事務日志何時寫盤和刷盤,安全遞增:0,2,1;啟用大的事務日志緩存,可以將完整運行大事務日志,暫時存放在事務緩存區中,不必(事務提交前)寫入磁盤保存,同時也起到節約磁盤空間占用

0:每秒一次事務緩存區刷新到文件系統,同時文件系統到磁盤同步,但是事務提交時,不會觸發log_buffer到文件系統同步;
2:每次事務提交時,會把事務緩存區日志刷新到文件系統中去,且每秒文件系統到磁盤同步;
1:每次事務提交時刷新到磁盤,最安全;

適用環境:
0:磁盤IO能力有限,安全方便較差,無復制或復制延遲可以接受,如日志性業務,mysql損壞丟失1s事務數據;
2:數據安全性有要求,可以丟失一點事務日志,復制延遲也可以接受,OS損壞時才可能丟失數據;
1:數據安全性要求非常高,且磁盤IO能力足夠支持業務,如充值消費,敏感業務;

 

文件大小設置

  配置文件中配置: innodb_log_file_size=24M

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM