mirror of
https://github.com/MariaDB/server.git
synced 2025-07-04 01:23:45 +03:00
Problem: Statements that write to tables with auto_increment columns based on the selection from another table, may lead to master and slave going out of sync, as the order in which the rows are retrieved from the table may differ on master and slave. Solution: We mark writing to a table with auto_increment table based on the rows selected from another table as unsafe. This will cause the execution of such statements to throw a warning and forces the statement to be logged in ROW if the logging format is mixed. Changes: 1. All the statements that writes to a table with auto_increment column(s) based on the rows fetched from another table, will now be unsafe. 2. CREATE TABLE with SELECT will now be unsafe. sql/share/errmsg-utf8.txt: Added new warning messages. sql/sql_base.cc: -Created function to check statements that write to tables with auto_increment column and has select. -Marked all the statements that write to a table with auto_increment column based on rows fetched from other table(s) as unsafe. sql/sql_table.cc: mark CREATE TABLE[with auto_increment column] as unsafe.
113 lines
3.0 KiB
Plaintext
113 lines
3.0 KiB
Plaintext
source include/have_semisync_plugin.inc;
|
|
source include/not_embedded.inc;
|
|
source include/master-slave.inc;
|
|
source include/have_innodb.inc;
|
|
|
|
let $engine_type= InnoDB;
|
|
|
|
# Suppress warnings that might be generated during the test
|
|
disable_query_log;
|
|
connection master;
|
|
call mtr.add_suppression("Timeout waiting for reply of binlog");
|
|
call mtr.add_suppression("Semi-sync master .* waiting for slave reply");
|
|
call mtr.add_suppression("Read semi-sync reply");
|
|
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.");
|
|
connection slave;
|
|
call mtr.add_suppression("Master server does not support semi-sync");
|
|
call mtr.add_suppression("Semi-sync slave .* reply");
|
|
call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group");
|
|
enable_query_log;
|
|
|
|
connection master;
|
|
disable_query_log;
|
|
let $value = query_get_value(show variables like 'rpl_semi_sync_master_enabled', Value, 1);
|
|
if ($value == No such row)
|
|
{
|
|
set sql_log_bin=0;
|
|
eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_PLUGIN';
|
|
SET GLOBAL rpl_semi_sync_master_enabled = 1;
|
|
set sql_log_bin=1;
|
|
}
|
|
enable_query_log;
|
|
|
|
connection slave;
|
|
source include/stop_slave.inc;
|
|
|
|
disable_query_log;
|
|
let $value= query_get_value(show variables like 'rpl_semi_sync_slave_enabled', Value, 1);
|
|
if ($value == No such row)
|
|
{
|
|
set sql_log_bin=0;
|
|
eval INSTALL PLUGIN rpl_semi_sync_slave SONAME '$SEMISYNC_SLAVE_PLUGIN';
|
|
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
|
|
set sql_log_bin=1;
|
|
}
|
|
enable_query_log;
|
|
|
|
source include/start_slave.inc;
|
|
|
|
connection master;
|
|
SET GLOBAL event_scheduler = ON;
|
|
|
|
replace_result $engine_type ENGINE_TYPE;
|
|
eval CREATE TABLE t1 (i INT NOT NULL AUTO_INCREMENT PRIMARY KEY, f varchar(8)) ENGINE=$engine_type;
|
|
INSERT INTO t1 (f) VALUES ('a'),('a'),('a'),('a'),('a');
|
|
--disable_warnings
|
|
INSERT INTO t1 SELECT i+5, f FROM t1;
|
|
INSERT INTO t1 SELECT i+10, f FROM t1;
|
|
--enable_warnings
|
|
CREATE EVENT ev1 ON SCHEDULE EVERY 1 SECOND
|
|
DO INSERT INTO t1 VALUES (SLEEP(5),CONCAT('ev1_',CONNECTION_ID()));
|
|
CREATE EVENT ev2 ON SCHEDULE EVERY 1 SECOND
|
|
DO INSERT INTO t1 VALUES (SLEEP(5),CONCAT('ev2_',CONNECTION_ID()));
|
|
|
|
connection slave;
|
|
STOP SLAVE IO_THREAD;
|
|
|
|
connection master;
|
|
let $run = 20;
|
|
while ($run)
|
|
{
|
|
connect (m$run,localhost,root,,);
|
|
connection m$run;
|
|
send;
|
|
eval UPDATE t1 SET f = CONCAT('up_',CONNECTION_ID()) WHERE i = $run;
|
|
connection master;
|
|
dec $run;
|
|
}
|
|
|
|
connection master;
|
|
SET GLOBAL event_scheduler = OFF;
|
|
|
|
let $run = 20;
|
|
while ($run)
|
|
{
|
|
connection m$run;
|
|
reap;
|
|
disconnect m$run;
|
|
dec $run;
|
|
}
|
|
|
|
#
|
|
# Clean up
|
|
#
|
|
connection slave;
|
|
source include/stop_slave.inc;
|
|
|
|
disable_warnings;
|
|
UNINSTALL PLUGIN rpl_semi_sync_slave;
|
|
|
|
connection master;
|
|
UNINSTALL PLUGIN rpl_semi_sync_master;
|
|
enable_warnings;
|
|
|
|
connection slave;
|
|
source include/start_slave.inc;
|
|
|
|
connection master;
|
|
DROP EVENT ev1;
|
|
DROP EVENT ev2;
|
|
DROP TABLE t1;
|
|
sync_slave_with_master;
|
|
--source include/rpl_end.inc
|