binlog
什么是binlog
binlog記錄了數(shù)據(jù)庫表結(jié)構(gòu)和表數(shù)據(jù)變更,比如update/delete/insert/truncate/create。它不會(huì)記錄select(因?yàn)檫@沒有對表沒有進(jìn)行變更)
作用:
復(fù)制和恢復(fù)數(shù)據(jù)
MySQL在公司使用的時(shí)候往往都是一主多從結(jié)構(gòu)的,從服務(wù)器需要與主服務(wù)器的數(shù)據(jù)保持一致,這就是通過binlog來實(shí)現(xiàn)的
數(shù)據(jù)庫的數(shù)據(jù)都被刪除了,我們可以通過binlog來對數(shù)據(jù)進(jìn)行恢復(fù)。
redo log
引入
MySQL是先把這條記錄所在的頁找到,然后把該頁加載到內(nèi)存中,將對應(yīng)記錄進(jìn)行修改?,F(xiàn)在就可能存在一個(gè)問題:如果在內(nèi)存中把數(shù)據(jù)改了,還沒來得及落磁盤,而此時(shí)的數(shù)據(jù)庫掛了怎么辦?顯然這次更改就丟了
MySQL引入了redo log,內(nèi)存寫完了,然后會(huì)寫一份redo log,這份redo log記載著這次在某個(gè)頁上做了什么修改。
存在的意義
redo log的存在為了:當(dāng)我們修改的時(shí)候,寫完內(nèi)存了,但數(shù)據(jù)還沒真正寫到磁盤的時(shí)候。此時(shí)我們的數(shù)據(jù)庫掛了,我們可以根據(jù)redo log來對數(shù)據(jù)進(jìn)行恢復(fù)。因?yàn)閞edo log是順序IO,所以寫入的速度很快,并且redo log記載的是物理變化(xxxx頁做了xxx修改),文件的體積很小,恢復(fù)速度很快。
binlog和redo的區(qū)別
1.存儲(chǔ)的內(nèi)容:binlog記載的是update/delete/insert這樣的SQL語句,而redo log記載的是物理修改的內(nèi)容(xxxx頁修改了xxx)。
2.作用:redo log的作用是為持久化而生的,binlog的作用是復(fù)制和恢復(fù)而生的。
”如果整個(gè)數(shù)據(jù)庫的數(shù)據(jù)都被刪除了,那我可以用redo log的記錄來恢復(fù)嗎?“不能
因?yàn)楣δ艿牟煌?,redo log 存儲(chǔ)的是物理數(shù)據(jù)的變更,如果我們內(nèi)存的數(shù)據(jù)已經(jīng)刷到了磁盤了,那redo log的數(shù)據(jù)就無效了。所以redo log不會(huì)存儲(chǔ)著歷史所有數(shù)據(jù)的變更,文件的內(nèi)容會(huì)被覆蓋的。
3.redo log是MySQL的InnoDB引擎所產(chǎn)生的。binlog無論MySQL用什么引擎,都會(huì)有的。
undo log
作用:回滾和多版本控制(MVCC)
在數(shù)據(jù)修改的時(shí)候,不僅記錄了redo log,還記錄undo log,如果因?yàn)槟承┰驅(qū)е率聞?wù)失敗或回滾了,可以用undo log進(jìn)行回滾
undo log主要存儲(chǔ)的也是邏輯日志,比如我們要insert一條數(shù)據(jù)了,那undo log會(huì)記錄的一條對應(yīng)的delete日志。我們要update一條記錄時(shí),它會(huì)記錄一條對應(yīng)相反的update記錄。
這也應(yīng)該容易理解,畢竟回滾嘛,跟需要修改的操作相反就好,這樣就能達(dá)到回滾的目的。因?yàn)橹С只貪L操作,所以我們就能保證:“一個(gè)事務(wù)包含多個(gè)操作,這些操作要么全部執(zhí)行,要么全都不執(zhí)行”?!驹有浴?/p>
因?yàn)閡ndo log存儲(chǔ)著修改之前的數(shù)據(jù),相當(dāng)于一個(gè)前版本,MVCC實(shí)現(xiàn)的是讀寫不阻塞,讀的時(shí)候只要返回前一個(gè)版本的數(shù)據(jù)就行了。