
MySQL 的各參數的值設置需根據操作系統硬件情況,操作系統參數情況及數據庫其他參數情況而進行調整,本文將結合生成環境的異常情況介紹MySQL
slave_pending_jobs_size_max參數調整實踐。
1、異常描述
之前負責的生產環境上從庫出現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。
2、異常處理步驟如下:
(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大。