如果一個語句在來源和副本上產生相同的錯誤(相同的錯誤碼),則會記錄該錯誤,但複製會繼續。
如果一個語句在來源和副本上產生不同的錯誤,則複製 SQL 執行緒會終止,並且副本會將訊息寫入其錯誤日誌,並等待資料庫管理員決定如何處理該錯誤。這包括語句在來源或副本上產生錯誤,但兩者都不是的情況。若要解決此問題,請手動連線到副本並判斷問題的原因。SHOW REPLICA STATUS
對此很有用。然後修正問題並執行 START REPLICA
。例如,您可能需要先建立不存在的表格,才能再次啟動副本。
如果在副本的錯誤日誌中記錄了暫時性錯誤,您不一定需要採取引述錯誤訊息中建議的任何動作。暫時性錯誤應由重試交易的用戶端處理。例如,如果複製 SQL 執行緒記錄了與死結相關的暫時性錯誤,則您不需要在副本上手動重新啟動交易,除非複製 SQL 執行緒隨後終止並顯示非暫時性錯誤訊息。
如果這種錯誤碼驗證行為不理想,可以使用 --replica-skip-errors
選項遮罩(忽略)部分或全部錯誤。
對於諸如 MyISAM
之類的非交易儲存引擎,一個語句可能只會部分更新表格並傳回錯誤碼。例如,在多列插入中有一列違反索引鍵限制,或者如果長時間更新語句在更新部分列後被終止,就可能發生這種情況。如果這種情況發生在來源上,則副本會預期語句的執行會產生相同的錯誤碼。如果沒有,則複製 SQL 執行緒會如先前所述停止。
如果您在來源和複本上使用不同儲存引擎的資料表之間進行複寫,請記住,相同的語句在針對其中一個版本的資料表執行時可能會產生不同的錯誤,或者可能會導致其中一個版本的資料表產生錯誤,而另一個版本則不會。例如,由於 MyISAM
忽略外鍵約束,因此在來源上存取 InnoDB
資料表的 INSERT
或 UPDATE
語句可能會導致外鍵違規,但在複本上針對相同資料表的 MyISAM
版本執行相同的語句則不會產生此類錯誤,導致複寫停止。
複寫篩選規則會先套用,然後再進行任何權限或列格式檢查,這使得可以篩選掉任何驗證失敗的交易;對於已篩選掉的交易,不會執行檢查,因此也不會引發錯誤。這表示複本只能接受已授予指定使用者存取的資料庫部分(只要對資料庫此部分的任何更新使用以列為基礎的複寫格式)。這在執行升級或遷移到使用輸入複寫使用者無權存取的管理表格的系統或應用程式時可能很有幫助。另請參閱第 19.2.5 節「伺服器如何評估複寫篩選規則」。