程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL多線程復制碰到Error_code: 1872的處理計劃

MySQL多線程復制碰到Error_code: 1872的處理計劃

編輯:MySQL綜合教程

MySQL多線程復制碰到Error_code: 1872的處理計劃。本站提示廣大學習愛好者:(MySQL多線程復制碰到Error_code: 1872的處理計劃)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL多線程復制碰到Error_code: 1872的處理計劃正文


上周在臨盆情況上碰到一個成績,不敢獨享,拿出來給小同伴們做個簡略的分享。

原由 :因為IDC機房斷電(估量又是哪裡被發掘機碰了下吧),招致一切辦事重視啟,影響到了個中的MySQL數據庫。來看下這時候數據庫碰到的成績:

數據庫版本 :MySQL 5.7.10

成績表示

:從機復制報以下毛病:Slave SQL for channel ”: Slave failed to initialize relay log info structure from the repository, Error_code: 1872

用了Inside君的MySQL尺度設置裝備擺設文件模板,怎樣沒有完成crash safe呢?其實,這重要是由於多線程復制(MTS)所惹起。不知MySQL 5.7,即便MySQL 5.6也異樣會碰到成績。

在MTS場景下,能夠會湧現以下兩個成績:

gap事務:後履行的事務先回放(apply)了
Exec_Master_Log_Pos地位禁絕確:能夠存在曾經事務曾經提交,然則地位還沒更新(單線程復制不存在此成績)
gap事務比擬好懂得,由於豈論是基於database級其余MTS,照樣基於logical_clock的MTS,都能夠存鄙人面的這類場景:


因為MTS的緣由,前面的事務能夠比後面的事務早履行,如上圖終能夠事務tx2和tx4都曾經提交了,然則事務tx1和tx3還未提交。這時候就稱為存在gap事務。在基於logical_clock的MTS場景下,用戶可以經由過程設置裝備擺設 參數slave_preserve_commit_order=1 來包管提交的次序性。

另外一方面,這時候Exec_Master_Log_Pos也是禁絕確的,當產生crash時,master info中仍然記載的是tx1事務開端履行的地位(見上圖左邊的部門)。切記,即便將參數slave_preserve_commit_order設置為1,MTS場景下仍然不克不及包管Exec_Master_Log_Pos是精確的,其稱之為 gap-free low-watermark 。由於MTS場景下關於表slave_realy_info_log的更新其實不是事務的(這個須要好好領會下)。

但是,MTS場景下引入了新的事務表slave_worker_info,用以表現產生宕機時每一個線程更新到的地位,其與Worker線程的回放是事務的。是以,MySQL在恢復的時刻可以經由過程經由過程Exec_Master_Log_Pos與表slave_worker_info的列Master_log_pos做比較,斷定能否須要回放以後事務。

在MySQL 5.7.13版本之前,當產生宕機後須要手動履行以下操作,若直接履行CHANGE MASTER TO操作,則能夠會觸發上述1872毛病:

START SLAVE UNTIL SQL_AFTER_MTS_GAPS;
START SLAVE SQL_THREAD;

因為辦事器上的MySQL版本為5.7.10,而DBA試圖經由過程敕令CHANGE MASTER TO來修復復制成績,是以招致了上述成績。而在MySQL 5.7.13版本後,上述成績將有MySQL主動修復。簡略來講,即便產生了宕機,也能精確並主動地恢復復制的運轉狀況。

不外,當Inside進級到MySQL 5.7.15進程時,又碰到了一個不年夜不小的坑,這個就留著等下回分享吧。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved