如果對 PRIVILEGE_CHECKS_USER
帳戶的權限檢查失敗,則不會執行交易,並且該通道的複寫會停止。錯誤的詳細資訊和最後套用的交易會記錄在效能結構描述 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,「略過交易」。