summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/rpl/t/rpl_read_only.test
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/suite/rpl/t/rpl_read_only.test')
-rw-r--r--mysql-test/suite/rpl/t/rpl_read_only.test157
1 files changed, 157 insertions, 0 deletions
diff --git a/mysql-test/suite/rpl/t/rpl_read_only.test b/mysql-test/suite/rpl/t/rpl_read_only.test
new file mode 100644
index 00000000..62a8fa61
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_read_only.test
@@ -0,0 +1,157 @@
+# Test case for BUG #11733
+-- source include/have_innodb.inc
+-- source include/master-slave.inc
+
+call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
+
+# Create a test and replicate it to slave
+connection master;
+create user test;
+grant all on test.* to test;
+sync_slave_with_master;
+
+# Setting the master readonly :
+# - the variable @@readonly is not replicated on the slave
+
+connect (master2,127.0.0.1,test,,test,$MASTER_MYPORT,);
+connect (slave2,127.0.0.1,test,,test,$SLAVE_MYPORT,);
+
+connection master1;
+
+create table t1(a int) engine=InnoDB;
+create table t2(a int) engine=MyISAM;
+insert into t1 values(1001);
+insert into t2 values(2001);
+
+connection master;
+set global read_only=1;
+
+connection master1;
+select @@read_only;
+select * from t1;
+select * from t2;
+
+sync_slave_with_master;
+select @@read_only;
+select * from t1;
+select * from t2;
+
+# - replication of transactions
+connection master;
+set global read_only=0;
+
+connection master1;
+BEGIN;
+
+connection master2;
+BEGIN;
+
+connection master;
+select @@read_only;
+set global read_only=1;
+
+connection master1;
+-- echo *** On SUPER USER connection ***
+insert into t1 values(1002);
+--disable_warnings
+insert into t2 values(2002);
+--enable_warnings
+
+connection master2;
+-- echo *** On regular USER connection ***
+--error ER_OPTION_PREVENTS_STATEMENT
+insert into t1 values(1003);
+--error ER_OPTION_PREVENTS_STATEMENT
+insert into t2 values(2003);
+
+connection master1;
+## works even with read_only=1, because master1 is root
+-- echo *** SUPER USER COMMIT (must succeed) ***
+COMMIT;
+
+connection master2;
+-- echo *** regular USER COMMIT (must succeed - nothing to commit) ***
+COMMIT;
+
+connection master;
+select @@read_only;
+set global read_only=0;
+
+connection master1;
+insert into t1 values(1004);
+insert into t2 values(2004);
+
+select * from t1;
+select * from t2;
+
+sync_slave_with_master;
+select * from t1;
+select * from t2;
+
+# Setting the slave readonly : replication will pass
+#
+connection slave1;
+set global read_only=1;
+
+connection slave;
+select @@read_only;
+# Make sure the replicated table is also transactional
+show create table t1;
+# Make sure the replicated table is not transactional
+show create table t2;
+
+connection master;
+insert into t1 values(1005);
+insert into t2 values(2005);
+select * from t1;
+select * from t2;
+
+sync_slave_with_master;
+connection slave;
+select * from t1;
+select * from t2;
+
+# Non root user can not write on the slave
+connection slave2;
+--error ER_OPTION_PREVENTS_STATEMENT
+insert into t1 values(1006);
+--error ER_OPTION_PREVENTS_STATEMENT
+insert into t2 values(2006);
+
+
+--echo #
+--echo # MDEV-30978: On slave XA COMMIT/XA ROLLBACK fail to return an error in read-only mode
+--echo #
+--echo # Where a read-only server permits writes through replication, it
+--echo # should not permit user connections to commit/rollback XA transactions
+--echo # prepared via replication. This test ensure this behavior is prohibited
+--echo #
+
+# Note: slave's read_only=1 is set prior to this test case
+
+connection master;
+xa start '1';
+insert into t1 values (1007);
+xa end '1';
+xa prepare '1';
+sync_slave_with_master;
+
+connection slave2;
+--error ER_OPTION_PREVENTS_STATEMENT
+xa commit '1';
+--error ER_OPTION_PREVENTS_STATEMENT
+xa rollback '1';
+
+connection master;
+xa rollback '1';
+
+## Cleanup
+connection master;
+drop user test;
+drop table t1;
+drop table t2;
+sync_slave_with_master;
+set global read_only=0;
+
+
+--source include/rpl_end.inc