如果針對 PRIVILEGE_CHECKS_USER
帳戶的權限檢查失敗,則不會執行交易,且該通道的複製會停止。錯誤詳細資料和上次套用的交易會記錄在 Performance Schema 的 replication_applier_status_by_worker
資料表中。請依照下列程序從錯誤中復原
找出導致錯誤的複製事件,並驗證事件是否為預期的,以及是否來自受信任的來源。您可以使用 mysqlbinlog 來擷取並顯示發生錯誤前後記錄的事件。如需執行此操作的指示,請參閱 第 9.5 節,「時間點 (增量) 復原」。
如果複製的事件並非預期,或並非來自已知且受信任的來源,請調查原因。如果您可以找出事件發生的原因,且沒有安全考量,請繼續修正錯誤,如下所述。
如果應該允許
PRIVILEGE_CHECKS_USER
帳戶執行交易,但組態錯誤,請將遺失的權限授與該帳戶,使用FLUSH PRIVILEGES
陳述式或執行 mysqladmin flush-privileges 或 mysqladmin reload 命令來重新載入授與資料表,然後重新啟動該通道的複製。如果需要執行交易,且您已驗證它是受信任的,但
PRIVILEGE_CHECKS_USER
帳戶正常情況下不應擁有此權限,您可以暫時將必要的權限授與PRIVILEGE_CHECKS_USER
帳戶。套用複製的事件後,請從帳戶中移除權限,並採取任何必要步驟,以確保該事件不會再次發生 (如果可以避免)。如果交易是僅應在來源端執行,而不應在複本上執行的管理動作,或是僅應在單一複寫群組成員上執行,請在停止複寫的伺服器上略過該交易,然後發出
START REPLICA
來重新啟動通道上的複寫。為避免未來發生這種情況,您可以在執行這些管理語句之前先發出SET sql_log_bin = 0
,執行之後再發出SET sql_log_bin = 1
,使其不會記錄在來源端。如果交易是 DDL 或 DML 語句,不應在來源端或複本上執行,請在停止複寫的伺服器上略過該交易,在原始執行的伺服器上手動還原該交易,然後發出
START REPLICA
來重新啟動複寫。
若要略過交易,如果正在使用 GTID,請提交一個具有失敗交易的 GTID 的空交易,例如
SET GTID_NEXT='aaa-bbb-ccc-ddd:N';
BEGIN;
COMMIT;
SET GTID_NEXT='AUTOMATIC';
如果未使用 GTID,請發出 SET GLOBAL sql_replica_skip_counter
語句以略過該事件。如需使用此替代方法以及更多關於略過交易的詳細資訊,請參閱第 19.1.7.3 節,「略過交易」。