必須了解的MySQL三大日志:binlog、redo log和undo log

邏輯日志:可以簡單理解為記錄的就是SQL語句。
物理日志:因為MySQL數(shù)據(jù)最終是保存在數(shù)據(jù)頁中的,物理日志記錄的就是數(shù)據(jù)頁變更。
主從復(fù)制:在Master端開啟binlog,然后將binlog發(fā)送到各個Slave端,Slave端重放binlog從而達到主從數(shù)據(jù)一致。
數(shù)據(jù)恢復(fù):通過使用mysqlbinlog工具來恢復(fù)數(shù)據(jù)。
0:不去強制要求,由系統(tǒng)自行判斷何時寫入磁盤;
1:每次commit的時候都要將binlog寫入磁盤;
N:每N個事務(wù),才會將binlog寫入磁盤。
STATMENT:基于SQL語句的復(fù)制(statement-based replication, SBR),每一條會修改數(shù)據(jù)的SQL語句會記錄到binlog中。優(yōu)點:不需要記錄每一行的變化,減少了binlog日志量,節(jié)約了IO,從而提高了性能;缺點:在某些情況下會導(dǎo)致主從數(shù)據(jù)不一致,比如執(zhí)行sysdate()、slepp()等。
ROW:基于行的復(fù)制(row-based replication,RBR),不記錄每條SQL語句的上下文信息,僅需記錄哪條數(shù)據(jù)被修改了。優(yōu)點:不會出現(xiàn)某些特定情況下的存儲過程、或function、或trigger的調(diào)用和觸發(fā)無法被正確復(fù)制的問題;缺點:會產(chǎn)生大量的日志,尤其是alter table的時候會讓日志暴漲。
MIXED:基于STATMENT和ROW兩種模式的混合復(fù)制(mixed-based replication,MBR),一般的復(fù)制使用STATEMENT模式保存binlog,對于STATEMENT模式無法復(fù)制的操作使用ROW模式保存binlog。

因為InnoDB是以頁為單位進行磁盤交互的,而一個事務(wù)很可能只修改一個數(shù)據(jù)頁里面的幾個字節(jié),這個時候?qū)⑼暾臄?shù)據(jù)頁刷到磁盤的話,太浪費資源了!
一個事務(wù)可能涉及修改多個數(shù)據(jù)頁,并且這些數(shù)據(jù)頁在物理上并不連續(xù),使用隨機IO寫入性能太差!






