閱讀《MySQL Innodb無鎖化設計的日志系統》(
https://zhuanlan.zhihu.com/p/53037796)后的心得:
與oracle日志子系統異曲同工的差異
1. 空洞:對于并發會話copy重做日志造成的空洞,oracle是由lgwr判斷并等待持有redo copy閂鎖的會話釋放后,這時空洞已被填充,可以刷到磁盤了;mysql則是由log writer線程監測到空洞被填充后,再寫入一段連續最大lsn的日志到磁盤
2. io方式:oracle的lgwr是direct io;mysql的log writer是寫到os的page cache,后由獨立的log flusher線程刷盤,比oracle多了一個過程
3. 喚醒會話:oracle由lgwr掃描所有等待的會話,只喚醒滿足寫入條件(事務提交log已刷盤)的會話;mysql則由獨立的log flush notifier通過滿足條件對應的分片消息隊列來喚醒,比oracle多了一個過程
總結:mysql通過原子變量來管理全局log buffer的幾個內存位置來實現無鎖化,而原子操作在多核上仍不利于線性擴展。oracle的閂鎖也存在類似問題,但通過私有redo緩存和多個全局log buffer(相關閂鎖量與cpu核數正比),來提升了擴展性。故整體上oracle更優
閱讀《MySQL/InnoDB數據克隆插件(clone plugin)實現剖析》(
https://zhuanlan.zhihu.com/p/76255304)后的心得:
與oracle老式熱備異曲同工的差異
1. page追蹤:oracle老式熱備實際當每行更新時將整個關聯的page記錄在redo日志中;mysql熱備則是記錄變化page的id在單獨一個地方,用于page copy階段從buffer pool讀取并發送頁數據到備庫
2. redo歸檔:oracle老式熱備在拷貝數據文件的全過程,只要數據文件被修改就會有redo歸檔;mysql熱備則僅在page copy階段啟用redo歸檔,可看做是臨時的
3. 一致性恢復:oracle老式熱備存在數據塊分離現象,對此應用被凍結scn及日志序列號后的redo log來恢復;mysql則通過page copy及應用clone lsn后的redo log來恢復
總結:oracle老式熱備必須處于歸檔模式,由于記錄整塊而非行變化,因此重做日志寫放大而增加了cpu和io的開銷,由于可能判斷并修復分離的塊,因此延長了恢復時間;mysql通過page追蹤和臨時redo歸檔來減少應用redo的體量而縮短了恢復時間。故mysql熱備整體更優,但相對oracle的現代rman備份則并不更優
posted on 2020-04-21 11:19
春秋十二月 閱讀(5975)
評論(0) 編輯 收藏 引用 所屬分類:
Database