數據庫中的兩個最重要的日志redo log和binlog


mysql整體來看其實只有兩部分,一部分是server層,一部分是引擎層。

 

 

 

1、redo log(重做日志):當有一條記錄需要更新的時候,InnoDB 引擎就會先把記錄寫入redo log里面,並更新內存,這個時候更新就算完完成了。同時,innodb引擎會在適當的時候,將這個操作記錄更新到磁盤里面,而這個更新往往是在系統比較空閑的時候做的。redo log是固定大小的,從前往后寫,寫完后會繼續從開頭開始寫,把以前的內容覆蓋。有了redo log,innodb就可以保證即使數據庫發生異常重啟,之前提交的記錄都不會丟失,這個能力稱為crash-safe。

2、binlog(歸檔日志):二進制日志文件,用於記錄mysql的數據更新或則潛在更新,mysql的主從復制就是依靠binlog。

redo log 和 binlog的區別:1、redo log是innodb引擎特有的,binlog是mysql的server層實現的所有引擎都可以使用。

            2、redo log是物理日志:記錄的是:“在某個數據頁上做了什么修改”;binlog是邏輯日志,記錄的是這個語句的原始邏輯,比如:“給id=2 的這一行的c字段加1”。

            3、redo log是循環寫的,空間會用完,binlog是可以追加寫的。

3、假設現在是一個更新操作,現在是內部流程:①:執行器先找到引擎id=2這一行。id是主鍵,引擎直接用書搜索找到這一行,如果id=2這一行所在的數據也本來就在內存中,就直接返回給執行器;否則,需要先從磁盤讀入內存,然后再返回。

                       ②:執行器拿到引擎的行數據,把這個值加上1,比如原來是N,現在就是N+1,得到新的一行數據,再調用引擎接口寫入這行新數據。

                       ③:引擎將這行新數據更新到內存中,同時將這個更新操作記錄到redo log里面,此時redo log處於prepare狀態。然后告知執行器執行完成了,隨時可以提交事務。

                       ④:執行器生成這個操作的binlog,並把binlog寫入磁盤。

                       ⑤:執行器調用引擎的提交事務接口,引擎把剛剛寫入的redo log改成提交(commit)狀態,更新完成。

4、當你需要擴容的時候,也就是需要再多搭建一些備庫來增加系統的讀能力的時候,現在常見的作法也是全量備份機上應用binlog來實現。

5、redo log用於保證crash-safe能力。innodb_flush_log_at_trx_commit 這個參數設置成1的時候,表示每次事務的redo log都直接持久化到磁盤。這個參數建議設置成1。sync_binlog這個參數設置成1的時候,表示每次事務的binlog都持久化到磁盤。這個參數建議設置成1.


免責聲明!

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



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