今天生產環境上從庫出現SQL進程停止的異常,錯誤信息如下:
Slave_IO_Running: Yes Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1864 Last_Error: Cannot schedule event Write_rows, relay-log name ./mysql-relay-bin.001304, position 416228895 to Worker thread because its size 16777357 exceeds 16777216 of slave_pending_jobs_size_max.
從報錯信息可以看出,是因為slave_pending_jobs_size_max的大小小於當前需要執行事件所需的內存大小。經查看,slave_pending_jobs_size_max的大小設置的是默認值16777216
(即16M),小於16777357。
異常處理步驟如下:
1.查看主庫max_allowed_packet的大小;
mysql> show variables like 'max_allowed_packet'; -- 134217728 即128M +--------------------+-----------+ | Variable_name | Value | +--------------------+-----------+ | max_allowed_packet | 134217728 | +--------------------+-----------+
2. 設置從庫slave_pending_jobs_size_max的大小,注意,需要大於主庫max_allowed_packet的大小
mysql> stop slave; Query OK, 0 rows affected (0.01 sec) mysql> set global slave_pending_jobs_size_max=157286400; Query OK, 0 rows affected (0.00 sec) mysql> start slave; Query OK, 0 rows affected (0.05 sec)
3.處理完畢檢查一下主從同步情況
mysql> show slave status\G
Tips:
slave_pending_jobs_size_max的用途:
在多線程復制時,在隊列中Pending的事件所占用的最大內存,默認為16M,如果內存富余,或者延遲較大時,可以適當調大;注意這個值要比主庫的max_allowed_packet大
耿小廚已開通個人微信公眾號,想進一步溝通或想了解其他文章的同學可以關注我