mysql兩份日志: binlog :server innodb redo log:engine 兩份日志順序一致性:否則主備不一致 兩份日志:原子性,同時都有,同時都無 2PC二階段協義: 第一階段:准備界段 第二階段:提交階段 買房子示例 准備界段: 房產局確認: 買方:錢是否准備好 賣方:房子是否可賣 提交界段: 政務中心: 買方: 確認按手印 賣方:確認按手印 ---------------------------------------------------------------- mysql 日志兩階段提交: 刷日志 准備階段: innodb_prepare binlog_prepare 提交階段 binlog_commit innodb_commit 優化后的狀態: 准備階段: innodb_prepare binlog_prepare //binlog commit合並到此操作 ??? 提交階段 innodb_commit ------------------------------------------------------------------- 兩種日志異常處理: binlog的commit log 與innodb的commit log同時存在:不操作 binlog的prepare log與innodb的prepare log同時存在 :innodb commit binlog的prepare log存在,innodb的prepare log 不存在 :re-play innodb binlog的prepare log不存在,innodb的prepare log 存在 :rollback (以binlog 為准,主備一致原則) mysql日志gpoup commit mysql數據庫innodb 存儲引警一直有一個bug,就是當開啟binlog時,無法進行group commit, 究其原因,是為了保證innodb 存儲引警的事務日志與binlog日志的順序一致性 在prepare 前需要取得mutex,直到commit 完成之后釋放,這也禁用了group commit功能 mariadb 徹底解決了這個組提交的問題 MYSQL數據同步 1.全量dump某個時點之前的數據,並記當全量dump完成后數據庫日志的位置 2.將全量的備份LOAD到mysql 3.從剛才全量完成dump后的日志開始,通過解析日志為可執行的sql,遠程LOAD到MYSQL 4.通過不斷的應用log,使MYSQL 慢慢追上主庫 5.將用戶的數據庫設置為只讀,繼續應用日志到MYSQL,直到完全同步 mysql閃回功能 binlog_format 必須是 row 模式 下載專門的mysqlbinlog工具 暫支持insert update delete 做閃回 MYSQL 閃回功能操作步聚: 1. 查看binlog中的position包括start position 和 stop position確認要閃回的位置點 mysql>show binlog events in "xxxx.log"; 2.執行閃回命令 mysqlbinlog -B -v --start-position=120 --stop -position=8836 /home/mysql/binlog.000002|mysql test