本文將結(jié)合生成環(huán)境的異常情況介紹MySQL中Slave_Pending_Jobs_Size_Max參數(shù)調(diào)整實(shí)踐。

MySQL 的各參數(shù)的值設(shè)置需根據(jù)操作系統(tǒng)硬件情況,操作系統(tǒng)參數(shù)情況及數(shù)據(jù)庫(kù)其他參數(shù)情況而進(jìn)行調(diào)整,本文將結(jié)合生成環(huán)境的異常情況介紹MySQL
slave_pending_jobs_size_max參數(shù)調(diào)整實(shí)踐。
1、異常描述
之前負(fù)責(zé)的生產(chǎn)環(huán)境上從庫(kù)出現(xiàn)SQL進(jìn)程停止的異常,錯(cuò)誤信息如下:
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.
從報(bào)錯(cuò)信息可以看出,是因?yàn)閟lave_pending_jobs_size_max的大小小于當(dāng)前需要執(zhí)行事件所需的內(nèi)存大小。經(jīng)查看,slave_pending_jobs_size_max的大小設(shè)置的是默認(rèn)值16777216(即16M),小于16777357。
2、異常處理步驟如下:
(1)查看主庫(kù)max_allowed_packet的大小
mysql> show variables like 'max_allowed_packet'; -- 134217728 即128M
+--------------------+-----------+
| Variable_name | Value |
+--------------------+-----------+
| max_allowed_packet | 134217728 |
+--------------------+-----------+

(2)設(shè)置從庫(kù)slave_pending_jobs_size_max的大小
注意,需要大于主庫(kù)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的用途:
在多線程復(fù)制時(shí),在隊(duì)列中Pending的事件所占用的最大內(nèi)存,默認(rèn)為16M,如果內(nèi)存富余,或者延遲較大時(shí),可以適當(dāng)調(diào)大;注意這個(gè)值要比主庫(kù)的max_allowed_packet大。