16.4.1.19 Репликация и max_allowed_packet
max_allowed_packet устанавливает верхний предел размера любого отдельного сообщения между сервером MySQL и клиентами, включая реплики. Если вы реплицируете большие значения столбцов (например, такие, как можно найти в TEXT или BLOB столбцах) и max_allowed_packet слишком мал на источнике, источник терпит ошибку, а реплика останавливает реплицирующий поток I/O. Если max_allowed_packet слишком мал на реплике, это также приводит к остановке реплицирующего потока I/O репликой.
Репликация на основе строк отправляет все столбцы и значения столбцов для обновленных строк с источника на реплику, включая значения столбцов, которые фактически не были изменены обновлением. Это означает, что при репликации больших значений столбцов с помощью репликации на основе строк необходимо установить max_allowed_packet достаточно большим, чтобы вместить самую большую строку в любой таблице, подлежащей репликации, даже если вы реплицируете только обновления или вставляете только относительно небольшие значения.
На многопоточной реплике (slave_parallel_workers > 0) убедитесь, что системная переменная slave_pending_jobs_size_max установлена в значение, равное или большее, чем значение для системной переменной max_allowed_packet на источнике. Значение по умолчанию для slave_pending_jobs_size_max, 128М, вдвое превышает значение по умолчанию для max_allowed_packet, которое составляет 64М. max_allowed_packet ограничивает размер пакета, который источник может отправлять, но добавление заголовка события может привести к созданию события журнала двоичных логов, превышающего этот размер. Кроме того, в репликации на основе строк одно событие может быть значительно больше размера max_allowed_packet, поскольку значение max_allowed_packet ограничивает только каждый столбец таблицы.
Реплика фактически принимает пакеты до предела, установленного её настройкой slave_max_allowed_packet, которая по умолчанию устанавливается в максимальное значение 1 ГБ, чтобы предотвратить сбой репликации из-за большого пакета. Однако значение slave_pending_jobs_size_max управляет доступной памятью на реплике для хранения входящих пакетов. Указанная память разделяется между всеми очередями рабочих процессов реплики.
Значение slave_pending_jobs_size_max является мягким ограничением, и если необычно большое событие (состоящее из одного или нескольких пакетов) превышает этот размер, транзакция приостанавливается до тех пор, пока все рабочие процессы реплики не освободят свои очереди, а затем обрабатывается. Все последующие транзакции приостанавливаются до завершения большой транзакции. Поэтому, хотя необычные события, превышающие slave_pending_jobs_size_max, могут обрабатываться, задержка для очистки очередей всех рабочих процессов реплики и ожидание для очереди последующих транзакций может вызвать задержку на реплике и снизить конкуретность рабочих процессов реплики. slave_pending_jobs_size_max следует устанавливать достаточно высоким, чтобы вместить большинство ожидаемых размеров событий.
© 2025 Oracle
Licensed under the GPLv2 License.