重做日志文件(redo log)和二進制文件(bin log)
bin logrhino文件的歷史要比redo log日志文件的歷史久捅彻,因為bin log是server層的日志文件,而server層是所有存儲引擎共享的,其記錄的是邏輯日志腥放,簡單的說就是具體的sql输枯,但不是所有的sql都會記錄,而是所有的數據庫表結構和表數據變更,而redo log是innodb才有的克饶,是存儲引擎層的日志,記錄的是物理日志誊辉,即數據的變化矾湃。
為什么bin log無法保證crach-safe?
bin log記錄的是邏輯日志堕澄,也就是具體的操作邀跃,為什么無法保證呢?因為記錄日志和執(zhí)行操作是兩個操作蛙紫,不是原子操作拍屑。假如在期間什么時候出現(xiàn)了宕機都會出現(xiàn)數據不一致的問題。
redo log如何保證crach-safe坑傅?
同樣是日志文件僵驰,為什么redo log就可以保證crach-safe呢?因為redo log記錄的是物理日志唁毒,其記錄的時間不是在事務執(zhí)行之前或者之后蒜茴,而是在事務執(zhí)行中就記錄了redo log,通過事務來控制原子性浆西。并且粉私,redo log可以保證之前還未提交的操作被記錄了,數據可以恢復近零,所以保證了crach-safe诺核。
那bin log的用途是什么?
bin log是用于主從數據同步的久信。
mysql的主從復制
mysql的slave模式中窖杀,為了減緩主數據庫的訪問壓力,通過添加從數據庫來減少對主數據庫的訪問入篮,但是如何保證主從數據庫數據的一致呢陈瘦?
主庫將更新操作保存在bin log 中,從庫的IO線程從主庫的bin log中讀取到relay log中,sql thread 從relay log 中執(zhí)行sql痊项。
bin log 和redo log的一致性問題锅风?
bin log用來實現(xiàn)主從復制,那么bin log也需要保證記錄的數據的有效性鞍泉,我們知道redo log中的數據是有效的皱埠,所以我們就需要同步兩者之間的數據就行了。那如何實現(xiàn)兩者之間的數據一致性呢咖驮?這里mysql通過兩階段提交來實現(xiàn)边器。
兩階段提交
- prepare階段:innodb prepare,執(zhí)行操作托修,寫入redo log忘巧;
- commit階段:寫入bin log innodb commit(內存操作)。
兩階段提交中睦刃,當已經記錄到bin log 中之后砚嘴,就可以認為數據已經持久化了,數據可以傳給從數據庫了涩拙。
開啟bin log
log-bin=ON
binlog-format=row//選擇row模式
server_id=1//配置mysql replaction需要定義际长,不能和canal和slaved重復
參數:
binlog_cache_size:日志緩存大小,默認3MB兴泥。
sync_binlog:設置多少次事務刷盤工育,默認1,建議設置成0搓彻。
總結:redo log能實現(xiàn)crach-safe主要還是因為事務的原子性如绸,還有就是redo log是物理日志。bin log不能實現(xiàn)crach-safe的主要原因還是bin log是server層的日志好唯,沒有事務的特點竭沫,導致數據的不一致。但是bin log的用處在于主從復制骑篙,而又引發(fā)的一個問題就是bin log 和redo log數據一致性的問題蜕提,而兩階段提交就完美的解決了這個問題。
參考文章:https://blog.csdn.net/lzhcoder/article/details/88814364