summaryrefslogtreecommitdiff
path: root/mysql-test/extra/rpl_tests/rpl_innodb.test
blob: 2eee3402da90eb6c9c77e715368bf54373864903 (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
176
177
178
179
180
181
182
183
184
185
#
# Bug#11401: Load data infile 'REPLACE INTO' fails on slave.
#
connection master;
CREATE TABLE t4 (
  id INT(5) unsigned NOT NULL auto_increment,
  name varchar(15) NOT NULL default '',
  number varchar(35) NOT NULL default 'default',
  PRIMARY KEY  (id),
  UNIQUE KEY unique_rec (name,number)
) ENGINE=InnoDB;

--disable_warnings
LOAD DATA
     INFILE '../../std_data/loaddata_pair.dat'  
     REPLACE INTO TABLE t4 
     (name,number);
--enable_warnings
SELECT * FROM t4;

sync_slave_with_master;
SELECT * FROM t4;

connection master;
--disable_warnings
LOAD DATA
     INFILE '../../std_data/loaddata_pair.dat'  
     REPLACE INTO TABLE t4
     (name,number);
--enable_warnings
SELECT * FROM t4;

sync_slave_with_master;
SELECT * FROM t4;

connection master;
--disable_query_log
DROP TABLE t4;
--enable_query_log
sync_slave_with_master;
connection master;

# End of 4.1 tests

#
# Bug #26418: Slave out of sync after CREATE/DROP TEMPORARY TABLE + ROLLBACK
# on master
#
#Note Matthias: to be merged to rpl_ddl.test

--source include/not_ndb_default.inc

FLUSH LOGS;
sync_slave_with_master;
FLUSH LOGS;
connection master;
let $engine_type= "InnoDB";

--disable_warnings
DROP DATABASE IF EXISTS mysqltest1;
--enable_warnings

CREATE DATABASE mysqltest1;
CREATE TEMPORARY TABLE mysqltest1.tmp (f1 BIGINT);
eval CREATE TABLE mysqltest1.t1 (f1 BIGINT) ENGINE=$engine_type;
SET AUTOCOMMIT = 0;

sync_slave_with_master;
--echo -------- switch to slave --------
connection slave;

# We want to verify that the following transactions are written to the
# binlog, despite the transaction is rolled back. (They should be
# written to the binlog since they contain non-transactional DROP
# TEMPORARY TABLE).  To see that, we use the auxiliary table t1, which
# is transactional (InnoDB) on master and MyISAM on slave. t1 should
# be transactional on master so that the insert into t1 does not cause
# the transaction to be logged. Since t1 is non-transactional on
# slave, the change will not be rolled back, so the inserted rows will
# stay in t1 and we can verify that the transaction was replicated.
ALTER TABLE mysqltest1.t1 ENGINE = MyISAM;
SHOW CREATE TABLE mysqltest1.t1;

--echo -------- switch to master --------
connection master;
INSERT INTO mysqltest1.t1 SET f1= 1;
DROP TEMPORARY TABLE mysqltest1.tmp;
ROLLBACK;
--error ER_NO_SUCH_TABLE
SHOW CREATE TABLE mysqltest1.tmp;
--echo ######### Must return no rows here #########
SELECT COUNT(*) FROM mysqltest1.t1;

INSERT INTO mysqltest1.t1 SET f1= 2;
CREATE TEMPORARY TABLE mysqltest1.tmp2(a INT);
ROLLBACK;
--replace_result MyISAM InnoDB
SHOW CREATE TABLE mysqltest1.tmp2;
--echo ######### Must return no rows here #########
SELECT COUNT(*) FROM mysqltest1.t1;

sync_slave_with_master;
--echo -------- switch to slave --------
connection slave;
--error ER_NO_SUCH_TABLE
SHOW CREATE TABLE mysqltest1.tmp;
--error ER_NO_SUCH_TABLE
SHOW CREATE TABLE mysqltest1.tmp2;
--echo ######### t1 has two rows here: the transaction not rolled back since t1 uses MyISAM  #########
SELECT COUNT(*) FROM mysqltest1.t1;
FLUSH LOGS;

--echo -------- switch to master --------
connection master;
FLUSH LOGS;

DROP DATABASE mysqltest1;

--echo End of 5.1 tests

--echo #
--echo # Bug#39675 rename tables on innodb tables with pending 
--echo # transactions causes slave data issue.
--echo #

--disable_warnings
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
DROP TABLE IF EXISTS t3;
--enable_warnings

CREATE TABLE t1 (
  id INT PRIMARY KEY auto_increment,
  b INT DEFAULT NULL
) ENGINE=InnoDB;

CREATE TABLE t2 (
  id INT PRIMARY KEY auto_increment,
  b INT DEFAULT NULL
) ENGINE=InnoDB;

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

BEGIN;
INSERT INTO t1(b) VALUES (4);

--echo -------- switch to master1 --------
connection master1;
--send RENAME TABLE t1 TO t3, t2 TO t1;

--echo -------- switch to master --------
connection master;
# Need to wait until RENAME is received
let $wait_condition=
  SELECT COUNT(*) = 1 FROM information_schema.processlist
  WHERE info = "RENAME TABLE t1 TO t3, t2 TO t1" and
  state = "Waiting for table metadata lock";
--source include/wait_condition.inc

COMMIT;

--echo -------- switch to master1 --------
connection master1;
--reap

--echo -------- switch to master --------
connection master;
SELECT * FROM t1;
SELECT * FROM t3;

sync_slave_with_master;

--echo -------- switch to slave --------
connection slave;
SELECT * FROM t1;
SELECT * FROM t3;

--echo -------- switch to master --------
connection master;
DROP TABLE t1;
DROP TABLE t3;

--echo End of 6.0 tests

--source include/master-slave-end.inc