某日發現 Slave Seconds_Behind_Master 持續增長,但 Slave_IO_Running、Slave_SQL_Running 均為 Yes。重啟後延遲歸零,但隔天再次發生。排查 Master 狀態正常,Binlog 位點持續推進。
用 mysqlbinlog --base64-output=decode-rows -v 解析 Relay Log,發現單次 DELETE 操作產生 70 萬行變更,導致單個 Binlog Event 超過 max_allowed_packet 限制。Slave I/O 線程讀取時觸發錯誤:
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log:
'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master'
max_allowed_packet 控制單包大小上限(預設 4MB/64MB 視版本)。BLOB/TEXT)會產生超大 Event,超過限制導致 I/O 線程中斷,SQL 線程因無新 Relay Log 而空轉,表面狀態仍為 Yes。STOP SLAVE;
SET GLOBAL max_allowed_packet = 1073741824; -- 1GB,視業務調整
START SLAVE;
同步恢復後,手動清理 Slave 殘留數據。
SLEEP(0.1)。max_allowed_packet=1G,slave_max_allowed_packet(5.6+)同步調大。Slave_IO_Running、Last_IO_Error、Binlog 事件大小分佈。mysqldump、mysqlbinlog 等工具亦受限,需加 --max-allowed-packet 參數。slave_max_allowed_packet 專門控制 Slave 接收上限,預設 1GB,建議與 Master 保持一致。「Slave 狀態全 Yes 卻不同步」是典型的 max_allowed_packet 受限信號。大事務拆分與參數同步調大是標準解法,切勿盲目跳過事務(SQL_SLAVE_SKIP_COUNTER)導致數據不一致。