diff -Naur sql/slave.cc sql/slave.cc --- sql/slave.cc 2011-08-31 19:22:46.000000000 +0200 +++ sql/slave.cc 2011-10-22 18:18:02.000000000 +0200 @@ -2034,7 +2034,10 @@ slave threads, since a replication event can become this much larger than the corresponding packet (query) sent from client to master. */ - thd->variables.max_allowed_packet= global_system_variables.max_allowed_packet + //thd->variables.max_allowed_packet= global_system_variables.max_allowed_packet + // + MAX_LOG_EVENT_HEADER; /* note, incr over the global not session var */ + thd->variables.max_allowed_packet= max(global_system_variables.max_allowed_packet, + global_system_variables.replicate_max_allowed_packet) + MAX_LOG_EVENT_HEADER; /* note, incr over the global not session var */ thd->slave_thread = 1; thd->enable_slow_log= opt_log_slow_slave_statements; @@ -2785,7 +2788,10 @@ thread, since a replication event can become this much larger than the corresponding packet (query) sent from client to master. */ - mysql->net.max_packet_size= thd->net.max_packet_size+= MAX_LOG_EVENT_HEADER; + //mysql->net.max_packet_size= thd->net.max_packet_size+= MAX_LOG_EVENT_HEADER; + mysql->net.max_packet_size = max(thd->net.max_packet_size, + global_system_variables.replicate_max_allowed_packet) + + MAX_LOG_EVENT_HEADER; } else { diff -Naur sql/sql_class.h sql/sql_class.h --- sql/sql_class.h 2011-08-31 19:22:46.000000000 +0200 +++ sql/sql_class.h 2011-10-22 18:08:09.000000000 +0200 @@ -460,6 +460,7 @@ ulong join_buff_size; ulong lock_wait_timeout; ulong max_allowed_packet; + ulong replicate_max_allowed_packet; ulong max_error_count; ulong max_length_for_sort_data; ulong max_sort_length; diff -Naur sql/sql_repl.cc sql/sql_repl.cc --- sql/sql_repl.cc 2011-07-13 21:09:03.000000000 +0200 +++ sql/sql_repl.cc 2011-10-22 18:19:37.000000000 +0200 @@ -587,7 +587,10 @@ this larger than the corresponding packet (query) sent from client to master. */ - thd->variables.max_allowed_packet+= MAX_LOG_EVENT_HEADER; + //thd->variables.max_allowed_packet+= MAX_LOG_EVENT_HEADER; + thd->variables.max_allowed_packet = max(thd->variables.max_allowed_packet, + thd->variables.replicate_max_allowed_packet) + + MAX_LOG_EVENT_HEADER; /* We can set log_lock now, it does not move (it's a member of @@ -1787,7 +1790,10 @@ /* to account binlog event header size */ - thd->variables.max_allowed_packet += MAX_LOG_EVENT_HEADER; + //thd->variables.max_allowed_packet += MAX_LOG_EVENT_HEADER; + thd->variables.max_allowed_packet = max(thd->variables.max_allowed_packet, + thd->variables.replicate_max_allowed_packet) + + MAX_LOG_EVENT_HEADER; mysql_mutex_lock(log_lock); diff -Naur sql/sys_vars.cc sql/sys_vars.cc --- sql/sys_vars.cc 2011-08-31 19:22:46.000000000 +0200 +++ sql/sys_vars.cc 2011-10-22 18:05:27.000000000 +0200 @@ -1058,6 +1058,31 @@ BLOCK_SIZE(1024), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_max_allowed_packet)); +static bool +check_replicate_max_allowed_packet(sys_var *self, THD *thd, set_var *var) +{ + longlong val; + if (session_readonly(self, thd, var)) + return true; + + val= var->save_result.ulonglong_value; + if (val < (longlong) global_system_variables.max_allowed_packet) + { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + WARN_OPTION_BELOW_LIMIT, ER(WARN_OPTION_BELOW_LIMIT), + "replicate_max_allowed_packet", "max_allowed_packet"); + } + return false; +} + +static Sys_var_ulong Sys_replicate_max_allowed_packet( + "replicate_max_allowed_packet", + "Max packet length to send to or receive from the server for replication threads", + SESSION_VAR(replicate_max_allowed_packet), CMD_LINE(REQUIRED_ARG), + VALID_RANGE(1024, 1024*1024*1024), DEFAULT(1024*1024), + BLOCK_SIZE(1024), NO_MUTEX_GUARD, NOT_IN_BINLOG, + ON_CHECK(check_replicate_max_allowed_packet)); + static Sys_var_ulonglong Sys_max_binlog_cache_size( "max_binlog_cache_size", "Sets the total size of the transactional cache",