mysql主從同步故障整理

快速簡單的解決辦法:根據錯誤日誌情況,簡單快速確認故障點,然後確認是否可以跳過這個錯誤,跳過錯誤的方法是:set global sql_slave_skip_counter=1;跳過並忽略錯誤。

故障整理:


    • 在master上刪除一條記錄時出現的故障。

      在master上刪除一條記錄後,slave上因找不到該記錄而報錯。出現這種情況的原因是主機上已將其刪除了,對此,可採取從機直接跳過的方式解決。stop slave;set global sql_slave_skip_counter=1;start slave;

    • 主鍵重複。

      主從數據不一致,slave上已經有該條記錄,但我們又在master上插入了同一條記錄是,就會報錯。

      解決辦法:查到相應主鍵,然後確認數據是否缺少存在,去過數據已經存在,可以跳過這個錯誤。或者delete掉這個主鍵。

    • 在master上更新一條記錄,而slave上卻找不到。

      master上有該記錄,但slave上沒有,當之後又更新了這個記錄時就會報錯。

      解決辦法:在master上,用mysqlbinlog分析一下出錯的binlog日誌在幹什麼,例如一跳update語句,就可以在slave上找一下更新後的那條記錄,應該不存在。然後在master上找到這一行數據,手動inster到slave上。然後在跳過報錯即可。

    • slave的中繼日誌relay-log損壞。

      當slave意外宕機時,有可能損壞中繼日誌relay-log,在次開啓同步複製,就會報錯。

      解決辦法:找到同步的binglog日誌和pos點,重新同步即可。如可查找呢:

      show slave status\G,其中,涉及幾個重要參數:

      slave_io_running:接受master的binlog信息。(io線程的工作)

       master_log_file:正在讀取master上binlog日誌名。

       read_master_log_pos:正在讀取master上當前binlog日誌的pos點。

      slave_sql_running,執行寫操作。(sql線程的工作)

       relay_master_log_file:正在同步master上的binlog日誌名。

       exec_master_log_pos:正在同步當前binlog日誌的pos點。

      可以以relay_master_log_file和exec_master_log_pos參數值爲基準,進行重新同步,重新獲取binlog,即重新change master to xxx xxx;

      其實在my.cnf中加入參數relay_log_recover=1就可以解決了。

    • 認爲失誤,server_id重複。

      解決辦法:修改server_id,重新啓動mysql即可。

    • 避免在master上執行大事物。

      例如要delete一個表中的old數據,表比較大,刪除的數據量也比較大,當使用一條命令一次刪除,就會產生大事物,就一下子就把slave卡死了。現象:slave的exec_master_log_pos(sql寫線程)不變化,seconds_behind_master的值卻越來越大,導致同步落後越來越多。

      解決辦法:寫一個存儲過程,每次刪除1000條,直至刪除完成。存儲過程以後完善。


      內容來源於mysql管理之道(第四章)手打。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章