summaryrefslogtreecommitdiff
path: root/mysql-test/suite/rpl/t/rpl_skip_error.test
blob: d3ef834e8ec0493036dfad7404e404569f921e42 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# ==== Purpose ====
#
# 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.
#
# ==== Method ====
#
# We run the slave with --slave-skip-errors=1062 (the code for
# duplicate key).  Then we have two set of tests. In the first 
# set, we insert value 1 in a table on the slave, and then, on 
# master, we insert value 1 in the table. In the second set, we 
# insert several values on the master, disable the binlog and
# delete one of the values and re-enable the binlog. Right after,
# we perform an update on the set of values in order to generate
# a duplicate key on the slave. The errors should be ignored on
# the slave.
# 
# ==== Related bugs ====
#
# BUG#28839: Errors in strict mode silently stop SQL thread if --slave-skip-errors exists
# bug in this test: BUG#30594: rpl.rpl_skip_error is nondeterministic:
# BUG#39393: slave-skip-errors does not work when using ROW based replication

source include/have_innodb.inc;
source include/master-slave.inc;

--connection slave
let $initial_skipped_error= query_get_value(show global status like "Slave_skipped_errors", Value, 1);

connection master;
--echo ==== Test Without sql_mode=strict_trans_tables ====

create table t1 (n int not null primary key);

sync_slave_with_master;
insert into t1 values (1);

connection master;
# Here we expect (ignored) error, since 1 is already in slave table 
insert into t1 values (1);
# These should work fine
insert into t1 values (2),(3);

sync_slave_with_master;
select * from t1 order by n;

--echo ==== Test With sql_mode=strict_trans_tables ====
insert into t1 values (7),(8);
connection master;
set sql_mode=strict_trans_tables;
insert into t1 values (7), (8), (9);
sync_slave_with_master;
select * from t1 order by n;
source include/check_slave_is_running.inc;

--echo ==== Clean Up ====
connection master;
drop table t1;
sync_slave_with_master;
# End of 4.1 tests

#
# #28839 Errors in strict mode silently stop SQL thread if --slave-skip-errors exists
#
connection master;
create table t1(a int primary key);
insert into t1 values (1),(2);
SET SQL_LOG_BIN=0;
delete from t1;
SET SQL_LOG_BIN=1;
set sql_mode=strict_trans_tables;
insert into t1 values (1), (2), (3);

sync_slave_with_master;
select * from t1;
source include/check_slave_is_running.inc;


--echo ==== Clean Up ====

connection master;
drop table t1;
sync_slave_with_master;
# End of 5.0 tests

#
# BUG#39393: slave-skip-errors does not work when using ROW based replication
#
--echo ==== Using Innodb ====

connection master;

SET SQL_LOG_BIN=0;
CREATE TABLE t1(id INT NOT NULL PRIMARY KEY, data INT) Engine=InnoDB;
SHOW CREATE TABLE t1;
SET SQL_LOG_BIN=1;

connection slave;

call mtr.add_suppression("Slave SQL.*Could not execute .*te_rows event on table test.t.; Duplicate entry.* error.* 1062");

CREATE TABLE t1(id INT NOT NULL PRIMARY KEY, data INT) Engine=InnoDB;
SHOW CREATE TABLE t1;

connection master;

INSERT INTO t1 VALUES(1, 1);
INSERT INTO t1 VALUES(2, 1);
INSERT INTO t1 VALUES(3, 1);
INSERT INTO t1 VALUES(4, 1);

SET SQL_LOG_BIN=0;
DELETE FROM t1 WHERE id = 4;
SET SQL_LOG_BIN=1;
UPDATE t1 SET id= id + 3, data = 2;

sync_slave_with_master;

let $error= query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
echo $error;

--echo **** We cannot execute a select as there are differences in the 
--echo **** behavior between STMT and RBR.

--echo ==== Using MyIsam ====

connection master;

SET SQL_LOG_BIN=0;
CREATE TABLE t2(id INT NOT NULL PRIMARY KEY, data INT) Engine=MyIsam;
SHOW CREATE TABLE t2;
SET SQL_LOG_BIN=1;

connection slave;

CREATE TABLE t2(id INT NOT NULL PRIMARY KEY, data INT) Engine=MyIsam;
SHOW CREATE TABLE t2;
let $current_skipped_error= query_get_value(show global status like "Slave_skipped_errors", Value, 1);
--let $delta_skipped_error= `select $current_skipped_error - $initial_skipped_error from dual`
--echo # Slave_skipped_errros = $delta_skipped_error
connection master;

INSERT INTO t2 VALUES(1, 1);
INSERT INTO t2 VALUES(2, 1);
INSERT INTO t2 VALUES(3, 1);
INSERT INTO t2 VALUES(5, 1);

SET SQL_LOG_BIN=0;
DELETE FROM t2 WHERE id = 5;
SET SQL_LOG_BIN=1;
UPDATE t2 SET id= id + 3, data = 2;

sync_slave_with_master;

let $error= query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
echo $error;

let $current_skipped_error= query_get_value(show global status like "Slave_skipped_errors", Value, 1);
--let $delta_skipped_error= `select $current_skipped_error - $initial_skipped_error from dual`
--echo # Slave_skipped_errros = $delta_skipped_error

--echo **** We cannot execute a select as there are differences in the 
--echo **** behavior between STMT and RBR.

--echo ==== Clean Up ====

connection master;

DROP TABLE t1;
DROP TABLE t2;

sync_slave_with_master;
--source include/rpl_end.inc