MySQL 参数slave_pending_jobs_size_max设置
今天生产环境上从库出现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大
耿小厨已开通个人微信公众号,想进一步沟通或想了解其他文章的同学可以关注我