mirror of
https://github.com/MariaDB/server.git
synced 2026-05-15 19:37:16 +02:00
BUG#12400221 - 60926: BINARY LOG EVENTS LARGER THAN MAX_ALLOWED_PACKET
Problem
========
Replication breaks in the cases if the event length exceeds
the size of master Dump thread's max_allowed_packet.
The reason why this failure is occuring is because the event length is
more than the total size of the max_allowed_packet, on addition of the
max_event_header length exceeds the max_allowed_packet of the DUMP thread.
This causes the Dump thread to break replication and throw an error.
That can happen e.g with row-based replication in Update_rows event.
Fix
====
The problem is fixed in 2 steps:
1.) The Dump thread limit to read event is increased to the upper limit
i.e. Dump thread reads whatever gets logged in the binary log.
2.) On the slave side we increase the the max_allowed_packet for the
slave's threads (IO/SQL) by increasing it to 1GB.
This is done using the new server option (slave_max_allowed_packet)
included, is used to regulate the max_allowed_packet of the
slave thread (IO/SQL) by the DBA, and facilitates the sending of
large packets from the master to the slave.
This causes the large packets to be received by the slave and apply
it successfully.
This commit is contained in:
commit
1211b5d50b
13 changed files with 355 additions and 20 deletions
|
|
@ -0,0 +1,139 @@
|
|||
SET @start_value = @@global.slave_max_allowed_packet;
|
||||
SELECT @start_value;
|
||||
@start_value
|
||||
1073741824
|
||||
'#--------------------FN_DYNVARS_072_01------------------------#'
|
||||
SET @@global.slave_max_allowed_packet = 5000;
|
||||
SET @@global.slave_max_allowed_packet = DEFAULT;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1073741824
|
||||
'#---------------------FN_DYNVARS_072_02-------------------------#'
|
||||
SET @@global.slave_max_allowed_packet = @start_value;
|
||||
SELECT @@global.slave_max_allowed_packet = 1073741824;
|
||||
@@global.slave_max_allowed_packet = 1073741824
|
||||
1
|
||||
'Bug# 34876: Incorrect Default Value is assigned to variable';
|
||||
'#--------------------FN_DYNVARS_072_03------------------------#'
|
||||
SET @@global.slave_max_allowed_packet = 1024;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1024
|
||||
SET @@global.slave_max_allowed_packet = 1073741824;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1073741824
|
||||
SET @@global.slave_max_allowed_packet = 1073741824;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1073741824
|
||||
SET @@global.slave_max_allowed_packet = 1025;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1024
|
||||
SET @@global.slave_max_allowed_packet = 65535;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
64512
|
||||
'Bug# 34877: Invalid Values are coming in variable on assigning valid values';
|
||||
'#--------------------FN_DYNVARS_072_04-------------------------#'
|
||||
SET @@global.slave_max_allowed_packet = -1;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_max_allowed_packet value: '-1'
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1024
|
||||
SET @@global.slave_max_allowed_packet = 100000000000;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_max_allowed_packet value: '100000000000'
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1073741824
|
||||
SET @@global.slave_max_allowed_packet = 10000.01;
|
||||
ERROR 42000: Incorrect argument type to variable 'slave_max_allowed_packet'
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1073741824
|
||||
SET @@global.slave_max_allowed_packet = -1024;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_max_allowed_packet value: '-1024'
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1024
|
||||
SET @@global.slave_max_allowed_packet = 4294967296;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_max_allowed_packet value: '4294967296'
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1073741824
|
||||
SET @@global.slave_max_allowed_packet = 1023;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_max_allowed_packet value: '1023'
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1024
|
||||
'Bug # 34837: Errors are not coming on assigning invalid values to variable';
|
||||
SET @@global.slave_max_allowed_packet = ON;
|
||||
ERROR 42000: Incorrect argument type to variable 'slave_max_allowed_packet'
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1024
|
||||
SET @@global.slave_max_allowed_packet = 'test';
|
||||
ERROR 42000: Incorrect argument type to variable 'slave_max_allowed_packet'
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1024
|
||||
'#-------------------FN_DYNVARS_072_05----------------------------#'
|
||||
SET @@session.slave_max_allowed_packet = 4096;
|
||||
ERROR HY000: Variable 'slave_max_allowed_packet' is a GLOBAL variable and should be set with SET GLOBAL
|
||||
SELECT @@session.slave_max_allowed_packet;
|
||||
ERROR HY000: Variable 'slave_max_allowed_packet' is a GLOBAL variable
|
||||
'#----------------------FN_DYNVARS_072_06------------------------#'
|
||||
SELECT @@global.slave_max_allowed_packet = VARIABLE_VALUE
|
||||
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
|
||||
WHERE VARIABLE_NAME='slave_max_allowed_packet';
|
||||
@@global.slave_max_allowed_packet = VARIABLE_VALUE
|
||||
1
|
||||
SELECT @@slave_max_allowed_packet = VARIABLE_VALUE
|
||||
FROM INFORMATION_SCHEMA.SESSION_VARIABLES
|
||||
WHERE VARIABLE_NAME='slave_max_allowed_packet';
|
||||
@@slave_max_allowed_packet = VARIABLE_VALUE
|
||||
1
|
||||
'#---------------------FN_DYNVARS_072_07----------------------#'
|
||||
SET @@global.slave_max_allowed_packet = TRUE;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_max_allowed_packet value: '1'
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1024
|
||||
SET @@global.slave_max_allowed_packet = FALSE;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect slave_max_allowed_packet value: '0'
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1024
|
||||
'#---------------------FN_DYNVARS_072_08----------------------#'
|
||||
SET @@global.slave_max_allowed_packet = 5000;
|
||||
SELECT @@slave_max_allowed_packet = @@global.slave_max_allowed_packet;
|
||||
@@slave_max_allowed_packet = @@global.slave_max_allowed_packet
|
||||
1
|
||||
'#---------------------FN_DYNVARS_072_09----------------------#'
|
||||
SET slave_max_allowed_packet = 6000;
|
||||
ERROR HY000: Variable 'slave_max_allowed_packet' is a GLOBAL variable and should be set with SET GLOBAL
|
||||
SELECT @@slave_max_allowed_packet;
|
||||
@@slave_max_allowed_packet
|
||||
4096
|
||||
SET local.slave_max_allowed_packet = 7000;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'slave_max_allowed_packet = 7000' at line 1
|
||||
SELECT local.slave_max_allowed_packet;
|
||||
ERROR 42S02: Unknown table 'local' in field list
|
||||
SET global.slave_max_allowed_packet = 8000;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'slave_max_allowed_packet = 8000' at line 1
|
||||
SELECT global.slave_max_allowed_packet;
|
||||
ERROR 42S02: Unknown table 'global' in field list
|
||||
SELECT slave_max_allowed_packet = @@session.slave_max_allowed_packet;
|
||||
ERROR 42S22: Unknown column 'slave_max_allowed_packet' in 'field list'
|
||||
SET @@global.slave_max_allowed_packet = @start_value;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
@@global.slave_max_allowed_packet
|
||||
1073741824
|
||||
177
mysql-test/suite/sys_vars/t/slave_max_allowed_packet_basic.test
Normal file
177
mysql-test/suite/sys_vars/t/slave_max_allowed_packet_basic.test
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
############## mysql-test\t\slave_max_allowed_packet_basic.test ##################
|
||||
# #
|
||||
# Variable Name: slave_max_allowed_packet #
|
||||
# Scope: GLOBAL #
|
||||
# Access Type: Dynamic #
|
||||
# Data Type: numeric #
|
||||
# Default Value:1073741824 #
|
||||
# Range: 1024 - 1073741824 #
|
||||
# #
|
||||
# #
|
||||
# #
|
||||
# Description: Test Cases of Dynamic System Variable slave_max_allowed_packet #
|
||||
# that checks the behavior of this variable in the following ways#
|
||||
# * Default Value #
|
||||
# * Valid & Invalid values #
|
||||
# * Scope & Access method #
|
||||
# * Data Integrity #
|
||||
# #
|
||||
###############################################################################
|
||||
|
||||
--source include/load_sysvars.inc
|
||||
|
||||
########################################################################
|
||||
# START OF slave_max_allowed_packet TESTS #
|
||||
########################################################################
|
||||
|
||||
|
||||
###########################################################################
|
||||
# Saving initial value of slave_max_allowed_packet in a temporary variable#
|
||||
###########################################################################
|
||||
|
||||
SET @start_value = @@global.slave_max_allowed_packet;
|
||||
SELECT @start_value;
|
||||
|
||||
|
||||
--echo '#--------------------FN_DYNVARS_072_01------------------------#'
|
||||
########################################################################
|
||||
# Display the DEFAULT value of slave_max_allowed_packet #
|
||||
########################################################################
|
||||
|
||||
SET @@global.slave_max_allowed_packet = 5000;
|
||||
SET @@global.slave_max_allowed_packet = DEFAULT;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
|
||||
|
||||
--echo '#---------------------FN_DYNVARS_072_02-------------------------#'
|
||||
###############################################
|
||||
# Verify default value of variable #
|
||||
###############################################
|
||||
|
||||
SET @@global.slave_max_allowed_packet = @start_value;
|
||||
SELECT @@global.slave_max_allowed_packet = 1073741824;
|
||||
--echo 'Bug# 34876: Incorrect Default Value is assigned to variable';
|
||||
|
||||
--echo '#--------------------FN_DYNVARS_072_03------------------------#'
|
||||
########################################################################
|
||||
# Change the value of slave_max_allowed_packet to a valid value #
|
||||
########################################################################
|
||||
|
||||
SET @@global.slave_max_allowed_packet = 1024;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
SET @@global.slave_max_allowed_packet = 1073741824;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
SET @@global.slave_max_allowed_packet = 1073741824;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
SET @@global.slave_max_allowed_packet = 1025;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
SET @@global.slave_max_allowed_packet = 65535;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
--echo 'Bug# 34877: Invalid Values are coming in variable on assigning valid values';
|
||||
|
||||
|
||||
--echo '#--------------------FN_DYNVARS_072_04-------------------------#'
|
||||
###########################################################################
|
||||
# Change the value of slave_max_allowed_packet to invalid value #
|
||||
###########################################################################
|
||||
|
||||
SET @@global.slave_max_allowed_packet = -1;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
SET @@global.slave_max_allowed_packet = 100000000000;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
--Error ER_WRONG_TYPE_FOR_VAR
|
||||
SET @@global.slave_max_allowed_packet = 10000.01;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
SET @@global.slave_max_allowed_packet = -1024;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
SET @@global.slave_max_allowed_packet = 4294967296;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
SET @@global.slave_max_allowed_packet = 1023;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
|
||||
--echo 'Bug # 34837: Errors are not coming on assigning invalid values to variable';
|
||||
|
||||
--Error ER_WRONG_TYPE_FOR_VAR
|
||||
SET @@global.slave_max_allowed_packet = ON;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
--Error ER_WRONG_TYPE_FOR_VAR
|
||||
SET @@global.slave_max_allowed_packet = 'test';
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
|
||||
|
||||
--echo '#-------------------FN_DYNVARS_072_05----------------------------#'
|
||||
###########################################################################
|
||||
# Test if accessing session slave_max_allowed_packet gives error #
|
||||
###########################################################################
|
||||
|
||||
--Error ER_GLOBAL_VARIABLE
|
||||
SET @@session.slave_max_allowed_packet = 4096;
|
||||
--Error ER_INCORRECT_GLOBAL_LOCAL_VAR
|
||||
SELECT @@session.slave_max_allowed_packet;
|
||||
|
||||
|
||||
--echo '#----------------------FN_DYNVARS_072_06------------------------#'
|
||||
##############################################################################
|
||||
# Check if the value in GLOBAL & SESSION Tables matches values in variable #
|
||||
##############################################################################
|
||||
|
||||
SELECT @@global.slave_max_allowed_packet = VARIABLE_VALUE
|
||||
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
|
||||
WHERE VARIABLE_NAME='slave_max_allowed_packet';
|
||||
|
||||
SELECT @@slave_max_allowed_packet = VARIABLE_VALUE
|
||||
FROM INFORMATION_SCHEMA.SESSION_VARIABLES
|
||||
WHERE VARIABLE_NAME='slave_max_allowed_packet';
|
||||
|
||||
|
||||
--echo '#---------------------FN_DYNVARS_072_07----------------------#'
|
||||
###################################################################
|
||||
# Check if TRUE and FALSE values can be used on variable #
|
||||
###################################################################
|
||||
|
||||
SET @@global.slave_max_allowed_packet = TRUE;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
SET @@global.slave_max_allowed_packet = FALSE;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
|
||||
|
||||
--echo '#---------------------FN_DYNVARS_072_08----------------------#'
|
||||
########################################################################################################
|
||||
# Check if accessing variable with SESSION,LOCAL and without SCOPE points to same session variable #
|
||||
########################################################################################################
|
||||
|
||||
SET @@global.slave_max_allowed_packet = 5000;
|
||||
SELECT @@slave_max_allowed_packet = @@global.slave_max_allowed_packet;
|
||||
|
||||
|
||||
--echo '#---------------------FN_DYNVARS_072_09----------------------#'
|
||||
################################################################################
|
||||
# Check if slave_max_allowed_packet can be accessed with and without @@ sign #
|
||||
################################################################################
|
||||
|
||||
--Error ER_GLOBAL_VARIABLE
|
||||
SET slave_max_allowed_packet = 6000;
|
||||
SELECT @@slave_max_allowed_packet;
|
||||
--Error ER_PARSE_ERROR
|
||||
SET local.slave_max_allowed_packet = 7000;
|
||||
--Error ER_UNKNOWN_TABLE
|
||||
SELECT local.slave_max_allowed_packet;
|
||||
--Error ER_PARSE_ERROR
|
||||
SET global.slave_max_allowed_packet = 8000;
|
||||
--Error ER_UNKNOWN_TABLE
|
||||
SELECT global.slave_max_allowed_packet;
|
||||
--Error ER_BAD_FIELD_ERROR
|
||||
SELECT slave_max_allowed_packet = @@session.slave_max_allowed_packet;
|
||||
|
||||
|
||||
##############################
|
||||
# Restore initial value #
|
||||
##############################
|
||||
|
||||
SET @@global.slave_max_allowed_packet = @start_value;
|
||||
SELECT @@global.slave_max_allowed_packet;
|
||||
|
||||
|
||||
########################################################################
|
||||
# END OF slave_max_allowed_packet TESTS #
|
||||
########################################################################
|
||||
Loading…
Add table
Add a link
Reference in a new issue