mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
WL#3602
Post review changes the --read-only option is not enforced for the slave thread in replication, or for the SUPER user.
This commit is contained in:
113
mysql-test/r/rpl_read_only.result
Normal file
113
mysql-test/r/rpl_read_only.result
Normal file
@@ -0,0 +1,113 @@
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
create table t1(a int) engine=InnoDB;
|
||||
create table t2(a int) engine=MyISAM;
|
||||
insert into t1 values(1001);
|
||||
insert into t2 values(2001);
|
||||
set global read_only=1;
|
||||
select @@read_only;
|
||||
@@read_only
|
||||
1
|
||||
select * from t1;
|
||||
a
|
||||
1001
|
||||
select * from t2;
|
||||
a
|
||||
2001
|
||||
select @@read_only;
|
||||
@@read_only
|
||||
0
|
||||
select * from t1;
|
||||
a
|
||||
1001
|
||||
select * from t2;
|
||||
a
|
||||
2001
|
||||
set global read_only=0;
|
||||
BEGIN;
|
||||
insert into t1 values(1002);
|
||||
insert into t2 values(2002);
|
||||
BEGIN;
|
||||
insert into t1 values(1003);
|
||||
insert into t2 values(2003);
|
||||
set global read_only=1;
|
||||
COMMIT;
|
||||
COMMIT;
|
||||
ERROR HY000: The MySQL server is running with the --read-only option so it cannot execute this statement
|
||||
set global read_only=0;
|
||||
insert into t1 values(1004);
|
||||
insert into t2 values(2004);
|
||||
select * from t1;
|
||||
a
|
||||
1001
|
||||
1002
|
||||
1004
|
||||
select * from t2;
|
||||
a
|
||||
2001
|
||||
2002
|
||||
2003
|
||||
2004
|
||||
select * from t1;
|
||||
a
|
||||
1001
|
||||
1002
|
||||
1004
|
||||
select * from t2;
|
||||
a
|
||||
2001
|
||||
2002
|
||||
2003
|
||||
2004
|
||||
set global read_only=1;
|
||||
select @@read_only;
|
||||
@@read_only
|
||||
1
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`a` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
insert into t1 values(1005);
|
||||
insert into t2 values(2005);
|
||||
select * from t1;
|
||||
a
|
||||
1001
|
||||
1002
|
||||
1004
|
||||
1005
|
||||
select * from t2;
|
||||
a
|
||||
2001
|
||||
2002
|
||||
2003
|
||||
2004
|
||||
2005
|
||||
select * from t1;
|
||||
a
|
||||
1001
|
||||
1002
|
||||
1004
|
||||
1005
|
||||
select * from t2;
|
||||
a
|
||||
2001
|
||||
2002
|
||||
2003
|
||||
2004
|
||||
2005
|
||||
insert into t1 values(1006);
|
||||
ERROR HY000: The MySQL server is running with the --read-only option so it cannot execute this statement
|
||||
insert into t2 values(2006);
|
||||
ERROR HY000: The MySQL server is running with the --read-only option so it cannot execute this statement
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
1
mysql-test/t/rpl_read_only-slave.opt
Normal file
1
mysql-test/t/rpl_read_only-slave.opt
Normal file
@@ -0,0 +1 @@
|
||||
--innodb
|
||||
105
mysql-test/t/rpl_read_only.test
Normal file
105
mysql-test/t/rpl_read_only.test
Normal file
@@ -0,0 +1,105 @@
|
||||
# Test case for BUG #11733
|
||||
-- source include/master-slave.inc
|
||||
-- source include/have_innodb.inc
|
||||
|
||||
# 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;
|
||||
insert into t1 values(1002);
|
||||
insert into t2 values(2002);
|
||||
|
||||
connection master2;
|
||||
BEGIN;
|
||||
insert into t1 values(1003);
|
||||
insert into t2 values(2003);
|
||||
|
||||
connection master;
|
||||
set global read_only=1;
|
||||
|
||||
connection master1;
|
||||
## works even with read_only=1, because master1 is root
|
||||
COMMIT;
|
||||
|
||||
connection master2;
|
||||
--error ER_OPTION_PREVENTS_STATEMENT
|
||||
COMMIT;
|
||||
|
||||
connection master;
|
||||
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);
|
||||
|
||||
## Cleanup
|
||||
connection master;
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
sync_slave_with_master;
|
||||
|
||||
@@ -693,7 +693,11 @@ int ha_commit_trans(THD *thd, bool all)
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
if (is_real_trans && opt_readonly)
|
||||
if ( is_real_trans
|
||||
&& opt_readonly
|
||||
&& ! (thd->security_ctx->master_access & SUPER_ACL)
|
||||
&& ! thd->slave_thread
|
||||
)
|
||||
{
|
||||
my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only");
|
||||
ha_rollback_trans(thd, all);
|
||||
|
||||
@@ -151,7 +151,11 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count,
|
||||
}
|
||||
}
|
||||
|
||||
if (write_lock_used && opt_readonly)
|
||||
if ( write_lock_used
|
||||
&& opt_readonly
|
||||
&& ! (thd->security_ctx->master_access & SUPER_ACL)
|
||||
&& ! thd->slave_thread
|
||||
)
|
||||
{
|
||||
/*
|
||||
Someone has issued SET GLOBAL READ_ONLY=1 and we want a write lock.
|
||||
|
||||
Reference in New Issue
Block a user