mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
d6e3d89c80
SUPER privilege used to allow various actions that were alternatively allowed by one of BINLOG ADMIN, BINLOG MONITOR, BINLOG REPLAY, CONNECTION ADMIN, FEDERATED ADMIN, REPL MASTER ADMIN, REPL SLAVE ADMIN, SET USER, SLAVE MONITOR. Now SUPER no longer does that, one has to grant one of the fine-grained privileges above to be to perform corresponding actions. On upgrade from MariaDB versions 10.11 and below all the privileges above are granted automatically if the user has SUPER. As a side-effect, such an upgrade will allow SUPER-user to run SHOW BINLOG EVENTS, SHOW RELAYLOG EVENTS, SHOW SLAVE HOSTS, even if he wasn't able to do it before the upgrade.
317 lines
8.6 KiB
Text
317 lines
8.6 KiB
Text
include/master-slave.inc
|
|
[connection master]
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
CHANGE MASTER TO MASTER_USE_GTID=NO;
|
|
include/start_slave.inc
|
|
connection master;
|
|
connection slave;
|
|
CREATE USER 'nonsuperuser'@'127.0.0.1';
|
|
GRANT ALTER,CREATE,DELETE,DROP,EVENT,INSERT,PROCESS,REPLICATION SLAVE,
|
|
SELECT,UPDATE ON *.* TO 'nonsuperuser'@'127.0.0.1';
|
|
connect nonpriv, 127.0.0.1, nonsuperuser,, test, $SLAVE_MYPORT,;
|
|
connection nonpriv;
|
|
SET GLOBAL replicate_events_marked_for_skip=FILTER_ON_MASTER;
|
|
ERROR 42000: Access denied; you need (at least one of) the REPLICATION SLAVE ADMIN privilege(s) for this operation
|
|
disconnect nonpriv;
|
|
connection slave;
|
|
DROP USER'nonsuperuser'@'127.0.0.1';
|
|
SELECT @@global.replicate_events_marked_for_skip;
|
|
@@global.replicate_events_marked_for_skip
|
|
REPLICATE
|
|
SET GLOBAL replicate_events_marked_for_skip=FILTER_ON_SLAVE;
|
|
ERROR HY000: This operation cannot be performed as you have a running slave ''; run STOP SLAVE '' first
|
|
SELECT @@global.replicate_events_marked_for_skip;
|
|
@@global.replicate_events_marked_for_skip
|
|
REPLICATE
|
|
STOP SLAVE;
|
|
SET SESSION replicate_events_marked_for_skip=FILTER_ON_MASTER;
|
|
ERROR HY000: Variable 'replicate_events_marked_for_skip' is a GLOBAL variable and should be set with SET GLOBAL
|
|
SELECT @@global.replicate_events_marked_for_skip;
|
|
@@global.replicate_events_marked_for_skip
|
|
REPLICATE
|
|
SET GLOBAL replicate_events_marked_for_skip=FILTER_ON_MASTER;
|
|
SELECT @@global.replicate_events_marked_for_skip;
|
|
@@global.replicate_events_marked_for_skip
|
|
FILTER_ON_MASTER
|
|
START SLAVE;
|
|
connection master;
|
|
SELECT @@skip_replication;
|
|
@@skip_replication
|
|
0
|
|
SET GLOBAL skip_replication=1;
|
|
ERROR HY000: Variable 'skip_replication' is a SESSION variable and can't be used with SET GLOBAL
|
|
SELECT @@skip_replication;
|
|
@@skip_replication
|
|
0
|
|
CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=myisam;
|
|
CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=innodb;
|
|
INSERT INTO t1(a) VALUES (1);
|
|
INSERT INTO t2(a) VALUES (1);
|
|
SET skip_replication=1;
|
|
CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=myisam;
|
|
INSERT INTO t1(a) VALUES (2);
|
|
INSERT INTO t2(a) VALUES (2);
|
|
FLUSH NO_WRITE_TO_BINLOG LOGS;
|
|
connection slave;
|
|
connection slave;
|
|
SHOW TABLES;
|
|
Tables_in_test
|
|
t1
|
|
t2
|
|
SELECT * FROM t1;
|
|
a b
|
|
1 NULL
|
|
SELECT * FROM t2;
|
|
a b
|
|
1 NULL
|
|
connection master;
|
|
DROP TABLE t3;
|
|
FLUSH NO_WRITE_TO_BINLOG LOGS;
|
|
connection slave;
|
|
connection slave;
|
|
STOP SLAVE;
|
|
SET GLOBAL replicate_events_marked_for_skip=FILTER_ON_SLAVE;
|
|
START SLAVE;
|
|
connection master;
|
|
SET skip_replication=1;
|
|
CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=myisam;
|
|
INSERT INTO t1(a) VALUES (3);
|
|
INSERT INTO t2(a) VALUES (3);
|
|
FLUSH NO_WRITE_TO_BINLOG LOGS;
|
|
connection slave;
|
|
connection slave;
|
|
SHOW TABLES;
|
|
Tables_in_test
|
|
t1
|
|
t2
|
|
SELECT * FROM t1;
|
|
a b
|
|
1 NULL
|
|
SELECT * FROM t2;
|
|
a b
|
|
1 NULL
|
|
connection master;
|
|
DROP TABLE t3;
|
|
FLUSH NO_WRITE_TO_BINLOG LOGS;
|
|
connection slave;
|
|
connection slave;
|
|
STOP SLAVE;
|
|
SET GLOBAL replicate_events_marked_for_skip=REPLICATE;
|
|
START SLAVE;
|
|
connection master;
|
|
SET skip_replication=1;
|
|
CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=myisam;
|
|
INSERT INTO t3(a) VALUES(2);
|
|
connection slave;
|
|
connection slave;
|
|
SELECT * FROM t3;
|
|
a b
|
|
2 NULL
|
|
connection master;
|
|
DROP TABLE t3;
|
|
TRUNCATE t1;
|
|
connection slave;
|
|
connection slave;
|
|
RESET MASTER;
|
|
connection master;
|
|
SET skip_replication=0;
|
|
INSERT INTO t1 VALUES (1,0);
|
|
SET skip_replication=1;
|
|
INSERT INTO t1 VALUES (2,0);
|
|
SET skip_replication=0;
|
|
INSERT INTO t1 VALUES (3,0);
|
|
connection slave;
|
|
connection slave;
|
|
SELECT * FROM t1 ORDER by a;
|
|
a b
|
|
1 0
|
|
2 0
|
|
3 0
|
|
STOP SLAVE;
|
|
SET GLOBAL replicate_events_marked_for_skip=FILTER_ON_MASTER;
|
|
connection master;
|
|
TRUNCATE t1;
|
|
SELECT * FROM t1 ORDER by a;
|
|
a b
|
|
1 0
|
|
2 0
|
|
3 0
|
|
connection slave;
|
|
START SLAVE;
|
|
connection master;
|
|
connection slave;
|
|
connection slave;
|
|
SELECT * FROM t1 ORDER by a;
|
|
a b
|
|
1 0
|
|
3 0
|
|
connection master;
|
|
TRUNCATE t1;
|
|
connection slave;
|
|
connection slave;
|
|
STOP SLAVE;
|
|
SET GLOBAL sql_slave_skip_counter=6;
|
|
SET GLOBAL replicate_events_marked_for_skip=FILTER_ON_SLAVE;
|
|
START SLAVE;
|
|
connection master;
|
|
SET @old_binlog_format= @@binlog_format;
|
|
SET binlog_format= statement;
|
|
SET skip_replication=0;
|
|
INSERT INTO t1 VALUES (1,5);
|
|
SET skip_replication=1;
|
|
INSERT INTO t1 VALUES (2,5);
|
|
SET skip_replication=0;
|
|
INSERT INTO t1 VALUES (3,5);
|
|
INSERT INTO t1 VALUES (4,5);
|
|
SET binlog_format= @old_binlog_format;
|
|
connection slave;
|
|
connection slave;
|
|
SELECT * FROM t1;
|
|
a b
|
|
4 5
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
SET @old_slave_binlog_format= @@global.binlog_format;
|
|
SET GLOBAL binlog_format= row;
|
|
include/start_slave.inc
|
|
connection master;
|
|
TRUNCATE t1;
|
|
SET @old_binlog_format= @@binlog_format;
|
|
SET binlog_format= row;
|
|
BINLOG 'wlZOTw8BAAAA8QAAAPUAAAAAAAQANS41LjIxLU1hcmlhREItZGVidWctbG9nAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAA371saA==';
|
|
BINLOG 'wlZOTxMBAAAAKgAAAGMBAAAAgCkAAAAAAAEABHRlc3QAAnQxAAIDAwAC
|
|
wlZOTxcBAAAAJgAAAIkBAAAAgCkAAAAAAAEAAv/8AQAAAAgAAAA=';
|
|
BINLOG 'wlZOTxMBAAAAKgAAADwCAAAAACkAAAAAAAEABHRlc3QAAnQxAAIDAwAC
|
|
wlZOTxcBAAAAJgAAAGICAAAAACkAAAAAAAEAAv/8AgAAAAgAAAA=';
|
|
SET binlog_format= @old_binlog_format;
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a b
|
|
1 8
|
|
2 8
|
|
connection slave;
|
|
connection slave;
|
|
SELECT * FROM t1 ORDER by a;
|
|
a b
|
|
2 8
|
|
include/stop_slave.inc
|
|
SET GLOBAL binlog_format= @old_slave_binlog_format;
|
|
include/start_slave.inc
|
|
connection master;
|
|
SET skip_replication=0;
|
|
BEGIN;
|
|
SET skip_replication=0;
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a transaction
|
|
SET skip_replication=1;
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a transaction
|
|
ROLLBACK;
|
|
SET skip_replication=1;
|
|
BEGIN;
|
|
SET skip_replication=0;
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a transaction
|
|
SET skip_replication=1;
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a transaction
|
|
COMMIT;
|
|
SET autocommit=0;
|
|
INSERT INTO t2(a) VALUES(100);
|
|
SET skip_replication=1;
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a transaction
|
|
ROLLBACK;
|
|
SET autocommit=1;
|
|
SET skip_replication=1;
|
|
CREATE FUNCTION foo (x INT) RETURNS INT BEGIN SET SESSION skip_replication=x; RETURN x; END|
|
|
CREATE PROCEDURE bar(x INT) BEGIN SET SESSION skip_replication=x; END|
|
|
CREATE FUNCTION baz (x INT) RETURNS INT BEGIN CALL bar(x); RETURN x; END|
|
|
SELECT foo(0);
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a stored function or trigger
|
|
SELECT baz(0);
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a stored function or trigger
|
|
SET @a= foo(1);
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a stored function or trigger
|
|
SET @a= baz(1);
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a stored function or trigger
|
|
UPDATE t2 SET b=foo(0);
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a stored function or trigger
|
|
UPDATE t2 SET b=baz(0);
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a stored function or trigger
|
|
INSERT INTO t1 VALUES (101, foo(1));
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a stored function or trigger
|
|
INSERT INTO t1 VALUES (101, baz(0));
|
|
ERROR HY000: Cannot modify @@session.skip_replication inside a stored function or trigger
|
|
SELECT @@skip_replication;
|
|
@@skip_replication
|
|
1
|
|
CALL bar(0);
|
|
SELECT @@skip_replication;
|
|
@@skip_replication
|
|
0
|
|
CALL bar(1);
|
|
SELECT @@skip_replication;
|
|
@@skip_replication
|
|
1
|
|
DROP FUNCTION foo;
|
|
DROP PROCEDURE bar;
|
|
DROP FUNCTION baz;
|
|
connection master;
|
|
SET skip_replication= 0;
|
|
TRUNCATE t1;
|
|
connection slave;
|
|
connection slave;
|
|
STOP SLAVE;
|
|
SET GLOBAL replicate_events_marked_for_skip=FILTER_ON_MASTER;
|
|
START SLAVE IO_THREAD;
|
|
connection master;
|
|
SET skip_replication= 1;
|
|
INSERT INTO t1(a) VALUES (1);
|
|
SET skip_replication= 0;
|
|
INSERT INTO t1(a) VALUES (2);
|
|
include/save_master_pos.inc
|
|
connection slave;
|
|
include/sync_io_with_master.inc
|
|
STOP SLAVE IO_THREAD;
|
|
SET GLOBAL replicate_events_marked_for_skip=REPLICATE;
|
|
START SLAVE;
|
|
connection master;
|
|
connection slave;
|
|
connection slave;
|
|
SELECT * FROM t1;
|
|
a b
|
|
2 NULL
|
|
connection master;
|
|
SET skip_replication= 0;
|
|
TRUNCATE t1;
|
|
connection slave;
|
|
connection slave;
|
|
STOP SLAVE;
|
|
SET GLOBAL replicate_events_marked_for_skip=FILTER_ON_SLAVE;
|
|
START SLAVE IO_THREAD;
|
|
connection master;
|
|
SET skip_replication= 1;
|
|
INSERT INTO t1(a) VALUES (1);
|
|
SET skip_replication= 0;
|
|
INSERT INTO t1(a) VALUES (2);
|
|
include/save_master_pos.inc
|
|
connection slave;
|
|
include/sync_io_with_master.inc
|
|
STOP SLAVE IO_THREAD;
|
|
SET GLOBAL replicate_events_marked_for_skip=REPLICATE;
|
|
START SLAVE;
|
|
connection master;
|
|
connection slave;
|
|
connection slave;
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a b
|
|
1 NULL
|
|
2 NULL
|
|
connection master;
|
|
SET skip_replication=0;
|
|
DROP TABLE t1,t2;
|
|
connection slave;
|
|
STOP SLAVE;
|
|
SET GLOBAL replicate_events_marked_for_skip=REPLICATE;
|
|
START SLAVE;
|
|
include/rpl_end.inc
|