mirror of
https://github.com/MariaDB/server.git
synced 2025-02-10 15:35:34 +01:00
![Michael Widenius](/assets/img/avatar_default.png)
rpl_semi_sync_slave_enabled_consistent.test and the first part of the commit message comes from Brandon Nesterenko. A test to show how to induce the "Read semi-sync reply magic number error" message on a primary. In short, if semi-sync is turned on during the hand-shake process between a primary and replica, but later a user negates the rpl_semi_sync_slave_enabled variable while the replica's IO thread is running; if the io thread exits, the replica can skip a necessary call to kill_connection() in repl_semisync_slave.slave_stop() due to its reliance on a global variable. Then, the replica will send a COM_QUIT packet to the primary on an active semi-sync connection, causing the magic number error. The test in this patch exits the IO thread by forcing an error; though note a call to STOP SLAVE could also do this, but it ends up needing more synchronization. That is, the STOP SLAVE command also tries to kill the VIO of the replica, which makes a race with the IO thread to try and send the COM_QUIT before this happens (which would need more debug_sync to get around). See THD::awake_no_mutex for details as to the killing of the replica’s vio. Notes: - The MariaDB documentation does not make it clear that when one enables semi-sync replication it does not matter if one enables it first in the master or slave. Any order works. Changes done: - The rpl_semi_sync_slave_enabled variable is now a default value for when semisync is started. The variable does not anymore affect semisync if it is already running. This fixes the original reported bug. Internally we now use repl_semisync_slave.get_slave_enabled() instead of rpl_semi_sync_slave_enabled. To check if semisync is active on should check the @@rpl_semi_sync_slave_status variable (as before). - The semisync protocol conflicts in the way that the original MySQL/MariaDB client-server protocol was designed (client-server send and reply packets are strictly ordered and includes a packet number to allow one to check if a packet is lost). When using semi-sync the master and slave can send packets at 'any time', so packet numbering does not work. The 'solution' has been that each communication starts with packet number 1, but in some cases there is still a chance that the packet number check can fail. Fixed by adding a flag (pkt_nr_can_be_reset) in the NET struct that one can use to signal that packet number checking should not be done. This is flag is set when semi-sync is used. - Added Master_info::semi_sync_reply_enabled to allow one to configure some slaves with semisync and other other slaves without semisync. Removed global variable semi_sync_need_reply that would not work with multi-master. - Repl_semi_sync_master::report_reply_packet() can now recognize the COM_QUIT packet from semisync slave and not give a "Read semi-sync reply magic number error" error for this case. The slave will be removed from the Ack listener. - On Windows, don't stop semisync Ack listener just because one slave connection is using socket_id > FD_SETSIZE. - Removed busy loop in Ack_receiver::run() by using "Self-pipe trick" to signal new slave and stop Ack_receiver. - Changed some Repl_semi_sync_slave functions that always returns 0 from int to void. - Added Repl_semi_sync_slave::slave_reconnect(). - Removed dummy_function Repl_semi_sync_slave::reset_slave(). - Removed some duplicate semisync notes from the error log. - Add test of "if (get_slave_enabled() && semi_sync_need_reply)" before calling Repl_semi_sync_slave::slave_reply(). (Speeds up the code as we can skip all initializations). - If epl_semisync_slave.slave_reply() fails, we disable semisync for that connection. - We do not call semisync.switch_off() if there are no active slaves. Instead we check in Repl_semi_sync_master::commit_trx() if there are no active threads. This simplices the code. - Changed assert() to DBUG_ASSERT() to ensure that the DBUG log is flushed in case of asserts. - Removed the internal rpl_semi_sync_slave_status as it is not needed anymore. The @@rpl_semi_sync_slave_status status variable is now mapped to rpl_semi_sync_enabled. - Removed rpl_semi_sync_slave_enabled as it is not needed anymore. Repl_semi_sync_slave::get_slave_enabled() contains the active status. - Added checking that we do not add a slave twice with Ack_receiver::add_slave(). This could happen with old code. - Removed Repl_semi_sync_master::check_and_switch() as it is not needed anymore. - Ensure that when we call Ack_receiver::remove_slave() that the slave is removed from the listener before function returns. - Call listener.listen_on_sockets() outside of mutex for better performance and less contested mutex. - Ensure that listening is ignoring newly added slaves when checking for responses. - Fixed the master ack_receiver listener is not killed if there are no connected slaves (and thus stop semisync handling of future connections). This could happen if all slaves sockets where would be marked as unreliable. - Added unlink() to base_ilist_iterator and remove() to I_List_iterator. This enables us to remove 'dead' slaves in Ack_recever::run(). - kill_zombie_dump_threads() now does killing of dump threads properly. - It can now kill several threads (should be impossible but could happen if IO slaves reconnects very fast). - We now wait until the dump thread is done before starting the dump. - Added an error if kill_zombie_dump_threads() fails. - Set thd->variables.server_id before calling kill_zombie_dump_threads(). This simplies the code. - Added a lot of comments both in code and tests. - Removed DBUG_EVALUATE_IF "failed_slave_start" as it is not used. Test changes: - rpl.rpl_session_var2 added which runs rpl.rpl_session_var test with semisync enabled. - Some timings changed slight with startup of slave which caused rpl_binlog_dump_slave_gtid_state_info.text to fail as it checked the error log file before the slave had started properly. Fixed by adding wait_for_pattern_in_file.inc that allows waiting for the pattern to appear in the log file. - Tests have been updated so that we first set rpl_semi_sync_master_enabled on the master and then set rpl_semi_sync_slave_enabled on the slaves (this is according to how the MariaDB documentation document how to setup semi-sync). - Error text "Master server does not have semi-sync enabled" has been replaced with "Master server does not support semi-sync" for the case when the master supports semi-sync but semi-sync is not enabled. Other things: - Some trivial cleanups in Repl_semi_sync_master::update_sync_header(). - We should in 11.3 changed the default value for rpl-semi-sync-master-wait-no-slave from TRUE to FALSE as the TRUE does not make much sense as default. The main difference with using FALSE is that we do not wait for semisync Ack if there are no slave threads. In the case of TRUE we wait once, which did not bring any notable benefits except slower startup of master configured for using semisync. Co-author: Brandon Nesterenko <brandon.nesterenko@mariadb.com> This solves the problem reported in MDEV-32960 where a new slave may not be registered in time and the master disables semi sync because of that.
482 lines
14 KiB
Text
482 lines
14 KiB
Text
include/master-slave.inc
|
|
[connection master]
|
|
connection master;
|
|
call mtr.add_suppression("Timeout waiting for reply of binlog");
|
|
call mtr.add_suppression("Read semi-sync reply");
|
|
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.");
|
|
call mtr.add_suppression("mysqld: Got an error reading communication packets");
|
|
connection slave;
|
|
call mtr.add_suppression("Semi-sync slave .* reply");
|
|
call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group");
|
|
connection master;
|
|
#
|
|
# Uninstall semi-sync plugins on master and slave
|
|
#
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
reset slave;
|
|
set global rpl_semi_sync_master_enabled= 0;
|
|
set global rpl_semi_sync_slave_enabled= 0;
|
|
connection master;
|
|
reset master;
|
|
set global rpl_semi_sync_master_enabled= 0;
|
|
set global rpl_semi_sync_slave_enabled= 0;
|
|
#
|
|
# Main test of semi-sync replication start here
|
|
#
|
|
connection master;
|
|
set global rpl_semi_sync_master_timeout= 2000;
|
|
[ default state of semi-sync on master should be OFF ]
|
|
show variables like 'rpl_semi_sync_master_enabled';
|
|
Variable_name Value
|
|
rpl_semi_sync_master_enabled OFF
|
|
[ enable semi-sync on master ]
|
|
set global rpl_semi_sync_master_enabled = 1;
|
|
show variables like 'rpl_semi_sync_master_enabled';
|
|
Variable_name Value
|
|
rpl_semi_sync_master_enabled ON
|
|
[ status of semi-sync on master should be ON even without any semi-sync slaves ]
|
|
show status like 'Rpl_semi_sync_master_clients';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_clients 0
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status ON
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 0
|
|
#
|
|
# BUG#45672 Semisync repl: ActiveTranx:insert_tranx_node: transaction node allocation failed
|
|
# BUG#45673 Semisynch reports correct operation even if no slave is connected
|
|
#
|
|
[ status of semi-sync on master should be OFF ]
|
|
show status like 'Rpl_semi_sync_master_clients';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_clients 0
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status OFF
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 0
|
|
reset master;
|
|
connection slave;
|
|
[ default state of semi-sync on slave should be OFF ]
|
|
show variables like 'rpl_semi_sync_slave_enabled';
|
|
Variable_name Value
|
|
rpl_semi_sync_slave_enabled OFF
|
|
[ enable semi-sync on slave ]
|
|
set global rpl_semi_sync_slave_enabled = 1;
|
|
show variables like 'rpl_semi_sync_slave_enabled';
|
|
Variable_name Value
|
|
rpl_semi_sync_slave_enabled ON
|
|
include/start_slave.inc
|
|
connection master;
|
|
[ initial master state after the semi-sync slave connected ]
|
|
show status like 'Rpl_semi_sync_master_clients';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_clients 1
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status ON
|
|
show status like 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 0
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 0
|
|
create table t1(a int) engine = ENGINE_TYPE;
|
|
[ master state after CREATE TABLE statement ]
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status ON
|
|
show status like 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 0
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 1
|
|
select CONNECTIONS_NORMAL_SLAVE - CONNECTIONS_NORMAL_SLAVE as 'Should be 0';
|
|
Should be 0
|
|
0
|
|
[ insert records to table ]
|
|
insert t1 values (10);
|
|
insert t1 values (9);
|
|
insert t1 values (8);
|
|
insert t1 values (7);
|
|
insert t1 values (6);
|
|
insert t1 values (5);
|
|
insert t1 values (4);
|
|
insert t1 values (3);
|
|
insert t1 values (2);
|
|
insert t1 values (1);
|
|
[ master status after inserts ]
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status ON
|
|
show status like 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 0
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 11
|
|
connection slave;
|
|
[ slave status after replicated inserts ]
|
|
show status like 'Rpl_semi_sync_slave_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_slave_status ON
|
|
select count(distinct a) from t1;
|
|
count(distinct a)
|
|
10
|
|
select min(a) from t1;
|
|
min(a)
|
|
1
|
|
select max(a) from t1;
|
|
max(a)
|
|
10
|
|
|
|
# BUG#50157
|
|
# semi-sync replication crashes when replicating a transaction which
|
|
# include 'CREATE TEMPORARY TABLE `MyISAM_t` SELECT * FROM `Innodb_t` ;
|
|
connection master;
|
|
SET SESSION AUTOCOMMIT= 0;
|
|
CREATE TABLE t2(c1 INT) ENGINE=innodb;
|
|
connection slave;
|
|
connection master;
|
|
BEGIN;
|
|
|
|
# Even though it is in a transaction, this statement is binlogged into binlog
|
|
# file immediately.
|
|
CREATE TEMPORARY TABLE t3 SELECT c1 FROM t2 where 1=1;
|
|
|
|
# These statements will not be binlogged until the transaction is committed
|
|
INSERT INTO t2 VALUES(11);
|
|
INSERT INTO t2 VALUES(22);
|
|
COMMIT;
|
|
DROP TABLE t2, t3;
|
|
SET SESSION AUTOCOMMIT= 1;
|
|
connection slave;
|
|
#
|
|
# Test semi-sync master will switch OFF after one transaction
|
|
# timeout waiting for slave reply.
|
|
#
|
|
connection master;
|
|
show status like "Rpl_semi_sync_master_status";
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status ON
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
connection master;
|
|
include/kill_binlog_dump_threads.inc
|
|
set global rpl_semi_sync_master_timeout= 2000;
|
|
[ master status should be ON ]
|
|
show status like 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 0
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 14
|
|
[ semi-sync replication of these transactions will fail ]
|
|
insert into t1 values (500);
|
|
[ master status should be OFF ]
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status OFF
|
|
show status like 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 1
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 14
|
|
delete from t1 where a=10;
|
|
delete from t1 where a=9;
|
|
delete from t1 where a=8;
|
|
delete from t1 where a=7;
|
|
delete from t1 where a=6;
|
|
delete from t1 where a=5;
|
|
delete from t1 where a=4;
|
|
delete from t1 where a=3;
|
|
delete from t1 where a=2;
|
|
delete from t1 where a=1;
|
|
insert into t1 values (100);
|
|
[ master status should be OFF ]
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status OFF
|
|
show status like 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 12
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 14
|
|
#
|
|
# Test semi-sync status on master will be ON again when slave catches up
|
|
#
|
|
connection slave;
|
|
[ slave status should be OFF ]
|
|
show status like 'Rpl_semi_sync_slave_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_slave_status OFF
|
|
include/start_slave.inc
|
|
[ slave status should be ON ]
|
|
show status like 'Rpl_semi_sync_slave_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_slave_status ON
|
|
select count(distinct a) from t1;
|
|
count(distinct a)
|
|
2
|
|
select min(a) from t1;
|
|
min(a)
|
|
100
|
|
select max(a) from t1;
|
|
max(a)
|
|
500
|
|
connection master;
|
|
[ master status should be ON again after slave catches up ]
|
|
show status like 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 12
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 14
|
|
show status like 'Rpl_semi_sync_master_clients';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_clients 1
|
|
#
|
|
# Test disable/enable master semi-sync on the fly.
|
|
#
|
|
drop table t1;
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
#
|
|
# Flush status
|
|
#
|
|
connection master;
|
|
[ Semi-sync master status variables before FLUSH STATUS ]
|
|
SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 12
|
|
SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 15
|
|
FLUSH NO_WRITE_TO_BINLOG STATUS;
|
|
[ Semi-sync master status variables after FLUSH STATUS ]
|
|
SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 0
|
|
SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 0
|
|
connection master;
|
|
show master logs;
|
|
Log_name master-bin.000001
|
|
File_size #
|
|
show variables like 'rpl_semi_sync_master_enabled';
|
|
Variable_name Value
|
|
rpl_semi_sync_master_enabled ON
|
|
[ disable semi-sync on the fly ]
|
|
set global rpl_semi_sync_master_enabled=0;
|
|
show variables like 'rpl_semi_sync_master_enabled';
|
|
Variable_name Value
|
|
rpl_semi_sync_master_enabled OFF
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status OFF
|
|
[ enable semi-sync on the fly ]
|
|
set global rpl_semi_sync_master_enabled=1;
|
|
show variables like 'rpl_semi_sync_master_enabled';
|
|
Variable_name Value
|
|
rpl_semi_sync_master_enabled ON
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status ON
|
|
#
|
|
# Test RESET MASTER/SLAVE
|
|
#
|
|
connection slave;
|
|
include/start_slave.inc
|
|
connection master;
|
|
create table t1 (a int) engine = ENGINE_TYPE;
|
|
drop table t1;
|
|
connection slave;
|
|
[ test reset master ]
|
|
connection master;
|
|
reset master;
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status ON
|
|
show status like 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 0
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 0
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
reset slave;
|
|
include/kill_binlog_dump_threads.inc
|
|
connection slave;
|
|
include/start_slave.inc
|
|
connection master;
|
|
connection slave;
|
|
connection master;
|
|
create table t1 (a int) engine = ENGINE_TYPE;
|
|
insert into t1 values (1);
|
|
insert into t1 values (2), (3);
|
|
connection slave;
|
|
select * from t1;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
connection master;
|
|
[ master semi-sync status should be ON ]
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status ON
|
|
show status like 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 0
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 3
|
|
#
|
|
# Start semi-sync replication without SUPER privilege
|
|
#
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
reset slave;
|
|
connection master;
|
|
reset master;
|
|
include/kill_binlog_dump_threads.inc
|
|
set sql_log_bin=0;
|
|
grant replication slave on *.* to rpl@127.0.0.1 identified by 'rpl_password';
|
|
flush privileges;
|
|
set sql_log_bin=1;
|
|
connection slave;
|
|
grant replication slave on *.* to rpl@127.0.0.1 identified by 'rpl_password';
|
|
flush privileges;
|
|
change master to master_user='rpl',master_password='rpl_password';
|
|
include/start_slave.inc
|
|
show status like 'Rpl_semi_sync_slave_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_slave_status ON
|
|
connection master;
|
|
connection slave;
|
|
connection master;
|
|
[ master semi-sync should be ON ]
|
|
show status like 'Rpl_semi_sync_master_clients';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_clients 1
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status ON
|
|
show status like 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 0
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 0
|
|
insert into t1 values (4);
|
|
insert into t1 values (5);
|
|
[ master semi-sync should be ON ]
|
|
show status like 'Rpl_semi_sync_master_clients';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_clients 1
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status ON
|
|
show status like 'Rpl_semi_sync_master_no_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_no_tx 0
|
|
show status like 'Rpl_semi_sync_master_yes_tx';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_yes_tx 2
|
|
#
|
|
# Test semi-sync slave connect to non-semi-sync master
|
|
#
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_slave_status OFF
|
|
connection master;
|
|
include/kill_binlog_dump_threads.inc
|
|
[ Semi-sync status on master should be ON ]
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status ON
|
|
set global rpl_semi_sync_master_enabled= 0;
|
|
connection slave;
|
|
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
|
|
Variable_name Value
|
|
rpl_semi_sync_slave_enabled ON
|
|
include/start_slave.inc
|
|
connection master;
|
|
insert into t1 values (8);
|
|
[ master semi-sync clients should be 1, status should be OFF ]
|
|
show status like 'Rpl_semi_sync_master_clients';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_clients 1
|
|
show status like 'Rpl_semi_sync_master_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_master_status OFF
|
|
connection slave;
|
|
show status like 'Rpl_semi_sync_slave_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_slave_status ON
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
connection master;
|
|
set global rpl_semi_sync_master_enabled= 0;
|
|
connection slave;
|
|
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
|
|
Variable_name Value
|
|
rpl_semi_sync_slave_enabled ON
|
|
include/start_slave.inc
|
|
connection master;
|
|
insert into t1 values (10);
|
|
connection slave;
|
|
#
|
|
# Test non-semi-sync slave connect to semi-sync master
|
|
#
|
|
connection master;
|
|
set global rpl_semi_sync_master_timeout= 5000;
|
|
set global rpl_semi_sync_master_enabled= 1;
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_slave_status OFF
|
|
[ uninstall semi-sync slave plugin ]
|
|
set global rpl_semi_sync_slave_enabled= 0;
|
|
[ reinstall semi-sync slave plugin and disable semi-sync ]
|
|
SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
|
|
Variable_name Value
|
|
rpl_semi_sync_slave_enabled OFF
|
|
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_slave_status OFF
|
|
include/start_slave.inc
|
|
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
|
|
Variable_name Value
|
|
Rpl_semi_sync_slave_status OFF
|
|
#
|
|
# Clean up
|
|
#
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
set global rpl_semi_sync_slave_enabled= 0;
|
|
connection master;
|
|
set global rpl_semi_sync_master_enabled= 0;
|
|
connection slave;
|
|
change master to master_user='root',master_password='';
|
|
include/start_slave.inc
|
|
connection master;
|
|
drop table t1;
|
|
connection slave;
|
|
connection master;
|
|
drop user rpl@127.0.0.1;
|
|
flush privileges;
|
|
set global rpl_semi_sync_master_timeout= default;
|
|
include/rpl_end.inc
|