Skip to content

Commit 6440648

Browse files
committed
WL#11581: Support for opening tables in a secondary storage engine
In SELECT statements where all the accessed base tables have shadow copies in a secondary storage engine, the tables in the secondary storage engine will be used when the statement is executed. The secondary tables are represented by their own TABLE_SHARE and TABLE objects in the table definition cache and table cache. Change-Id: I5d6069f6116280a8754a57e37905c14f58110f86
1 parent 6b977a8 commit 6440648

24 files changed

+1390
-91
lines changed
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
include/master-slave.inc
2+
Warnings:
3+
Note #### Sending passwords in plain text without SSL/TLS is extremely insecure.
4+
Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
5+
[connection master]
6+
CALL mtr.add_suppression("\\[ERROR\\] .*MY-\\d+.* \\[Repl\\] Slave SQL for channel '':.*Error 'Unknown storage engine 'MOCK'' on query");
7+
CALL mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* \\[Repl\\] Slave: Unknown storage engine 'MOCK'");
8+
CALL mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* \\[Server\\] Unsafe statement written to the binary log using statement format");
9+
CALL mtr.add_suppression("The slave coordinator and worker threads are stopped");
10+
[ Connection Master ]
11+
INSTALL PLUGIN mock SONAME 'ha_mock.so';
12+
[ Connection Slave ]
13+
INSTALL PLUGIN mock SONAME 'ha_mock.so';
14+
[ Connection Master ]
15+
CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, vc VARCHAR(10), j JSON, b BLOB, vb VARBINARY(32)) SECONDARY_ENGINE=MOCK;
16+
include/sync_slave_sql_with_master.inc
17+
[ Connection Slave ]
18+
SHOW CREATE TABLE t1;
19+
Table Create Table
20+
t1 CREATE TABLE `t1` (
21+
`pk` int(11) NOT NULL AUTO_INCREMENT,
22+
`vc` varchar(10) DEFAULT NULL,
23+
`j` json DEFAULT NULL,
24+
`b` blob,
25+
`vb` varbinary(32) DEFAULT NULL,
26+
PRIMARY KEY (`pk`)
27+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=MOCK
28+
SELECT * FROM t1;
29+
ERROR 42S02: Table 'test.t1' doesn't exist
30+
[ Connection Master ]
31+
INSERT INTO t1 VALUES(NULL, 'Poodle', '{"key":"value"}', 'Pug', x'1234');
32+
INSERT INTO t1 VALUES(NULL, 'Labrador', '[{"key":"value"},{"key":"value2"}]', 'Boxer', x'abcd');
33+
INSERT INTO t1 VALUES(NULL, 'Beagle', '[1,2,3]', 'Pitbull', x'abcd1234');
34+
INSERT INTO t1 VALUES(NULL, 'Collie', '["ab","bc","cd"]', 'Huskey', x'1ab2c3d4');
35+
INSERT INTO t1 VALUES(NULL, 'Shiba', '{"1":"one"}', 'Mastiff', x'ffff');
36+
ALTER TABLE t1 SECONDARY_LOAD;
37+
include/sync_slave_sql_with_master.inc
38+
[ Connection Slave ]
39+
SELECT * FROM t1;
40+
pk vc j b vb
41+
[ Connection Master ]
42+
CREATE TABLE t2 LIKE t1;
43+
INSERT INTO t2 SELECT * FROM t1;
44+
ALTER TABLE t2 SECONDARY_LOAD;
45+
include/sync_slave_sql_with_master.inc
46+
[ Connection Slave ]
47+
SHOW CREATE TABLE t2;
48+
Table Create Table
49+
t2 CREATE TABLE `t2` (
50+
`pk` int(11) NOT NULL AUTO_INCREMENT,
51+
`vc` varchar(10) DEFAULT NULL,
52+
`j` json DEFAULT NULL,
53+
`b` blob,
54+
`vb` varbinary(32) DEFAULT NULL,
55+
PRIMARY KEY (`pk`)
56+
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=MOCK
57+
SELECT * FROM t2;
58+
pk vc j b vb
59+
[ Connection Master ]
60+
ALTER TABLE t1 SECONDARY_UNLOAD;
61+
include/sync_slave_sql_with_master.inc
62+
[ Connection Slave ]
63+
SELECT * FROM t1;
64+
ERROR 42S02: Table 'test.t1' doesn't exist
65+
[ Connection Master ]
66+
ALTER TABLE t1 SECONDARY_ENGINE=NULL;
67+
include/sync_slave_sql_with_master.inc
68+
[ Connection Slave ]
69+
SHOW CREATE TABLE t1;
70+
Table Create Table
71+
t1 CREATE TABLE `t1` (
72+
`pk` int(11) NOT NULL AUTO_INCREMENT,
73+
`vc` varchar(10) DEFAULT NULL,
74+
`j` json DEFAULT NULL,
75+
`b` blob,
76+
`vb` varbinary(32) DEFAULT NULL,
77+
PRIMARY KEY (`pk`)
78+
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
79+
SELECT * FROM t1;
80+
pk vc j b vb
81+
1 Poodle {"key": "value"} Pug 4
82+
2 Labrador [{"key": "value"}, {"key": "value2"}] Boxer ��
83+
3 Beagle [1, 2, 3] Pitbull ��4
84+
4 Collie ["ab", "bc", "cd"] Huskey ���
85+
5 Shiba {"1": "one"} Mastiff ��
86+
[ Connection Master ]
87+
ALTER TABLE t1 SECONDARY_ENGINE=HELLO;
88+
include/sync_slave_sql_with_master.inc
89+
[ Connection Slave ]
90+
SHOW CREATE TABLE t1;
91+
Table Create Table
92+
t1 CREATE TABLE `t1` (
93+
`pk` int(11) NOT NULL AUTO_INCREMENT,
94+
`vc` varchar(10) DEFAULT NULL,
95+
`j` json DEFAULT NULL,
96+
`b` blob,
97+
`vb` varbinary(32) DEFAULT NULL,
98+
PRIMARY KEY (`pk`)
99+
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=HELLO
100+
ALTER TABLE t1 SECONDARY_ENGINE=NULL;
101+
ALTER TABLE t1 SECONDARY_ENGINE=NADA;
102+
SHOW CREATE TABLE t1;
103+
Table Create Table
104+
t1 CREATE TABLE `t1` (
105+
`pk` int(11) NOT NULL AUTO_INCREMENT,
106+
`vc` varchar(10) DEFAULT NULL,
107+
`j` json DEFAULT NULL,
108+
`b` blob,
109+
`vb` varbinary(32) DEFAULT NULL,
110+
PRIMARY KEY (`pk`)
111+
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=NADA
112+
ALTER TABLE t1 SECONDARY_ENGINE=NULL;
113+
ALTER TABLE t1 SECONDARY_ENGINE=MOCK;
114+
SHOW CREATE TABLE t1;
115+
Table Create Table
116+
t1 CREATE TABLE `t1` (
117+
`pk` int(11) NOT NULL AUTO_INCREMENT,
118+
`vc` varchar(10) DEFAULT NULL,
119+
`j` json DEFAULT NULL,
120+
`b` blob,
121+
`vb` varbinary(32) DEFAULT NULL,
122+
PRIMARY KEY (`pk`)
123+
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=MOCK
124+
ALTER TABLE t1 SECONDARY_LOAD;
125+
SELECT * FROM t1;
126+
pk vc j b vb
127+
ALTER TABLE t1 SECONDARY_UNLOAD;
128+
ALTER TABLE t2 SECONDARY_UNLOAD;
129+
[ Connection Master ]
130+
ALTER TABLE t1 SECONDARY_ENGINE=NULL;
131+
ALTER TABLE t1 SECONDARY_ENGINE=MOCK;
132+
include/sync_slave_sql_with_master.inc
133+
[ Connection Slave ]
134+
UNINSTALL PLUGIN mock;
135+
include/stop_slave_sql.inc
136+
[ Connection Master ]
137+
ALTER TABLE t1 SECONDARY_LOAD;
138+
[ Connection Slave ]
139+
START SLAVE SQL_THREAD;
140+
include/wait_for_slave_sql_error.inc [errno=1286]
141+
INSTALL PLUGIN mock SONAME 'ha_mock.so';
142+
include/start_slave_sql.inc
143+
include/wait_for_slave_param.inc [Slave_SQL_Running_State]
144+
SELECT * FROM t1;
145+
pk vc j b vb
146+
[ Connection Master ]
147+
DROP TABLE t1;
148+
DROP TABLE t2;
149+
UNINSTALL PLUGIN mock;
150+
include/sync_slave_sql_with_master.inc
151+
UNINSTALL PLUGIN mock;
152+
include/rpl_end.inc
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
$MOCK_PLUGIN_OPT
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
$MOCK_PLUGIN_OPT
Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
#####################################################################
2+
# #
3+
# The aim of this test is to set up replication between a master #
4+
# and slave and check that the new ALTER TABLE syntax that has #
5+
# been introduced in WL#11581 and WL#11581 to support secondary #
6+
# engines work as expected. A mock engine has been written to test #
7+
# the statements. #
8+
# #
9+
# Creation Date: 2018-06-21 #
10+
# Author: Deepa Dixit #
11+
# #
12+
#####################################################################
13+
14+
--source include/master-slave.inc
15+
CALL mtr.add_suppression("\\[ERROR\\] .*MY-\\d+.* \\[Repl\\] Slave SQL for channel '':.*Error 'Unknown storage engine 'MOCK'' on query");
16+
CALL mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* \\[Repl\\] Slave: Unknown storage engine 'MOCK'");
17+
CALL mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* \\[Server\\] Unsafe statement written to the binary log using statement format");
18+
CALL mtr.add_suppression("The slave coordinator and worker threads are stopped");
19+
20+
--connection master
21+
--echo [ Connection Master ]
22+
23+
# Install plugin on master.
24+
--replace_regex /\.dll/.so/
25+
--eval INSTALL PLUGIN mock SONAME '$MOCK_PLUGIN'
26+
27+
--connection slave
28+
--echo [ Connection Slave ]
29+
30+
# Install plugin on slave.
31+
--replace_regex /\.dll/.so/
32+
--eval INSTALL PLUGIN mock SONAME '$MOCK_PLUGIN'
33+
34+
--connection master
35+
--echo [ Connection Master ]
36+
37+
# Create table with SECONDARY_ENGINE MOCK
38+
CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, vc VARCHAR(10), j JSON, b BLOB, vb VARBINARY(32)) SECONDARY_ENGINE=MOCK;
39+
40+
--source include/sync_slave_sql_with_master.inc
41+
--echo [ Connection Slave ]
42+
43+
# Check if the table is created with the secondary engine.
44+
SHOW CREATE TABLE t1;
45+
46+
# Since the table is not offloaded to MOCK engine, it
47+
# appears to be non-existent.
48+
--error ER_NO_SUCH_TABLE
49+
SELECT * FROM t1;
50+
51+
--connection master
52+
--echo [ Connection Master ]
53+
54+
# Insert rows and offload the table to mock engine.
55+
INSERT INTO t1 VALUES(NULL, 'Poodle', '{"key":"value"}', 'Pug', x'1234');
56+
INSERT INTO t1 VALUES(NULL, 'Labrador', '[{"key":"value"},{"key":"value2"}]', 'Boxer', x'abcd');
57+
INSERT INTO t1 VALUES(NULL, 'Beagle', '[1,2,3]', 'Pitbull', x'abcd1234');
58+
INSERT INTO t1 VALUES(NULL, 'Collie', '["ab","bc","cd"]', 'Huskey', x'1ab2c3d4');
59+
INSERT INTO t1 VALUES(NULL, 'Shiba', '{"1":"one"}', 'Mastiff', x'ffff');
60+
61+
ALTER TABLE t1 SECONDARY_LOAD;
62+
63+
--source include/sync_slave_sql_with_master.inc
64+
--echo [ Connection Slave ]
65+
66+
# Check that the table is offloaded.
67+
SELECT * FROM t1;
68+
69+
--connection master
70+
--echo [ Connection Master ]
71+
72+
# Create a table like t1.
73+
CREATE TABLE t2 LIKE t1;
74+
75+
# Insert data from t1 to t2.
76+
--disable_warnings
77+
INSERT INTO t2 SELECT * FROM t1;
78+
--enable_warnings
79+
80+
# Offload the table to MOCK engine.
81+
ALTER TABLE t2 SECONDARY_LOAD;
82+
83+
--source include/sync_slave_sql_with_master.inc
84+
--echo [ Connection Slave ]
85+
86+
# Check that t2 is created with the secondary engine.
87+
SHOW CREATE TABLE t2;
88+
89+
SELECT * FROM t2;
90+
91+
--connection master
92+
--echo [ Connection Master ]
93+
94+
# Unload the table from the secondary engine.
95+
ALTER TABLE t1 SECONDARY_UNLOAD;
96+
97+
--source include/sync_slave_sql_with_master.inc
98+
--echo [ Connection Slave ]
99+
100+
# Check that the table is unloaded.
101+
--error ER_NO_SUCH_TABLE
102+
SELECT * FROM t1;
103+
104+
--connection master
105+
--echo [ Connection Master ]
106+
107+
# Change the secondary engine to NULL.
108+
ALTER TABLE t1 SECONDARY_ENGINE=NULL;
109+
110+
--source include/sync_slave_sql_with_master.inc
111+
--echo [ Connection Slave ]
112+
113+
# Check whether the secondary engine has been changed.
114+
SHOW CREATE TABLE t1;
115+
SELECT * FROM t1;
116+
117+
--connection master
118+
--echo [ Connection Master ]
119+
120+
# Change the secondary engine to something non existent.
121+
ALTER TABLE t1 SECONDARY_ENGINE=HELLO;
122+
123+
--source include/sync_slave_sql_with_master.inc
124+
--echo [ Connection Slave ]
125+
126+
# Check the secondary engine of the table.
127+
SHOW CREATE TABLE t1;
128+
129+
# Check whether the ALTER statements work only on the slave.
130+
ALTER TABLE t1 SECONDARY_ENGINE=NULL;
131+
ALTER TABLE t1 SECONDARY_ENGINE=NADA;
132+
SHOW CREATE TABLE t1;
133+
134+
ALTER TABLE t1 SECONDARY_ENGINE=NULL;
135+
ALTER TABLE t1 SECONDARY_ENGINE=MOCK;
136+
SHOW CREATE TABLE t1;
137+
ALTER TABLE t1 SECONDARY_LOAD;
138+
SELECT * FROM t1;
139+
ALTER TABLE t1 SECONDARY_UNLOAD;
140+
ALTER TABLE t2 SECONDARY_UNLOAD;
141+
142+
--connection master
143+
--echo [ Connection Master ]
144+
145+
ALTER TABLE t1 SECONDARY_ENGINE=NULL;
146+
ALTER TABLE t1 SECONDARY_ENGINE=MOCK;
147+
148+
--source include/sync_slave_sql_with_master.inc
149+
--echo [ Connection Slave ]
150+
151+
# Uninstall the plugin on slave.
152+
UNINSTALL PLUGIN mock;
153+
154+
# Stop slave SQL thread.
155+
--source include/stop_slave_sql.inc
156+
157+
--connection master
158+
--echo [ Connection Master ]
159+
160+
# Check if table gets offloaded if there is no plugin installed on slave.
161+
ALTER TABLE t1 SECONDARY_LOAD;
162+
163+
--connection slave
164+
--echo [ Connection Slave ]
165+
166+
START SLAVE SQL_THREAD;
167+
168+
# Since the plugin is not available, this error is expected.
169+
--let $slave_sql_errno = convert_error(ER_UNKNOWN_STORAGE_ENGINE)
170+
--source include/wait_for_slave_sql_error.inc
171+
172+
# Install the plugin on slave again
173+
--replace_regex /\.dll/.so/
174+
--eval INSTALL PLUGIN mock SONAME '$MOCK_PLUGIN'
175+
176+
--sleep 3
177+
--source include/start_slave_sql.inc
178+
--let $slave_param= Slave_SQL_Running_State
179+
--let $slave_param_value= Slave has read all relay log; waiting for more updates
180+
--source include/wait_for_slave_param.inc
181+
182+
SELECT * FROM t1;
183+
184+
--connection master
185+
--echo [ Connection Master ]
186+
187+
# Clean up
188+
DROP TABLE t1;
189+
DROP TABLE t2;
190+
UNINSTALL PLUGIN mock;
191+
192+
--source include/sync_slave_sql_with_master.inc
193+
194+
# Uninstall plugin on slave too.
195+
--sleep 3
196+
UNINSTALL PLUGIN mock;
197+
198+
--source include/rpl_end.inc

0 commit comments

Comments
 (0)