summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/perfschema/t/rpl_statements.test
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 12:24:36 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 12:24:36 +0000
commit06eaf7232e9a920468c0f8d74dcf2fe8b555501c (patch)
treee2c7b5777f728320e5b5542b6213fd3591ba51e2 /mysql-test/suite/perfschema/t/rpl_statements.test
parentInitial commit. (diff)
downloadmariadb-06eaf7232e9a920468c0f8d74dcf2fe8b555501c.tar.xz
mariadb-06eaf7232e9a920468c0f8d74dcf2fe8b555501c.zip
Adding upstream version 1:10.11.6.upstream/1%10.11.6
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'mysql-test/suite/perfschema/t/rpl_statements.test')
-rw-r--r--mysql-test/suite/perfschema/t/rpl_statements.test313
1 files changed, 313 insertions, 0 deletions
diff --git a/mysql-test/suite/perfschema/t/rpl_statements.test b/mysql-test/suite/perfschema/t/rpl_statements.test
new file mode 100644
index 00000000..c97cd619
--- /dev/null
+++ b/mysql-test/suite/perfschema/t/rpl_statements.test
@@ -0,0 +1,313 @@
+#
+# Check statement instrumentation of replicated statements
+#
+--source include/not_embedded.inc
+--source include/have_innodb.inc
+--source include/have_perfschema.inc
+--source include/no_protocol.inc
+--source include/have_binlog_format_mixed.inc
+--source include/master-slave.inc
+
+#==============================================================
+# Execute a variety of dml and ddl statements on the master.
+# Verify that the corresponding statement events are generated
+# on the slave.
+#
+# 1. Setup test files on master
+# 2. Replicate test files to slave
+# 3. Perform dml and ddl statements on master
+# 4. Copy statement events on master into a temporary table
+# 4. Replicate to slave
+# 5. Compare statement events on slave to those from the master
+# 6. Disable statement/abstract/relay_log on slave
+# 7. Update some tables on the master then replicate
+# 8. Verify that the updates were replicated but no statement
+# events were recorded
+#==============================================================
+
+#
+# UTILITY QUERIES
+#
+let $get_thread_id=
+ select thread_id into @my_thread_id
+ from performance_schema.threads
+ where processlist_id = connection_id();
+
+let $disable_instruments=
+ update performance_schema.setup_instruments
+ set enabled='no', timed='no'
+ where name like '%statement/%';
+
+let $enable_instruments= ../include
+ update performance_schema.setup_instruments
+ set enabled='yes', timed='yes'
+ where name like '%statement/%';
+
+let $column_list=
+ thread_id, event_id, rpad(event_name, 28, ' ') event_name, rpad(current_schema, 10, ' ') current_schema, rpad(digest_text, 72, ' ') digest_text, sql_text;
+
+# Define instrument name for enable/disable instruments
+let $pfs_instrument='%statement/%';
+
+--echo #
+--echo #
+--echo # STEP 1 - CREATE AND REPLICATE TEST TABLES
+--echo #
+
+connection master;
+
+--echo #
+--echo # *** Create test tables
+--echo #
+
+show global variables like 'binlog_format%';
+
+--disable_warnings
+drop table if exists test.marker;
+--enable_warnings
+
+eval $get_thread_id;
+
+create table test.marker(s1 int) engine=innodb;
+
+sync_slave_with_master;
+
+--echo #
+--echo # *** Clear statement events
+--source ../include/rpl_statements_truncate.inc
+
+--echo #
+--echo #
+--echo # STEP 2 - REPLICATE ONE ROW ON MASTER TO GET REPLICATION THREAD ID ON SLAVE
+--echo #
+
+connection master;
+
+--echo #
+insert into test.marker values (0);
+--echo #
+
+sync_slave_with_master;
+
+--echo #
+--echo # *** Verify row, get replication thread id, clear statement events
+--echo #
+
+# TODO: Get slave thread id from threads using thread/sql/slave_sql event name
+
+select thread_id into @slave_thread_id from performance_schema.events_statements_history
+ where sql_text like '%marker%';
+let $slave_thread_id= `select @slave_thread_id`;
+
+--echo # *** Verify row inserted on master was replicated
+select count(*) = 1 as 'Expect 1' from test.marker;
+
+--echo # *** Clear statement events
+--source ../include/rpl_statements_truncate.inc
+
+--echo #
+--echo #
+--echo # STEP 3 - PERFORM DML STATEMENTS ON MASTER
+--echo #
+
+connection master;
+
+--echo #
+show global variables like 'binlog_format%';
+
+--echo # *** Clear statement events
+--source ../include/rpl_statements_truncate.inc
+
+--echo #
+--echo # *** Create/drop table, create/drop database
+--echo #
+create database marker1_db;
+create database marker2_db;
+create table marker1_db.table1 (s1 int) engine=innodb;
+create table marker2_db.table1 (s1 int) engine=innodb;
+create table marker2_db.table2 (s1 int) engine=innodb;
+
+--echo #
+--echo # *** Transaction
+start transaction;
+insert into marker1_db.table1 values (1), (2), (3);
+insert into marker2_db.table1 values (1), (2), (3);
+commit;
+
+--echo #
+--echo # *** Alter
+alter table marker1_db.table1 add column (s2 varchar(32));
+
+--echo #
+--echo # *** Insert, Update
+start transaction;
+insert into marker1_db.table1 values (4, 'four'), (5, 'five'), (6, 'six');
+update marker1_db.table1 set s1 = s1 + 1;
+commit;
+
+--echo #
+--echo # *** Rollback
+start transaction;
+insert into marker1_db.table1 values (7, 'seven'), (8, 'eight'), (9, 'nine');
+rollback;
+
+--echo #
+--echo # *** Autocommit, Delete, Drop
+delete from marker1_db.table1 where s1 > 4;
+drop table marker2_db.table1;
+drop database marker2_db;
+
+--source ../include/disable_instruments.inc
+
+--echo #
+--echo # *** Examine statements events that will be compared on the slave
+--echo #
+
+--replace_column 1 [THREAD_ID] 2 [EVENT_ID]
+
+eval select $column_list from performance_schema.events_statements_history_long
+ where sql_text like '%marker%' order by event_id;
+
+--echo #
+--echo #
+--echo # STEP 4 - REPLICATE STATEMENT EVENTS ON MASTER TO SLAVE
+--echo #
+--echo #
+--echo # *** Store statement events in holding table, then replicate
+--echo #
+
+--source ../include/disable_instruments.inc
+
+--echo #
+--echo # Create table to hold statement events for later comparison on the slave
+--echo #
+
+create table test.master_events_statements_history_long as
+ (select thread_id, event_id, event_name, sql_text, digest, digest_text, current_schema, rows_affected
+ from performance_schema.events_statements_history_long
+ where (thread_id=@my_thread_id and digest_text like '%marker%'));
+
+--source ../include/enable_instruments.inc
+
+--echo #
+--echo #
+--echo # STEP 5 - VERIFY DML AND DDL STATEMENT EVENTS ON SLAVE
+--echo #
+
+sync_slave_with_master;
+
+--source ../include/disable_instruments.inc
+
+--echo #
+--echo # *** List statement events from master
+--echo #
+--replace_column 1 [THREAD_ID] 2 [EVENT_ID]
+eval select $column_list from master_events_statements_history_long order by event_id;
+
+--echo #
+--echo # *** List statement events on slave
+--echo #
+
+--replace_column 1 [THREAD_ID] 2 [EVENT_ID]
+
+eval select $column_list from performance_schema.events_statements_history_long
+ where thread_id = @slave_thread_id and sql_text like '%marker%' order by event_id;
+
+--echo #
+--echo # *** Compare master and slave events
+--echo #
+
+# Note: The statement digest provides a more robust comparison than the
+# event name. However, in some cases, e.g. DROP TABLE, the server generates
+# its own version of the statement which includes additional quotes and a
+# comment. A digest comparison is therefore impractical for server-generated
+# statements, so we use both methods to ensure coverage.
+
+--echo
+--echo # *** Event name comparison - expect 0 mismatches
+--echo
+
+select thread_id, event_id, event_name, digest_text, sql_text from performance_schema.events_statements_history_long t1
+ where t1.thread_id = @slave_thread_id and
+ sql_text like '%marker%' and
+ not exists (select * from master_events_statements_history_long t2 where t2.event_name = t1.event_name);
+
+--echo
+--echo # *** Statement digest comparison - expect 1 mismatch for DROP TABLE
+--echo
+
+--replace_column 1 [THREAD_ID] 2 [EVENT_ID] 4 [DIGEST]
+
+select thread_id, event_id, event_name, digest, digest_text, sql_text from performance_schema.events_statements_history_long t1
+ where t1.thread_id = @slave_thread_id and
+ sql_text like '%marker%' and
+ not exists (select * from master_events_statements_history_long t2 where t2.digest = t1.digest);
+
+--echo #
+--echo #
+--echo # STEP 6 - DISABLE REPLICATED STATEMENT EVENTS ON SLAVE
+--echo #
+--source ../include/rpl_statements_truncate.inc
+--source ../include/enable_instruments.inc
+
+update performance_schema.setup_instruments set enabled='no', timed='no'
+ where name like '%statement/abstract/relay_log%';
+
+select * from performance_schema.setup_instruments where name like '%statement/abstract/relay_log%';
+
+--echo #
+--echo #
+--echo # STEP 7 - UPDATE TABLES ON MASTER, REPLICATE
+--echo #
+
+connection master;
+
+--echo #
+--echo # *** Clear statement events
+--source ../include/rpl_statements_truncate.inc
+
+--echo # *** Update some tables, then replicate
+--echo #
+
+insert into marker1_db.table1 values (999, '999'), (998, '998'), (997, '997');
+
+--echo #
+--echo #
+--echo # STEP 8 - VERIFY TABLE UPDATES FROM MASTER, EXPECT NO STATEMENT EVENTS ON SLAVE
+--echo #
+
+sync_slave_with_master;
+
+--echo #
+--echo # *** Confirm rows were replicated
+--echo #
+
+select * from marker1_db.table1 where s1 > 900 order by s1;
+
+--echo #
+--echo # *** Confirm that are no statements events from the replication thread
+--echo #
+
+select * from performance_schema.events_statements_history_long
+ where thread_id = @slave_thread_id;
+
+--source ../include/enable_instruments.inc
+
+--echo #
+--echo #
+--echo # STEP 9 - CLEAN UP
+--echo #
+--echo #
+--disable_query_log
+--disable_warnings
+
+connection master;
+drop table test.marker;
+drop table test.master_events_statements_history_long;
+drop database marker1_db;
+
+sync_slave_with_master;
+
+--enable_warnings
+--enable_query_log
+--source include/rpl_end.inc