mysql基礎:binlog、redo log


 

什么是binlog、redo log

binlog屬於邏輯日志,是邏輯操作。innodb redo屬於物理日志,是物理變更。邏輯日志有個缺點是難以並行,而物理日志可以比較好的並行操作。

1. binlog是MySQL Server層記錄的日志, redo log是InnoDB存儲引擎層的日志。 兩者都是記錄了某些操作的日志(不是所有)自然有些重復(但兩者記錄的格式不同)。
2. 選擇binlog日志作為replication

 

bin log

即二進制日志,它記錄了數據庫上的所有改變,並以二進制的形式保存在磁盤中;它可以用來查看數據庫的變更歷史、數據庫增量備份和恢復、Mysql的復制(主從數據庫的復制)。語句以“事件”的形式保存,它描述數據更改。

因為有了數據更新的binlog,所以可以用於實時備份,與master/slave復制。高可用與數據恢復。

1.恢復使能夠最大可能地更新數據庫,因為二進制日志包含備份后進行的所有更新。
2.在主復制服務器上記錄所有將發送給從服務器的語句。

 

Redo log
記錄的是新數據的備份。在事務提交前,只要將Redo Log持久化即可,不需要將數據持久化。當系統崩潰時,雖然數據沒有持久化,
但是RedoLog已經持久化。系統可以根據RedoLog的內容,將所有數據恢復到最新的狀態。

InnoDB有buffer pool(簡稱bp)。bp是數據庫頁面的緩存,對InnoDB的任何修改操作都會首先在bp的page上進行,然后這樣的頁面將被標記為dirty並被放到專門的flush list上,后續將由master thread或專門的刷臟線程階段性的將這些頁面寫入磁盤(disk or ssd)。這樣的好處是避免每次寫操作都操作磁盤導致大量的隨機IO,階段性的刷臟可以將多次對頁面的修改merge成一次IO操作,同時異步寫入也降低了訪問的時延。然而,如果在dirty page還未刷入磁盤時,server非正常關閉,這些修改操作將會丟失,如果寫入操作正在進行,甚至會由於損壞數據文件導致數據庫不可用。為了避免上述問題的發生,Innodb將所有對頁面的修改操作寫入一個專門的文件,並在數據庫啟動時從此文件進行恢復操作,這個文件就是redo log file。這樣的技術推遲了bp頁面的刷新,從而提升了數據庫的吞吐,有效的降低了訪問時延。帶來的問題是額外的寫redo log操作的開銷(順序IO,當然很快),以及數據庫啟動時恢復操作所需的時間。

 

Undo Log
Undo Log是為了實現事務的原子性,在MySQL數據庫InnoDB存儲引擎中,還用UndoLog來實現多版本並發控制(簡稱:MVCC)。
-事務的原子性(Atomicity)
事務中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在執行的過程中發了錯誤,要回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過。

 

binlog格式

binlog有三種格式:Statement、Row以及Mixed。從安全性來看,ROW(最安全)、MIXED(不推薦)、STATEMENT(不推薦)。

–基於SQL語句的復制(statement-based replication,SBR), 
–基於行的復制(row-based replication,RBR), 
–混合模式復制(mixed-based replication,MBR)。

 

Statement 
每一條會修改數據的sql都會記錄在binlog中。在5.6.24中默認格式。

優點:不需要記錄每一行的變化,減少了binlog日志量,節約了IO,提高性能。

缺點:由於記錄的只是執行語句,為了這些語句能在slave上正確運行,因此還必須記錄每條語句在執行的時候的一些相關信息,以保證所有語句能在slave得到和在master端執行時候相同 的結果。另外mysql 的復制,像一些特定函數功能,slave可與master上要保持一致會有很多相關問題。

ps:相比row能節約多少性能與日志量,這個取決於應用的SQL情況,正常同一條記錄修改或者插入row格式所產生的日志量還小於Statement產生的日志量,但是考慮到如果帶條件的update操作,以及整表刪除,alter表等操作,ROW格式會產生大量日志,因此在考慮是否使用ROW格式日志時應該跟據應用的實際情況,其所產生的日志量會增加多少,以及帶來的IO性能問題

 

Row

5.1.5版本的MySQL才開始支持row level的復制,它不記錄sql語句上下文相關信息,僅保存哪條記錄被修改。

優點: binlog中可以不記錄執行的sql語句的上下文相關的信息,僅需要記錄那一條記錄被修改成什么了。所以rowlevel的日志內容會非常清楚的記錄下每一行數據修改的細節。而且不會出現某些特定情況下的存儲過程,或function,以及trigger的調用和觸發無法被正確復制的問題.

缺點:所有的執行的語句當記錄到日志中的時候,都將以每行記錄的修改來記錄,這樣可能會產生大量的日志內容。

ps:新版本的MySQL中對row level模式也被做了優化,並不是所有的修改都會以row level來記錄,像遇到表結構變更的時候就會以statement模式來記錄,如果sql語句確實就是update或者delete等修改數據的語句,那么還是會記錄所有行的變更

 

Mixed

從5.1.8版本開始,MySQL提供了Mixed格式,實際上就是Statement與Row的結合。

在Mixed模式下,一般的語句修改使用statment格式保存binlog,如一些函數,statement無法完成主從復制的操作,則采用row格式保存binlog,MySQL會根據執行的每一條具體的sql語句來區分對待記錄的日志形式,也就是在Statement和Row之間選擇一種。

 

查看與配置binlog格式

(1)查看binlog_format

show variables like 'binlog_format'

這里寫圖片描述

或者通過查看配置文件

whereis my.ini cat /etc/my.cnf

這里寫圖片描述

(2)修改binlog_format

直接修改 set globle binlog_format='MIXED'

或者修改配置文件 vi /etc/my.cnf

 

與binlog有關參數

log_bin
設置此參數表示啟用binlog功能,並指定路徑名稱。默認是off

log_bin_basename
log_bin_index
設置此參數是指定二進制索引文件的路徑與名稱


max_binlog_cache_size
此參數表示binlog使用的內存最大的尺寸
binlog_cache_size
此參數表示binlog使用的內存大小,可以通過狀態變量binlog_cache_use和binlog_cache_disk_use來幫助測試。
       binlog_cache_use:使用二進制日志緩存的事務數量
       binlog_cache_disk_use:使用二進制日志緩存但超過binlog_cache_size值並使用臨時文件來保存事務中的語句的事務數量


max_binlog_size
Binlog最大值,最大和默認值是1GB,該設置並不能嚴格控制Binlog的大小,尤其是Binlog比較靠近最大值而又遇到一個比較大事務時,為了保證事務的完整性,不可能做切換日志的動作,只能將該事務的所有SQL都記錄進當前日志,直到事務結束

 

innodb_flush_log_at_trx_commit = N:
N=0  – 每隔一秒,把事務日志緩存區的數據寫到日志文件中,以及把日志文件的數據刷新到磁盤上;
N=1  – 每個事務提交時候,把事務日志從緩存區寫到日志文件中,並且刷新日志文件的數據到磁盤上;
N=2  – 每事務提交的時候,把事務日志數據從緩存區寫到日志文件中;每隔一秒,刷新一次日志文件,但不一定刷新到磁盤上,而是取決於操作系統的調度;

 

sync_binlog =  N:這個參數直接影響mysql的性能和完整性
N>0  — 每向二進制日志文件寫入N條SQL或N個事務后,將執行一次fsync之類的磁盤同步指令,同時文件系統將Binlog文件緩存刷新到磁盤;
N=0  — 默認的,性能最高,風險最大。不主動刷新二進制日志文件的數據到磁盤上,而是由操作系統決定。當事務提交后,Mysql僅僅是將binlog_cache中的數據寫入Binlog文件,但不執行fsync之類的磁盤同步指令通知文件系統將緩存刷新到磁盤,而讓Filesystem自行決定什么時候來做同步,這個是性能最好的。;

 

推薦配置組合:
N=1,1  — 適合數據安全性要求非常高,而且磁盤IO寫能力足夠支持業務,比如充值消費系統;
N=1,0  — 適合數據安全性要求高,磁盤IO寫能力支持業務不富余,允許備庫落后或無復制;
N=2,0或2,m(0<m<100)  — 適合數據安全性有要求,允許丟失一點事務日志,復制架構的延遲也能接受;
N=0,0  — 磁盤IO寫能力有限,無復制或允許復制延遲稍微長點能接受,例如:日志性登記業務;

 

 

MySQL redo log及recover過程淺析

 mysql binlog系列(一)----binlog介紹、日志格式、數據查看等

開啟MySQL的binlog日志:http://blog.csdn.net/king_kgh/article/details/74800513

 binlog日志詳解:http://blog.csdn.net/king_kgh/article/details/74833539
使用binlog恢復數據:http://blog.csdn.net/king_kgh/article/details/74890381

 


免責聲明!

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



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