mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge 10.5 into 10.6
This excludes commit040069f4ba
because it is specific to innodb_sync_debug, which had been removed in commitff5d306e29
.
This commit is contained in:
@@ -122,6 +122,31 @@ connection slave;
|
||||
# Slave_skipped_errros = 5
|
||||
**** We cannot execute a select as there are differences in the
|
||||
**** behavior between STMT and RBR.
|
||||
****
|
||||
**** Ensure transactions which are skipped due to encountering a
|
||||
**** non-deadlock error which is present in --slave-skip-errors result
|
||||
**** in partially committed transactions
|
||||
connection master;
|
||||
CREATE TABLE t3 (a INT UNIQUE) ENGINE=InnoDB;
|
||||
connection slave;
|
||||
connection slave;
|
||||
INSERT INTO t3 VALUES (3);
|
||||
connection master;
|
||||
BEGIN;
|
||||
INSERT INTO t3 VALUES (1);
|
||||
INSERT INTO t3 VALUES (2);
|
||||
INSERT INTO t3 VALUES (3);
|
||||
INSERT INTO t3 VALUES (4);
|
||||
COMMIT;
|
||||
connection slave;
|
||||
**** Master and slave tables should have the same data, due to the
|
||||
**** partially replicated transaction's data overlapping with the data
|
||||
**** that pre-existed on the slave. That is, despite the transaction
|
||||
**** consisting of 4 statements, the errored statement should be ignored
|
||||
**** and the other 3 should commit successfully.
|
||||
include/diff_tables.inc [master:t3,slave:t3]
|
||||
connection master;
|
||||
DROP TABLE t3;
|
||||
==== Clean Up ====
|
||||
connection master;
|
||||
DROP TABLE t1;
|
||||
|
64
mysql-test/suite/rpl/r/rpl_temporary_error2_skip_all.result
Normal file
64
mysql-test/suite/rpl/r/rpl_temporary_error2_skip_all.result
Normal file
@@ -0,0 +1,64 @@
|
||||
include/master-slave.inc
|
||||
[connection master]
|
||||
call mtr.add_suppression("Deadlock found when trying to get lock; try restarting transaction");
|
||||
*** Provoke a deadlock on the slave, check that transaction retry succeeds. ***
|
||||
connection master;
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
|
||||
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
|
||||
INSERT INTO t1(a) VALUES (1), (2), (3), (4), (5);
|
||||
connection slave;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a b
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
4 NULL
|
||||
5 NULL
|
||||
SET sql_log_bin=0;
|
||||
ALTER TABLE t2 ENGINE=MyISAM;
|
||||
SET sql_log_bin=1;
|
||||
connect con_temp1,127.0.0.1,root,,test,$SERVER_MYPORT_2,;
|
||||
connection con_temp1;
|
||||
BEGIN;
|
||||
UPDATE t1 SET b=2 WHERE a=4;
|
||||
INSERT INTO t2 VALUES (2);
|
||||
DELETE FROM t2 WHERE a=2;
|
||||
connection master;
|
||||
BEGIN;
|
||||
UPDATE t1 SET b=1 WHERE a=2;
|
||||
INSERT INTO t2 VALUES (1);
|
||||
UPDATE t1 SET b=1 WHERE a=4;
|
||||
COMMIT;
|
||||
connection slave;
|
||||
connection con_temp1;
|
||||
UPDATE t1 SET b=2 WHERE a=2;
|
||||
SELECT * FROM t1 WHERE a<10 ORDER BY a;
|
||||
a b
|
||||
1 NULL
|
||||
2 2
|
||||
3 NULL
|
||||
4 2
|
||||
5 NULL
|
||||
ROLLBACK;
|
||||
Warnings:
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
connection slave;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a b
|
||||
1 NULL
|
||||
2 NULL
|
||||
3 NULL
|
||||
4 NULL
|
||||
5 NULL
|
||||
* There will be one row in t2 because the ignored deadlock does not retry.
|
||||
SELECT * FROM t2 ORDER BY a;
|
||||
a
|
||||
1
|
||||
retries
|
||||
0
|
||||
Last_SQL_Errno = '0'
|
||||
Last_SQL_Error = ''
|
||||
connection master;
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
include/rpl_end.inc
|
@@ -42,7 +42,7 @@ insert into ti set a=null;
|
||||
insert into tm set a=null;
|
||||
|
||||
set @@global.debug_dbug="+d,crash_before_send_xid";
|
||||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
|
||||
connection slave;
|
||||
let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1);
|
||||
@@ -64,7 +64,7 @@ connection master;
|
||||
--enable_reconnect
|
||||
--let $rpl_server_number=1
|
||||
--source include/rpl_start_server.inc
|
||||
#--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
#--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
--source include/wait_until_connected_again.inc
|
||||
--echo # Master has restarted successfully
|
||||
save_master_pos;
|
||||
|
@@ -47,7 +47,7 @@ RESET SLAVE;
|
||||
--echo #
|
||||
|
||||
--let $datadir = `select @@datadir`
|
||||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
|
||||
--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
|
||||
--shutdown_server 10
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
@@ -64,7 +64,7 @@ RESET SLAVE;
|
||||
--echo # Restart slave server
|
||||
--echo #
|
||||
|
||||
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
|
||||
--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
|
||||
--enable_reconnect
|
||||
--source include/wait_until_connected_again.inc
|
||||
SET @save_slave_parallel_threads= @@GLOBAL.slave_parallel_threads;
|
||||
|
@@ -3,7 +3,11 @@
|
||||
# Verify that --slave-skip-errors works correctly. The error messages
|
||||
# specified by --slave-skip-errors on slave should be ignored. If
|
||||
# such errors occur, they should not be reported and not cause the
|
||||
# slave to stop.
|
||||
# slave to stop. If a skipped-due-to-error statement is a part of a
|
||||
# larger transaction, and the error is not a deadlock error, the rest
|
||||
# of the transaction should still commit, with just the errored statement
|
||||
# ignored (note transactions which are skipped due to deadlocks are
|
||||
# rolled back fully, see rpl_temporary_error2_skip_all.test).
|
||||
#
|
||||
# ==== Method ====
|
||||
#
|
||||
@@ -164,6 +168,42 @@ let $current_skipped_error= query_get_value(show global status like "Slave_skipp
|
||||
--echo **** We cannot execute a select as there are differences in the
|
||||
--echo **** behavior between STMT and RBR.
|
||||
|
||||
|
||||
--echo ****
|
||||
--echo **** Ensure transactions which are skipped due to encountering a
|
||||
--echo **** non-deadlock error which is present in --slave-skip-errors result
|
||||
--echo **** in partially committed transactions
|
||||
# Slave will insert 3 first, and master will insert 3 within a larger trx
|
||||
--let $value_preexisting_on_slave= 3
|
||||
|
||||
--connection master
|
||||
CREATE TABLE t3 (a INT UNIQUE) ENGINE=InnoDB;
|
||||
|
||||
--sync_slave_with_master
|
||||
--connection slave
|
||||
--eval INSERT INTO t3 VALUES ($value_preexisting_on_slave)
|
||||
|
||||
--connection master
|
||||
BEGIN;
|
||||
INSERT INTO t3 VALUES (1);
|
||||
INSERT INTO t3 VALUES (2);
|
||||
--eval INSERT INTO t3 VALUES ($value_preexisting_on_slave)
|
||||
INSERT INTO t3 VALUES (4);
|
||||
COMMIT;
|
||||
--sync_slave_with_master
|
||||
|
||||
--echo **** Master and slave tables should have the same data, due to the
|
||||
--echo **** partially replicated transaction's data overlapping with the data
|
||||
--echo **** that pre-existed on the slave. That is, despite the transaction
|
||||
--echo **** consisting of 4 statements, the errored statement should be ignored
|
||||
--echo **** and the other 3 should commit successfully.
|
||||
let $diff_tables=master:t3,slave:t3;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
--connection master
|
||||
DROP TABLE t3;
|
||||
|
||||
|
||||
--echo ==== Clean Up ====
|
||||
|
||||
connection master;
|
||||
|
@@ -82,7 +82,7 @@ print FILE "failure";
|
||||
close ($file);
|
||||
EOF
|
||||
|
||||
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
|
||||
--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
|
||||
SET SESSION debug_dbug="d,crash_before_rotate_relaylog";
|
||||
--error 2013
|
||||
FLUSH LOGS;
|
||||
@@ -130,7 +130,7 @@ print FILE @content;
|
||||
close FILE;
|
||||
EOF
|
||||
|
||||
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
|
||||
--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
|
||||
SET SESSION debug_dbug="d,crash_before_rotate_relaylog";
|
||||
--error 2013
|
||||
FLUSH LOGS;
|
||||
|
@@ -64,7 +64,14 @@ ROLLBACK;
|
||||
--connection slave
|
||||
--sync_with_master
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
--echo * There will be two rows in t2 due to the retry.
|
||||
if (!$ignored_db_deadlock)
|
||||
{
|
||||
--echo * There will be two rows in t2 due to the retry.
|
||||
}
|
||||
if ($ignored_db_deadlock)
|
||||
{
|
||||
--echo * There will be one row in t2 because the ignored deadlock does not retry.
|
||||
}
|
||||
SELECT * FROM t2 ORDER BY a;
|
||||
let $new_retry= query_get_value(SHOW STATUS LIKE 'Slave_retried_transactions', Value, 1);
|
||||
--disable_query_log
|
||||
|
@@ -0,0 +1 @@
|
||||
--slave-skip-errors=all
|
@@ -0,0 +1,3 @@
|
||||
--source include/have_binlog_format_row.inc
|
||||
--let $ignored_db_deadlock= 1
|
||||
--source rpl_temporary_error2.test
|
Reference in New Issue
Block a user