快速簡單的解決辦法:根據錯誤日誌情況,簡單快速確認故障點,然後確認是否可以跳過這個錯誤,跳過錯誤的方法是: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管理之道(第四章)手打。