diff options
-rw-r--r-- | mysql-test/include/show_slave_status.inc | 4 | ||||
-rw-r--r-- | mysql-test/include/wait_for_sql_thread_read_all.inc | 8 | ||||
-rw-r--r-- | mysql-test/suite/multi_source/multisource_for_channel.result | 366 | ||||
-rw-r--r-- | mysql-test/suite/multi_source/multisource_for_channel.test | 429 | ||||
-rw-r--r-- | mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result | 4 | ||||
-rw-r--r-- | sql/lex.h | 1 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 54 |
7 files changed, 848 insertions, 18 deletions
diff --git a/mysql-test/include/show_slave_status.inc b/mysql-test/include/show_slave_status.inc index ba2e1b0c48a..429ed8a5abd 100644 --- a/mysql-test/include/show_slave_status.inc +++ b/mysql-test/include/show_slave_status.inc @@ -102,6 +102,10 @@ if ($all_slaves_status) if ($slave_name) { --let $_show_query=SHOW SLAVE $slave_name STATUS + if ($for_channel) + { + --let $_show_query=SHOW SLAVE STATUS for channel $slave_name + } } diff --git a/mysql-test/include/wait_for_sql_thread_read_all.inc b/mysql-test/include/wait_for_sql_thread_read_all.inc index 1bbb006f3a8..1829591c5d1 100644 --- a/mysql-test/include/wait_for_sql_thread_read_all.inc +++ b/mysql-test/include/wait_for_sql_thread_read_all.inc @@ -1,6 +1,12 @@ +# This script ensures that a slave has executed everything in the relay log +# files. This can be used to ensure slave is in a predicate place after +# a FLUSH RELAY LOGS command. +# Note that this script does not guarantee that the slave has read everything +# from the master(s). If this is needed on should use the sync_with_master +# command or the sync_with_master script. + --let $show_statement = show all slaves status --let $field = Slave_SQL_State --let $condition = = 'Slave has read all relay log; waiting for more updates' --let $wait_for_all = 1 --source include/wait_show_condition.inc - diff --git a/mysql-test/suite/multi_source/multisource_for_channel.result b/mysql-test/suite/multi_source/multisource_for_channel.result new file mode 100644 index 00000000000..f96a5a93b97 --- /dev/null +++ b/mysql-test/suite/multi_source/multisource_for_channel.result @@ -0,0 +1,366 @@ +RESET MASTER; +connect slave,127.0.0.1,root,,,$SERVER_MYPORT_3; +change master to relay_log_file='' for channel 'abc1'; +ERROR HY000: Failed initializing relay log position: Could not find target log during relay log initialization +change master to master_host='' for channel 'abc2'; +ERROR HY000: Incorrect arguments to MASTER_HOST +change master to +master_port=MYPORT_1, +master_host='127.0.0.1', +master_user='root' +for channel 'master1'; +start slave for channel 'master1'; +set default_master_connection = 'master1'; +include/wait_for_slave_to_start.inc +connect master1,127.0.0.1,root,,,$SERVER_MYPORT_1; +connection slave; +# +# Checking SHOW SLAVE 'master1' STATUS +# +Master_Port = 'MYPORT_1' +Relay_Log_File = 'mysqld-relay-bin-master1.000002' +Slave_IO_Running = 'Yes' +Slave_SQL_Running = 'Yes' +Last_Errno = '0' +Last_SQL_Errno = '0' +# +# Checking SHOW SLAVE STATUS +# +Master_Port = 'MYPORT_1' +Relay_Log_File = 'mysqld-relay-bin-master1.000002' +Slave_IO_Running = 'Yes' +Slave_SQL_Running = 'Yes' +Last_Errno = '0' +Last_SQL_Errno = '0' +# +# Checking SHOW ALL SLAVES STATUS +# +Connection_name = 'master1' +Master_Port = 'MYPORT_1' +Relay_Log_File = 'mysqld-relay-bin-master1.000002' +Slave_IO_Running = 'Yes' +Slave_SQL_Running = 'Yes' +Last_Errno = '0' +Last_SQL_Errno = '0' +Slave_heartbeat_period = '60.000' +# +connection master1; +drop database if exists db1; +create database db1; +use db1; +create table t1 (i int auto_increment, f1 varchar(16), primary key pk (i,f1)) engine=MyISAM; +Warnings: +Warning 1280 Name 'pk' ignored for PRIMARY key. +insert into t1 (f1) values ('one'),('two'); +connection slave; +select * from db1.t1; +i f1 +1 one +2 two +# List of relay log files in the datadir +mysqld-relay-bin-master1.000001 +mysqld-relay-bin-master1.000002 +mysqld-relay-bin-master1.index +include/show_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-relay-bin-master1.000001 # Format_desc # # SERVER_VERSION, BINLOG_VERSION +mysqld-relay-bin-master1.000001 # Rotate # # mysqld-relay-bin-master1.000002;pos=4 +include/show_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-relay-bin-master1.000002 # Format_desc # # SERVER_VERSION, BINLOG_VERSION +mysqld-relay-bin-master1.000002 # Rotate # # master-bin.000001;pos=POS +mysqld-relay-bin-master1.000002 # Format_desc # # SERVER_VERSION, BINLOG_VERSION +mysqld-relay-bin-master1.000002 # Gtid_list # # [] +mysqld-relay-bin-master1.000002 # Binlog_checkpoint # # master-bin.000001 +mysqld-relay-bin-master1.000002 # Gtid # # GTID #-#-# +mysqld-relay-bin-master1.000002 # Query # # drop database if exists db1 +mysqld-relay-bin-master1.000002 # Gtid # # GTID #-#-# +mysqld-relay-bin-master1.000002 # Query # # create database db1 +mysqld-relay-bin-master1.000002 # Gtid # # GTID #-#-# +mysqld-relay-bin-master1.000002 # Query # # use `db1`; create table t1 (i int auto_increment, f1 varchar(16), primary key pk (i,f1)) engine=MyISAM +mysqld-relay-bin-master1.000002 # Gtid # # BEGIN GTID #-#-# +mysqld-relay-bin-master1.000002 # Intvar # # INSERT_ID=1 +mysqld-relay-bin-master1.000002 # Query # # use `db1`; insert into t1 (f1) values ('one'),('two') +mysqld-relay-bin-master1.000002 # Query # # COMMIT +change master to +master_port=MYPORT_2, +master_host='127.0.0.1', +master_user='root' +for channel 'master1'; +ERROR HY000: This operation cannot be performed as you have a running slave 'master1'; run STOP SLAVE 'master1' first +change master to +master_port=MYPORT_2, +master_host='127.0.0.1', +master_user='root'; +ERROR HY000: This operation cannot be performed as you have a running slave 'master1'; run STOP SLAVE 'master1' first +change master to +master_port=MYPORT_1, +master_host='127.0.0.1', +master_user='root' for channel 'master2'; +ERROR HY000: Connection 'master2' conflicts with existing connection 'master1' +set default_master_connection = ''; +change master to +master_port=MYPORT_2, +master_host='127.0.0.1', +master_user='root'; +start slave; +include/wait_for_slave_to_start.inc +# +# Checking SHOW ALL SLAVES STATUS +# +Connection_name = '' +Connection_name = 'master1' +Master_Port = 'MYPORT_2' +Master_Port = 'MYPORT_1' +Relay_Log_File = 'mysqld-relay-bin.000002' +Relay_Log_File = 'mysqld-relay-bin-master1.000002' +Slave_IO_Running = 'Yes' +Slave_IO_Running = 'Yes' +Slave_SQL_Running = 'Yes' +Slave_SQL_Running = 'Yes' +Last_Errno = '0' +Last_Errno = '0' +Last_SQL_Errno = '0' +Last_SQL_Errno = '0' +Slave_heartbeat_period = '60.000' +Slave_heartbeat_period = '60.000' +# +connection master1; +insert into t1 (f1) values ('three'); +connect master2,127.0.0.1,root,,,$SERVER_MYPORT_2; +drop database if exists db2; +create database db2; +use db2; +create table t1 (pk int auto_increment primary key, f1 int) engine=InnoDB; +begin; +insert into t1 (f1) values (1),(2); +connection slave; +connection master2; +connection slave; +select * from db1.t1; +i f1 +1 one +2 two +3 three +select * from db2.t1; +pk f1 +connection master2; +commit; +connection slave; +select * from db2.t1; +pk f1 +1 1 +2 2 +connection master1; +flush logs; +connection slave; +connection master1; +purge binary logs to 'master-bin.000002'; +show binary logs; +Log_name File_size +master-bin.000002 filesize +insert into t1 (f1) values ('four'); +create table db1.t3 (f1 int) engine=InnoDB; +connection slave; +# +# Checking SHOW ALL SLAVES STATUS +# +Connection_name = '' +Connection_name = 'master1' +Master_Port = 'MYPORT_2' +Master_Port = 'MYPORT_1' +Relay_Log_File = 'mysqld-relay-bin.000002' +Relay_Log_File = 'mysqld-relay-bin-master1.000004' +Slave_IO_Running = 'Yes' +Slave_IO_Running = 'Yes' +Slave_SQL_Running = 'Yes' +Slave_SQL_Running = 'Yes' +Last_Errno = '0' +Last_Errno = '0' +Last_SQL_Errno = '0' +Last_SQL_Errno = '0' +Slave_heartbeat_period = '60.000' +Slave_heartbeat_period = '60.000' +# +# +# MDEV:16437: merge 5.7 P_S replication instrumentation and tables +# +SELECT * FROM performance_schema.replication_applier_status_by_coordinator; +CHANNEL_NAME master1 +THREAD_ID # +SERVICE_STATE ON +LAST_ERROR_NUMBER 0 +LAST_ERROR_MESSAGE +LAST_ERROR_TIMESTAMP 0000-00-00 00:00:00 +LAST_SEEN_TRANSACTION 0-1-7 +LAST_TRANS_RETRY_COUNT 0 +CHANNEL_NAME +THREAD_ID # +SERVICE_STATE ON +LAST_ERROR_NUMBER 0 +LAST_ERROR_MESSAGE +LAST_ERROR_TIMESTAMP 0000-00-00 00:00:00 +LAST_SEEN_TRANSACTION 0-2-4 +LAST_TRANS_RETRY_COUNT 0 +select * from db1.t1; +i f1 +1 one +2 two +3 three +4 four +include/show_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-relay-bin.000001 # Format_desc # # SERVER_VERSION, BINLOG_VERSION +mysqld-relay-bin.000001 # Rotate # # mysqld-relay-bin.000002;pos=4 +include/show_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-relay-bin.000002 # Format_desc # # SERVER_VERSION, BINLOG_VERSION +mysqld-relay-bin.000002 # Rotate # # master-bin.000001;pos=POS +mysqld-relay-bin.000002 # Format_desc # # SERVER_VERSION, BINLOG_VERSION +mysqld-relay-bin.000002 # Gtid_list # # [] +mysqld-relay-bin.000002 # Binlog_checkpoint # # master-bin.000001 +mysqld-relay-bin.000002 # Gtid # # GTID #-#-# +mysqld-relay-bin.000002 # Query # # drop database if exists db2 +mysqld-relay-bin.000002 # Gtid # # GTID #-#-# +mysqld-relay-bin.000002 # Query # # create database db2 +mysqld-relay-bin.000002 # Gtid # # GTID #-#-# +mysqld-relay-bin.000002 # Query # # use `db2`; create table t1 (pk int auto_increment primary key, f1 int) engine=InnoDB +mysqld-relay-bin.000002 # Gtid # # BEGIN GTID #-#-# +mysqld-relay-bin.000002 # Intvar # # INSERT_ID=1 +mysqld-relay-bin.000002 # Query # # use `db2`; insert into t1 (f1) values (1),(2) +mysqld-relay-bin.000002 # Xid # # COMMIT /* XID */ +disconnect slave; +connect slave,127.0.0.1,root,,,$SERVER_MYPORT_3; +stop slave io_thread; +show status like 'Slave_running'; +Variable_name Value +Slave_running OFF +set default_master_connection = 'master1'; +show status like 'Slave_running'; +Variable_name Value +Slave_running ON + +# +# syntax compatible test +# + +# +# show relaylog events +# +SHOW RELAYLOG EVENTS for channel 'master1'; +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-relay-bin-master1.000003 4 Format_desc 3 256 Server ver: Version +mysqld-relay-bin-master1.000003 256 Rotate 1 1358 master-bin.000002;pos=4 +mysqld-relay-bin-master1.000003 304 Rotate 3 366 mysqld-relay-bin-master1.000004;pos=4 + +show slave status for channel 'master1' +Master_Port = 'MYPORT_1' +Relay_Log_File = 'mysqld-relay-bin-master1.000004' +Slave_IO_Running = 'Yes' +Slave_SQL_Running = 'Yes' +Last_Errno = '0' +Last_SQL_Errno = '0' + +# +# stop slave +# +STOP SLAVE for channel 'master1'; + +show slave status for channel 'master1' +Master_Port = 'MYPORT_1' +Relay_Log_File = 'mysqld-relay-bin-master1.000004' +Slave_IO_Running = 'No' +Slave_SQL_Running = 'No' +Last_Errno = '0' +Last_SQL_Errno = '0' + +# +# start slave +# +START SLAVE for channel 'master1'; +include/wait_for_slave_to_start.inc + +show slave status for channel 'master1' +Master_Port = 'MYPORT_1' +Relay_Log_File = 'mysqld-relay-bin-master1.000005' +Slave_IO_Running = 'Yes' +Slave_SQL_Running = 'Yes' +Last_Errno = '0' +Last_SQL_Errno = '0' + +# +# flush relay logs +# +FLUSH RELAY LOGS for channel 'master1'; + +show slave status for channel 'master1' +Master_Port = 'MYPORT_1' +Relay_Log_File = 'mysqld-relay-bin-master1.000006' +Slave_IO_Running = 'Yes' +Slave_SQL_Running = 'Yes' +Last_Errno = '0' +Last_SQL_Errno = '0' + +# +# stop slave +# +STOP SLAVE for channel 'master1'; + +show slave status for channel 'master1' +Master_Port = 'MYPORT_1' +Relay_Log_File = 'mysqld-relay-bin-master1.000006' +Slave_IO_Running = 'No' +Slave_SQL_Running = 'No' +Last_Errno = '0' +Last_SQL_Errno = '0' + +# +# reset slave +# +RESET SLAVE for channel 'master1'; + +show slave status for channel 'master1' +Master_Port = 'MYPORT_1' +Relay_Log_File = '' +Slave_IO_Running = 'No' +Slave_SQL_Running = 'No' +Last_Errno = '0' +Last_SQL_Errno = '0' + +# +# show relaylog events after reset slave +# +SHOW RELAYLOG EVENTS for channel 'master1'; +Log_name Pos Event_type Server_id End_log_pos Info + +# +# check error syntax +# +RESET SLAVE 'master1' for channel 'mmaster2'; +ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME) +STOP SLAVE 'master1' for channel 'master2'; +ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME) +FLUSH RELAY LOGS 'master1' for channel 'master2'; +ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME) +START SLAVE 'master1' for channel 'master2'; +ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME) +SHOW RELAYLOG 'master1' EVENTS for channel 'master2'; +ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME) +SHOW SLAVE 'master1' STATUS for channel 'master2'; +ERROR HY000: Incorrect arguments to CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME) + +drop database db1; +drop database db2; +include/reset_master_slave.inc +disconnect slave; +connection master1; +drop database db1; +include/reset_master_slave.inc +disconnect master1; +connection master2; +drop database db2; +include/reset_master_slave.inc +disconnect master2; +connection default; +CREATE TABLE channel (channel int); +DROP TABLE channel; diff --git a/mysql-test/suite/multi_source/multisource_for_channel.test b/mysql-test/suite/multi_source/multisource_for_channel.test new file mode 100644 index 00000000000..9b74ea97742 --- /dev/null +++ b/mysql-test/suite/multi_source/multisource_for_channel.test @@ -0,0 +1,429 @@ +# +# This is the basic test of support mysql syntax "for channel" used for +# multi-source replication +# +# Test basic replication functionality in multi-source setup +# + +--source include/not_embedded.inc +--source include/have_innodb.inc +--source include/have_perfschema.inc +--source include/binlog_start_pos.inc +--let $rpl_server_count= 0 + +RESET MASTER; + +--connect (slave,127.0.0.1,root,,,$SERVER_MYPORT_3) + +# MDEV-3984: crash/read of freed memory when changing master with named connection +# This fails after adding the new master 'abc1', check we do not free twice. +--error ER_RELAY_LOG_INIT +change master to relay_log_file='' for channel 'abc1'; +# This fails before adding the new master, check that we do free it. +--error ER_WRONG_ARGUMENTS +change master to master_host='' for channel 'abc2'; + +# Start replication from the first master + +--replace_result $SERVER_MYPORT_1 MYPORT_1 +eval change master to +master_port=$SERVER_MYPORT_1, +master_host='127.0.0.1', +master_user='root' +for channel 'master1'; + +start slave for channel 'master1'; +set default_master_connection = 'master1'; +--source include/wait_for_slave_to_start.inc + +--connect (master1,127.0.0.1,root,,,$SERVER_MYPORT_1) +--save_master_pos + +--connection slave +--sync_with_master 0,'master1' + +# Here and further: add an extra check on SQL thread status +# as the normal sync is not always enough +--source include/wait_for_sql_thread_read_all.inc + +# each of the 3 commands should produce +# 'master1' status + +let $wait_for_all= 1; +let $show_statement= SHOW ALL SLAVES STATUS; +let $field= Slave_IO_State; +let $condition= = 'Waiting for master to send event'; +--source include/wait_show_condition.inc + +--echo # +--echo # Checking SHOW SLAVE 'master1' STATUS +--echo # +--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno +--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ +--let $slave_name= 'master1' +--let for_channel= 1 +--source include/show_slave_status.inc +--let $slave_name= +--let for_channel= + +--echo # +--echo # Checking SHOW SLAVE STATUS +--echo # +--source include/show_slave_status.inc + +--echo # +--echo # Checking SHOW ALL SLAVES STATUS +--echo # +--let $all_slaves_status= 1 +--let $status_items= Connection_name, Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno, Slave_heartbeat_period +--source include/show_slave_status.inc +--let $all_slaves_status= +--echo # + + +# Check that replication actually works + +--connection master1 + +--disable_warnings +drop database if exists db1; +--enable_warnings +create database db1; +use db1; +create table t1 (i int auto_increment, f1 varchar(16), primary key pk (i,f1)) engine=MyISAM; +insert into t1 (f1) values ('one'),('two'); +--save_master_pos + +--connection slave +--sync_with_master 0,'master1' + +--sorted_result +select * from db1.t1; + +--let $datadir = `SELECT @@datadir` + +--echo # List of relay log files in the datadir +--list_files $datadir mysqld-relay-bin-master1.* + +# Check that relay logs are recognizable + +let binlog_start=4; +let binlog_file=; +source include/show_relaylog_events.inc; +let binlog_file= mysqld-relay-bin-master1.000002; +source include/show_relaylog_events.inc; + +# Try to configure connection with the same name again, +# should get an error because the slave is running + +--replace_result $SERVER_MYPORT_2 MYPORT_2 +--error ER_SLAVE_MUST_STOP +eval change master to +master_port=$SERVER_MYPORT_2, +master_host='127.0.0.1', +master_user='root' +for channel 'master1'; + +# Try to configure using the default connection name +# (which is 'master1' at the moment), +# again, should get an error + +--replace_result $SERVER_MYPORT_2 MYPORT_2 +--error ER_SLAVE_MUST_STOP +eval change master to +master_port=$SERVER_MYPORT_2, +master_host='127.0.0.1', +master_user='root'; + +# Try to configure a connection with the same master +# using a different name, should get a conflict + +--replace_result $SERVER_MYPORT_1 MYPORT_1 +--error ER_CONNECTION_ALREADY_EXISTS +eval change master to +master_port=$SERVER_MYPORT_1, +master_host='127.0.0.1', +master_user='root' for channel 'master2'; + + +# Set up a proper 'default' connection to master2 + +set default_master_connection = ''; + +--replace_result $SERVER_MYPORT_2 MYPORT_2 +eval change master to +master_port=$SERVER_MYPORT_2, +master_host='127.0.0.1', +master_user='root'; + +start slave; +--source include/wait_for_slave_to_start.inc + +--source include/wait_for_sql_thread_read_all.inc + +# See both connections in the same status output + +let $wait_for_all= 1; +let $show_statement= SHOW ALL SLAVES STATUS; +let $field= Slave_IO_State; +let $condition= = 'Waiting for master to send event'; +--source include/wait_show_condition.inc + +--echo # +--echo # Checking SHOW ALL SLAVES STATUS +--echo # +--let $all_slaves_status= 1 +--let $status_items= Connection_name, Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno, Slave_heartbeat_period +--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ /$SERVER_MYPORT_2/MYPORT_2/ +--source include/show_slave_status.inc +--let $all_slaves_status= +--echo # + +# Check that replication from two servers actually works + +--connection master1 + +insert into t1 (f1) values ('three'); +--save_master_pos + +--connect (master2,127.0.0.1,root,,,$SERVER_MYPORT_2) + +--disable_warnings +drop database if exists db2; +--enable_warnings +create database db2; +use db2; +create table t1 (pk int auto_increment primary key, f1 int) engine=InnoDB; +begin; +insert into t1 (f1) values (1),(2); + +--connection slave +--sync_with_master 0,'master1' + +--connection master2 +--save_master_pos + +--connection slave +--sync_with_master 0 +--sorted_result +select * from db1.t1; +select * from db2.t1; + +--connection master2 +commit; +--save_master_pos + +--connection slave +--sync_with_master 0 +--sorted_result +select * from db2.t1; + +# Flush and purge logs on one master, +# make sure slaves don't get confused + +--connection master1 +flush logs; +--source include/wait_for_binlog_checkpoint.inc +--save_master_pos +--connection slave +--sync_with_master 0, 'master1' + +--connection master1 +purge binary logs to 'master-bin.000002'; +# Additional events: 43 (Gtid_list) + 2 x 44 (Binlog_checkpoint) = 131 +let filesize=`select $binlog_start_pos+131`; +--replace_result $filesize filesize +show binary logs; +insert into t1 (f1) values ('four'); +create table db1.t3 (f1 int) engine=InnoDB; +--save_master_pos + +--connection slave +--sync_with_master 0,'master1' + +--source include/wait_for_sql_thread_read_all.inc + +let $wait_for_all= 1; +let $show_statement= SHOW ALL SLAVES STATUS; +let $field= Slave_IO_State; +let $condition= = 'Waiting for master to send event'; +--source include/wait_show_condition.inc + +--echo # +--echo # Checking SHOW ALL SLAVES STATUS +--echo # +--let $all_slaves_status= 1 +--let $status_items= Connection_name, Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno, Slave_heartbeat_period +--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ /$SERVER_MYPORT_2/MYPORT_2/ +--source include/show_slave_status.inc +--let $all_slaves_status= +--echo # + +--echo # +--echo # MDEV:16437: merge 5.7 P_S replication instrumentation and tables +--echo # +--replace_column 2 # +query_vertical SELECT * FROM performance_schema.replication_applier_status_by_coordinator; + +--sorted_result +select * from db1.t1; + +# This should show relay log events for the default master +# (the one with the empty name) +let binlog_file=; +source include/show_relaylog_events.inc; +let binlog_file= mysqld-relay-bin.000002; +source include/show_relaylog_events.inc; + +# Make sure we don't lose control over replication connections +# after reconnecting to the slave + +--disconnect slave +--connect (slave,127.0.0.1,root,,,$SERVER_MYPORT_3) + +stop slave io_thread; +show status like 'Slave_running'; +set default_master_connection = 'master1'; +show status like 'Slave_running'; + +--echo +--echo # +--echo # syntax compatible test +--echo # +--echo +--echo # +--echo # show relaylog events +--echo # +--replace_regex /Server ver:.*/Server ver: Version/ +SHOW RELAYLOG EVENTS for channel 'master1'; + +--echo +--echo show slave status for channel 'master1' +--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno +--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ +--let $slave_name= 'master1' +--let $for_channel= 1 +--source include/show_slave_status.inc + +--echo +--echo # +--echo # stop slave +--echo # +STOP SLAVE for channel 'master1'; + +--echo +--echo show slave status for channel 'master1' +--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno +--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ +--let $slave_name= 'master1' +--let $for_channel= 1 +--source include/show_slave_status.inc + +--echo +--echo # +--echo # start slave +--echo # +START SLAVE for channel 'master1'; +--source include/wait_for_slave_to_start.inc + +--echo +--echo show slave status for channel 'master1' +--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno +--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ /Preparing/Yes/ +--let $slave_name= 'master1' +--let $for_channel= 1 +--source include/show_slave_status.inc + +--echo +--echo # +--echo # flush relay logs +--echo # +FLUSH RELAY LOGS for channel 'master1'; +--source include/wait_for_sql_thread_read_all.inc + +--echo +--echo show slave status for channel 'master1' +--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno +--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ +--let $slave_name= 'master1' +--let $for_channel= 1 +--source include/show_slave_status.inc + +--echo +--echo # +--echo # stop slave +--echo # +STOP SLAVE for channel 'master1'; + +--echo +--echo show slave status for channel 'master1' +--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno +--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ +--let $slave_name= 'master1' +--let $for_channel= 1 +--source include/show_slave_status.inc + +--echo +--echo # +--echo # reset slave +--echo # +RESET SLAVE for channel 'master1'; + +--echo +--echo show slave status for channel 'master1' +--let $status_items= Master_Port, Relay_Log_File, Slave_IO_Running, Slave_SQL_Running, Last_Errno, Last_SQL_Errno +--let $slave_field_result_replace= /$SERVER_MYPORT_1/MYPORT_1/ +--let $slave_name= 'master1' +--let $for_channel= 1 +--source include/show_slave_status.inc + +--echo +--echo # +--echo # show relaylog events after reset slave +--echo # +SHOW RELAYLOG EVENTS for channel 'master1'; + +--let $slave_name= +--let for_channel= + +--echo +--echo # +--echo # check error syntax +--echo # +--error ER_WRONG_ARGUMENTS +RESET SLAVE 'master1' for channel 'mmaster2'; +--error ER_WRONG_ARGUMENTS +STOP SLAVE 'master1' for channel 'master2'; +--error ER_WRONG_ARGUMENTS +FLUSH RELAY LOGS 'master1' for channel 'master2'; +--error ER_WRONG_ARGUMENTS +START SLAVE 'master1' for channel 'master2'; +--error ER_WRONG_ARGUMENTS +SHOW RELAYLOG 'master1' EVENTS for channel 'master2'; +--error ER_WRONG_ARGUMENTS +SHOW SLAVE 'master1' STATUS for channel 'master2'; + +--echo +# Cleanup +drop database db1; +drop database db2; + +--source include/reset_master_slave.inc +--disconnect slave + +--connection master1 +drop database db1; +--source include/reset_master_slave.inc +--disconnect master1 + +--connection master2 +drop database db2; +--source include/reset_master_slave.inc +--disconnect master2 + +# +# Check channel as a keyword +# +--connection default +CREATE TABLE channel (channel int); +DROP TABLE channel; diff --git a/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result b/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result index 91ae3cb40e1..864374be5af 100644 --- a/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result +++ b/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result @@ -8,5 +8,5 @@ SELECT 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 #################################### SELECT event_name, digest, digest_text, sql_text FROM events_statements_history_long; event_name digest digest_text sql_text -statement/sql/select cf4e66f3ef1e0c9905538c220053cbda SELECT ? + ? + SELECT ... -statement/sql/truncate f874a3c85ab326928c042dbd544916f9 TRUNCATE TABLE truncat... +statement/sql/select ca9181d6d668396d467dd974f58a9402 SELECT ? + ? + SELECT ... +statement/sql/truncate 460cb5329baea0e4242059cfda01d1d7 TRUNCATE TABLE truncat... diff --git a/sql/lex.h b/sql/lex.h index cbf9d9d51b2..8643197e862 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -110,6 +110,7 @@ SYMBOL symbols[] = { { "CHAIN", SYM(CHAIN_SYM)}, { "CHANGE", SYM(CHANGE)}, { "CHANGED", SYM(CHANGED)}, + { "CHANNEL", SYM(CHANNEL_SYM)}, { "CHAR", SYM(CHAR_SYM)}, { "CHARACTER", SYM(CHAR_SYM)}, { "CHARSET", SYM(CHARSET)}, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 0c1c68cd644..704812e5dd8 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -778,6 +778,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %token <kwd> CATALOG_NAME_SYM /* SQL-2003-N */ %token <kwd> CHAIN_SYM /* SQL-2003-N */ %token <kwd> CHANGED +%token <kwd> CHANNEL_SYM %token <kwd> CHARSET %token <kwd> CHECKPOINT_SYM %token <kwd> CHECKSUM_SYM @@ -2076,6 +2077,7 @@ change: Lex->sql_command = SQLCOM_CHANGE_MASTER; } master_defs + optional_for_channel {} ; @@ -2307,6 +2309,34 @@ connection_name: } ; +optional_for_channel: + /* empty */ + { + /*do nothing */ + } + | for_channel + + ; + +for_channel: + FOR_SYM CHANNEL_SYM TEXT_STRING_sys + { + if (Lex->mi.connection_name.str != NULL) + { + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)")); + } + else + { + Lex->mi.connection_name= $3; +#ifdef HAVE_REPLICATION + if (unlikely(check_master_connection_name(&$3))) + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME")); +#endif + } + + } + ; + /* create a table */ create: @@ -8030,7 +8060,7 @@ opt_to: ; slave: - START_SYM SLAVE optional_connection_name slave_thread_opts + START_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel { LEX *lex=Lex; lex->sql_command = SQLCOM_SLAVE_START; @@ -8047,7 +8077,7 @@ slave: /* If you change this code don't forget to update STOP SLAVE too */ } {} - | STOP_SYM SLAVE optional_connection_name slave_thread_opts + | STOP_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel { LEX *lex=Lex; lex->sql_command = SQLCOM_SLAVE_STOP; @@ -13931,7 +13961,8 @@ show_param: LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_RELAYLOG_EVENTS; } - opt_global_limit_clause + opt_global_limit_clause optional_for_channel + { } | keys_or_index from_or_in table_ident opt_db opt_where_clause { LEX *lex= Lex; @@ -14076,16 +14107,7 @@ show_param: MYSQL_YYABORT; Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; } - | SLAVE STATUS_SYM - { - LEX *lex= thd->lex; - lex->mi.connection_name= null_clex_str; - if (!(lex->m_sql_cmd= new (thd->mem_root) - Sql_cmd_show_slave_status())) - MYSQL_YYABORT; - lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; - } - | SLAVE connection_name STATUS_SYM + | SLAVE optional_connection_name STATUS_SYM optional_for_channel { if (!(Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_show_slave_status())) @@ -14470,7 +14492,7 @@ flush_option: { Lex->type|= REFRESH_SLOW_LOG; } | BINARY LOGS_SYM opt_delete_gtid_domain { Lex->type|= REFRESH_BINARY_LOG; } - | RELAY LOGS_SYM optional_connection_name + | RELAY LOGS_SYM optional_connection_name optional_for_channel { LEX *lex= Lex; if (unlikely(lex->type & REFRESH_RELAY_LOG)) @@ -14621,7 +14643,8 @@ reset_options: reset_option: SLAVE { Lex->type|= REFRESH_SLAVE; } optional_connection_name - slave_reset_options { } + slave_reset_options optional_for_channel + { } | MASTER_SYM { Lex->type|= REFRESH_MASTER; @@ -15918,6 +15941,7 @@ keyword_sp_var_and_label: | CASCADED | CATALOG_NAME_SYM | CHAIN_SYM + | CHANNEL_SYM | CHANGED | CIPHER_SYM | CLIENT_SYM |