2
# Check statement instrumentation of replicated statements
4
--source include/not_embedded.inc
5
--source include/have_perfschema.inc
6
--source ../include/no_protocol.inc
7
--source include/have_binlog_format_mixed.inc
8
--source include/master-slave.inc
10
#==============================================================
11
# Execute a variety of dml and ddl statements on the master.
12
# Verify that the corresponding statement events are generated
15
# 1. Setup test files on master
16
# 2. Replicate test files to slave
17
# 3. Perform dml and ddl statements on master
18
# 4. Copy statement events on master into a temporary table
19
# 4. Replicate to slave
20
# 5. Compare statement events on slave to those from the master
21
# 6. Disable statement/abstract/relay_log on slave
22
# 7. Update some tables on the master then replicate
23
# 8. Verify that the updates were replicated but no statement
24
# events were recorded
25
#==============================================================
31
select thread_id into @my_thread_id
32
from performance_schema.threads
33
where processlist_id = connection_id();
35
let $disable_instruments=
36
update performance_schema.setup_instruments
37
set enabled='no', timed='no'
38
where name like '%statement/%';
40
let $enable_instruments= ../include
41
update performance_schema.setup_instruments
42
set enabled='yes', timed='yes'
43
where name like '%statement/%';
46
thread_id, event_id, rpad(event_name, 28, ' ') event_name, rpad(current_schema, 10, ' ') current_schema, rpad(digest_text, 72, ' ') digest_text, sql_text;
48
# Define instrument name for enable/disable instruments
49
let $pfs_instrument='%statement/%';
53
--echo # STEP 1 - CREATE AND REPLICATE TEST TABLES
63
--echo *** Create test tables
66
show variables like '%binlog_format%';
69
drop table if exists test.marker;
74
create table test.marker(s1 int) engine=innodb;
76
sync_slave_with_master;
82
--echo *** Clear statement events
83
--source ../include/rpl_statements_truncate.inc
87
--echo # STEP 2 - REPLICATE ONE ROW ON MASTER TO GET REPLICATION THREAD ID ON SLAVE
96
insert into test.marker values (0);
99
sync_slave_with_master;
101
--echo **************
103
--echo **************
105
--echo *** Verify row, get replication thread id, clear statement events
108
# TODO: Get slave thread id from threads using thread/sql/slave_sql event name
110
select thread_id into @slave_thread_id from performance_schema.events_statements_history
111
where sql_text like '%marker%';
112
let $slave_thread_id= `select @slave_thread_id`;
114
--echo *** Verify row inserted on master was replicated
115
select count(*) = 1 as 'Expect 1' from test.marker;
117
--echo *** Clear statement events
118
--source ../include/rpl_statements_truncate.inc
122
--echo # STEP 3 - PERFORM DML STATEMENTS ON MASTER
127
--echo **************
128
--echo *** MASTER ***
129
--echo **************
131
show variables like '%binlog_format%';
133
--echo *** Clear statement events
134
--source ../include/rpl_statements_truncate.inc
137
--echo *** Create/drop table, create/drop database
139
create database marker1_db;
140
create database marker2_db;
141
create table marker1_db.table1 (s1 int) engine=innodb;
142
create table marker2_db.table1 (s1 int) engine=innodb;
143
create table marker2_db.table2 (s1 int) engine=innodb;
146
--echo *** Transaction
148
insert into marker1_db.table1 values (1), (2), (3);
149
insert into marker2_db.table1 values (1), (2), (3);
154
alter table marker1_db.table1 add column (s2 varchar(32));
157
--echo *** Insert, Update
159
insert into marker1_db.table1 values (4, 'four'), (5, 'five'), (6, 'six');
160
update marker1_db.table1 set s1 = s1 + 1;
166
insert into marker1_db.table1 values (7, 'seven'), (8, 'eight'), (9, 'nine');
170
--echo *** Autocommit, Delete, Drop
171
delete from marker1_db.table1 where s1 > 4;
172
drop table marker2_db.table1;
173
drop database marker2_db;
175
--source ../include/disable_instruments.inc
178
--echo *** Examine statements events that will be compared on the slave
181
--replace_column 1 [THREAD_ID] 2 [EVENT_ID]
183
eval select $column_list from performance_schema.events_statements_history_long
184
where sql_text like '%marker%' order by event_id;
188
--echo # STEP 4 - REPLICATE STATEMENT EVENTS ON MASTER TO SLAVE
191
--echo *** Store statement events in holding table, then replicate
194
--source ../include/disable_instruments.inc
197
--echo # Create table to hold statement events for later comparison on the slave
200
create table test.master_events_statements_history_long as
201
(select thread_id, event_id, event_name, sql_text, digest, digest_text, current_schema, rows_affected
202
from performance_schema.events_statements_history_long
203
where (thread_id=@my_thread_id and digest_text like '%marker%'));
205
--source ../include/enable_instruments.inc
209
--echo # STEP 5 - VERIFY DML AND DDL STATEMENT EVENTS ON SLAVE
212
sync_slave_with_master;
214
--echo **************
216
--echo **************
218
--source ../include/disable_instruments.inc
221
--echo *** List statement events from master
223
--replace_column 1 [THREAD_ID] 2 [EVENT_ID]
224
eval select $column_list from master_events_statements_history_long order by event_id;
227
--echo *** List statement events on slave
230
--replace_column 1 [THREAD_ID] 2 [EVENT_ID]
232
eval select $column_list from performance_schema.events_statements_history_long
233
where thread_id = @slave_thread_id and sql_text like '%marker%' order by event_id;
236
--echo *** Compare master and slave events
239
# Note: The statement digest provides a more robust comparison than the
240
# event name. However, in some cases, e.g. DROP TABLE, the server generates
241
# its own version of the statement which includes additional quotes and a
242
# comment. A digest comparison is therefore impractical for server-generated
243
# statements, so we use both methods to ensure coverage.
246
--echo *** Event name comparison - expect 0 mismatches
249
select thread_id, event_id, event_name, digest_text, sql_text from performance_schema.events_statements_history_long t1
250
where t1.thread_id = @slave_thread_id and
251
sql_text like '%marker%' and
252
not exists (select * from master_events_statements_history_long t2 where t2.event_name = t1.event_name);
255
--echo *** Statement digest comparison - expect 1 mismatch for DROP TABLE
258
--replace_column 1 [THREAD_ID] 2 [EVENT_ID] 4 [DIGEST]
260
select thread_id, event_id, event_name, digest, digest_text, sql_text from performance_schema.events_statements_history_long t1
261
where t1.thread_id = @slave_thread_id and
262
sql_text like '%marker%' and
263
not exists (select * from master_events_statements_history_long t2 where t2.digest = t1.digest);
267
--echo # STEP 6 - DISABLE REPLICATED STATEMENT EVENTS ON SLAVE
269
--source ../include/rpl_statements_truncate.inc
270
--source ../include/enable_instruments.inc
272
update performance_schema.setup_instruments set enabled='no', timed='no'
273
where name like '%statement/abstract/relay_log%';
275
select * from performance_schema.setup_instruments where name like '%statement/abstract/relay_log%';
279
--echo # STEP 7 - UPDATE TABLES ON MASTER, REPLICATE
284
--echo **************
285
--echo *** MASTER ***
286
--echo **************
288
--echo *** Clear statement events
289
--source ../include/rpl_statements_truncate.inc
291
--echo *** Update some tables, then replicate
294
insert into marker1_db.table1 values (999, '999'), (998, '998'), (997, '997');
298
--echo # STEP 8 - VERIFY TABLE UPDATES FROM MASTER, EXPECT NO STATEMENT EVENTS ON SLAVE
301
sync_slave_with_master;
303
--echo **************
305
--echo **************
307
--echo *** Confirm rows were replicated
310
select * from marker1_db.table1 where s1 > 900 order by s1;
313
--echo *** Confirm that are no statements events from the replication thread
316
select * from performance_schema.events_statements_history_long
317
where thread_id = @slave_thread_id;
319
--source ../include/enable_instruments.inc
323
--echo # STEP 9 - CLEAN UP
330
drop table test.marker;
331
drop table test.master_events_statements_history_long;
332
drop database marker1_db;
334
sync_slave_with_master;
338
--source include/rpl_end.inc