Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
b1a13cb1
Commit
b1a13cb1
authored
Aug 12, 2011
by
unknown
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MWL#234: After-review fixes, including better names for the new system variables.
parent
c4d69f17
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
178 additions
and
160 deletions
+178
-160
client/mysqlbinlog.cc
client/mysqlbinlog.cc
+11
-16
mysql-test/suite/rpl/r/rpl_skip_replication.result
mysql-test/suite/rpl/r/rpl_skip_replication.result
+32
-32
mysql-test/suite/rpl/t/rpl_skip_replication.test
mysql-test/suite/rpl/t/rpl_skip_replication.test
+43
-43
sql/log_event.cc
sql/log_event.cc
+7
-7
sql/log_event.h
sql/log_event.h
+11
-11
sql/mysql_priv.h
sql/mysql_priv.h
+2
-2
sql/mysqld.cc
sql/mysqld.cc
+9
-8
sql/set_var.cc
sql/set_var.cc
+22
-12
sql/set_var.h
sql/set_var.h
+6
-6
sql/slave.cc
sql/slave.cc
+21
-13
sql/sql_binlog.cc
sql/sql_binlog.cc
+7
-7
sql/sql_repl.cc
sql/sql_repl.cc
+7
-3
No files found.
client/mysqlbinlog.cc
View file @
b1a13cb1
...
...
@@ -671,7 +671,7 @@ print_use_stmt(PRINT_EVENT_INFO* pinfo, const Query_log_event *ev)
/**
Print "SET
do_not_replicate
=..." statement when needed.
Print "SET
skip_replication
=..." statement when needed.
Not all servers support this (only MariaDB from some version on). So we
mark the SET to only execute from the version of MariaDB that supports it,
...
...
@@ -679,20 +679,20 @@ print_use_stmt(PRINT_EVENT_INFO* pinfo, const Query_log_event *ev)
get spurious errors on MySQL@Oracle servers of higher version that do not
support the flag.
So we start out assuming @@
do_not_replicate
is 0, and only output a SET
So we start out assuming @@
skip_replication
is 0, and only output a SET
statement when it changes.
*/
static
void
print_
do_not_replicate
_statement
(
PRINT_EVENT_INFO
*
pinfo
,
const
Log_event
*
ev
)
print_
skip_replication
_statement
(
PRINT_EVENT_INFO
*
pinfo
,
const
Log_event
*
ev
)
{
int
cur_val
;
cur_val
=
(
ev
->
flags
&
LOG_EVENT_
DO_NOT_REPLICATE
_F
)
!=
0
;
if
(
cur_val
==
pinfo
->
do_not_replicate
)
cur_val
=
(
ev
->
flags
&
LOG_EVENT_
SKIP_REPLICATION
_F
)
!=
0
;
if
(
cur_val
==
pinfo
->
skip_replication
)
return
;
/* Not changed. */
fprintf
(
result_file
,
"/*!50400 SET
do_not_replicate
=%d*/%s
\n
"
,
fprintf
(
result_file
,
"/*!50400 SET
skip_replication
=%d*/%s
\n
"
,
cur_val
,
pinfo
->
delimiter
);
pinfo
->
do_not_replicate
=
cur_val
;
pinfo
->
skip_replication
=
cur_val
;
}
/**
...
...
@@ -828,7 +828,7 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev,
}
else
{
print_
do_not_replicate
_statement
(
print_event_info
,
ev
);
print_
skip_replication
_statement
(
print_event_info
,
ev
);
ev
->
print
(
result_file
,
print_event_info
);
}
break
;
...
...
@@ -861,7 +861,7 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev,
}
else
{
print_
do_not_replicate
_statement
(
print_event_info
,
ev
);
print_
skip_replication
_statement
(
print_event_info
,
ev
);
ce
->
print
(
result_file
,
print_event_info
,
TRUE
);
}
...
...
@@ -958,10 +958,10 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev,
if
(
!
shall_skip_database
(
exlq
->
db
))
{
print_use_stmt
(
print_event_info
,
exlq
);
print_do_not_replicate_statement
(
print_event_info
,
ev
);
if
(
fname
)
{
convert_path_to_forward_slashes
(
fname
);
print_skip_replication_statement
(
print_event_info
,
ev
);
exlq
->
print
(
result_file
,
print_event_info
,
fname
);
}
else
...
...
@@ -1062,13 +1062,8 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev,
}
/* FALL THROUGH */
}
case
INTVAR_EVENT
:
case
RAND_EVENT
:
case
USER_VAR_EVENT
:
case
XID_EVENT
:
print_do_not_replicate_statement
(
print_event_info
,
ev
);
/* Fall through ... */
default:
print_skip_replication_statement
(
print_event_info
,
ev
);
ev
->
print
(
result_file
,
print_event_info
);
}
}
...
...
mysql-test/suite/rpl/r/rpl_
do_not_replicate
.result
→
mysql-test/suite/rpl/r/rpl_
skip_replication
.result
View file @
b1a13cb1
...
...
@@ -3,20 +3,20 @@ include/master-slave.inc
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';
SET GLOBAL replicate_
ignore_do_not_replicate=1
;
SET GLOBAL replicate_
events_marked_for_skip=0
;
ERROR 42000: Access denied; you need the SUPER privilege for this operation
DROP USER'nonsuperuser'@'127.0.0.1';
SET GLOBAL replicate_
ignore_do_not_replicate=1
;
SET GLOBAL replicate_
events_marked_for_skip=0
;
ERROR HY000: This operation cannot be performed with a running slave; run STOP SLAVE first
STOP SLAVE;
SET GLOBAL replicate_
ignore_do_not_replicate=1
;
SET GLOBAL replicate_
events_marked_for_skip=0
;
START SLAVE;
SET
do_not_replicate
=0;
SET
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
do_not_replicate
=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);
...
...
@@ -34,7 +34,7 @@ a b
DROP TABLE t3;
FLUSH NO_WRITE_TO_BINLOG LOGS;
STOP SLAVE;
SET GLOBAL replicate_
ignore_do_not_replicate=0
;
SET GLOBAL replicate_
events_marked_for_skip=1
;
START SLAVE;
CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=myisam;
INSERT INTO t3(a) VALUES(2);
...
...
@@ -44,11 +44,11 @@ a b
DROP TABLE t3;
TRUNCATE t1;
RESET MASTER;
SET
do_not_replicate
=0;
SET
skip_replication
=0;
INSERT INTO t1 VALUES (1,0);
SET
do_not_replicate
=1;
SET
skip_replication
=1;
INSERT INTO t1 VALUES (2,0);
SET
do_not_replicate
=0;
SET
skip_replication
=0;
INSERT INTO t1 VALUES (3,0);
SELECT * FROM t1 ORDER by a;
a b
...
...
@@ -56,7 +56,7 @@ a b
2 0
3 0
STOP SLAVE;
SET GLOBAL replicate_
ignore_do_not_replicate=1
;
SET GLOBAL replicate_
events_marked_for_skip=0
;
TRUNCATE t1;
SELECT * FROM t1 ORDER by a;
a b
...
...
@@ -71,15 +71,15 @@ a b
TRUNCATE t1;
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=2;
SET GLOBAL replicate_
ignore_do_not_replicate=1
;
SET GLOBAL replicate_
events_marked_for_skip=0
;
START SLAVE;
SET @old_binlog_format= @@binlog_format;
SET binlog_format= statement;
SET
do_not_replicate
=0;
SET
skip_replication
=0;
INSERT INTO t1 VALUES (1,5);
SET
do_not_replicate
=1;
SET
skip_replication
=1;
INSERT INTO t1 VALUES (2,5);
SET
do_not_replicate
=0;
SET
skip_replication
=0;
INSERT INTO t1 VALUES (3,5);
INSERT INTO t1 VALUES (4,5);
SET binlog_format= @old_binlog_format;
...
...
@@ -100,29 +100,29 @@ a b
SELECT * FROM t1 ORDER by a;
a b
2 8
SET
do_not_replicate
=0;
SET
skip_replication
=0;
BEGIN;
SET
do_not_replicate
=0;
SET
skip_replication
=0;
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
SET
do_not_replicate
=1;
SET
skip_replication
=1;
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
ROLLBACK;
SET
do_not_replicate
=1;
SET
skip_replication
=1;
BEGIN;
SET
do_not_replicate
=0;
SET
skip_replication
=0;
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
SET
do_not_replicate
=1;
SET
skip_replication
=1;
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
COMMIT;
SET autocommit=0;
INSERT INTO t2(a) VALUES(100);
SET
do_not_replicate
=1;
SET
skip_replication
=1;
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
ROLLBACK;
SET autocommit=1;
SET
do_not_replicate
=1;
CREATE FUNCTION foo (x INT) RETURNS INT BEGIN SET SESSION
do_not_replicate
=x; RETURN x; END|
CREATE PROCEDURE bar(x INT) BEGIN SET SESSION
do_not_replicate
=x; END|
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: Can't execute the given command because you have active locked tables or an active transaction
...
...
@@ -140,23 +140,23 @@ INSERT INTO t1 VALUES (101, foo(1));
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
INSERT INTO t1 VALUES (101, baz(0));
ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction
SELECT @@
do_not_replicate
;
@@
do_not_replicate
SELECT @@
skip_replication
;
@@
skip_replication
1
CALL bar(0);
SELECT @@
do_not_replicate
;
@@
do_not_replicate
SELECT @@
skip_replication
;
@@
skip_replication
0
CALL bar(1);
SELECT @@
do_not_replicate
;
@@
do_not_replicate
SELECT @@
skip_replication
;
@@
skip_replication
1
DROP FUNCTION foo;
DROP PROCEDURE bar;
DROP FUNCTION baz;
SET
do_not_replicate
=0;
SET
skip_replication
=0;
DROP TABLE t1,t2;
STOP SLAVE;
SET GLOBAL replicate_
ignore_do_not_replicate=0
;
SET GLOBAL replicate_
events_marked_for_skip=1
;
START SLAVE;
include/rpl_end.inc
mysql-test/suite/rpl/t/rpl_
do_not_replicate
.test
→
mysql-test/suite/rpl/t/rpl_
skip_replication
.test
View file @
b1a13cb1
...
...
@@ -2,33 +2,33 @@
--
source
include
/
have_innodb
.
inc
connection
slave
;
# Test that SUPER is required to change @@replicate_
ignore_do_not_replicate
.
# Test that SUPER is required to change @@replicate_
events_marked_for_skip
.
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
;
--
error
ER_SPECIFIC_ACCESS_DENIED_ERROR
SET
GLOBAL
replicate_
ignore_do_not_replicate
=
1
;
SET
GLOBAL
replicate_
events_marked_for_skip
=
0
;
disconnect
nonpriv
;
connection
slave
;
DROP
USER
'nonsuperuser'
@
'127.0.0.1'
;
--
error
ER_SLAVE_MUST_STOP
SET
GLOBAL
replicate_
ignore_do_not_replicate
=
1
;
SET
GLOBAL
replicate_
events_marked_for_skip
=
0
;
STOP
SLAVE
;
SET
GLOBAL
replicate_
ignore_do_not_replicate
=
1
;
SET
GLOBAL
replicate_
events_marked_for_skip
=
0
;
START
SLAVE
;
connection
master
;
SET
do_not_replicate
=
0
;
SET
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
do_not_replicate
=
1
;
SET
skip_replication
=
1
;
CREATE
TABLE
t3
(
a
INT
PRIMARY
KEY
,
b
INT
)
ENGINE
=
myisam
;
INSERT
INTO
t1
(
a
)
VALUES
(
2
);
...
...
@@ -52,7 +52,7 @@ FLUSH NO_WRITE_TO_BINLOG LOGS;
sync_slave_with_master
;
connection
slave
;
STOP
SLAVE
;
SET
GLOBAL
replicate_
ignore_do_not_replicate
=
0
;
SET
GLOBAL
replicate_
events_marked_for_skip
=
1
;
START
SLAVE
;
connection
master
;
...
...
@@ -65,7 +65,7 @@ connection master;
DROP
TABLE
t3
;
#
# Test that the slave will preserve the @@
do_not_replicate
flag in its
# Test that the slave will preserve the @@
skip_replication
flag in its
# own binlog.
#
...
...
@@ -75,36 +75,36 @@ connection slave;
RESET
MASTER
;
connection
master
;
SET
do_not_replicate
=
0
;
SET
skip_replication
=
0
;
INSERT
INTO
t1
VALUES
(
1
,
0
);
SET
do_not_replicate
=
1
;
SET
skip_replication
=
1
;
INSERT
INTO
t1
VALUES
(
2
,
0
);
SET
do_not_replicate
=
0
;
SET
skip_replication
=
0
;
INSERT
INTO
t1
VALUES
(
3
,
0
);
sync_slave_with_master
;
connection
slave
;
# Since slave has @@replicate_
ignore_do_not_replicate=0
, it should have
# Since slave has @@replicate_
events_marked_for_skip=1
, it should have
# applied all events.
SELECT
*
FROM
t1
ORDER
by
a
;
STOP
SLAVE
;
SET
GLOBAL
replicate_
ignore_do_not_replicate
=
1
;
SET
GLOBAL
replicate_
events_marked_for_skip
=
0
;
let
$SLAVE_DATADIR
=
`select @@datadir`
;
connection
master
;
TRUNCATE
t1
;
# Now apply the slave binlog to the master, to check that both the slave
# and mysqlbinlog will preserve the @@
do_not_replicate
flag.
--
exec
$MYSQL_BINLOG
$SLAVE_DATADIR
/
slave
-
bin
.
000001
>
$MYSQLTEST_VARDIR
/
tmp
/
rpl_
do_not_replicate
.
binlog
--
exec
$MYSQL
test
<
$MYSQLTEST_VARDIR
/
tmp
/
rpl_
do_not_replicate
.
binlog
# and mysqlbinlog will preserve the @@
skip_replication
flag.
--
exec
$MYSQL_BINLOG
$SLAVE_DATADIR
/
slave
-
bin
.
000001
>
$MYSQLTEST_VARDIR
/
tmp
/
rpl_
skip_replication
.
binlog
--
exec
$MYSQL
test
<
$MYSQLTEST_VARDIR
/
tmp
/
rpl_
skip_replication
.
binlog
# The master should have all three events.
SELECT
*
FROM
t1
ORDER
by
a
;
# The slave should be missing event 2, which is marked with the
# @@
do_not_replicate
flag.
# @@
skip_replication
flag.
connection
slave
;
START
SLAVE
;
...
...
@@ -116,7 +116,7 @@ connection slave;
SELECT
*
FROM
t1
ORDER
by
a
;
#
# Test that @@sql_slave_skip_counter does not count skipped @@
do_not_replicate
# Test that @@sql_slave_skip_counter does not count skipped @@
skip_replication
# events.
#
...
...
@@ -127,18 +127,18 @@ sync_slave_with_master;
connection
slave
;
STOP
SLAVE
;
SET
GLOBAL
sql_slave_skip_counter
=
2
;
SET
GLOBAL
replicate_
ignore_do_not_replicate
=
1
;
SET
GLOBAL
replicate_
events_marked_for_skip
=
0
;
START
SLAVE
;
connection
master
;
# Need to fix @@binlog_format to get consistent event count.
SET
@
old_binlog_format
=
@@
binlog_format
;
SET
binlog_format
=
statement
;
SET
do_not_replicate
=
0
;
SET
skip_replication
=
0
;
INSERT
INTO
t1
VALUES
(
1
,
5
);
SET
do_not_replicate
=
1
;
SET
skip_replication
=
1
;
INSERT
INTO
t1
VALUES
(
2
,
5
);
SET
do_not_replicate
=
0
;
SET
skip_replication
=
0
;
INSERT
INTO
t1
VALUES
(
3
,
5
);
INSERT
INTO
t1
VALUES
(
4
,
5
);
SET
binlog_format
=
@
old_binlog_format
;
...
...
@@ -148,12 +148,12 @@ connection slave;
# The slave should have skipped the first three inserts (number 1 and 3 due
# to @@sql_slave_skip_counter=2, number 2 due to
# @@replicate_
ignore_do_not_replicate=1
). So only number 4 should be left.
# @@replicate_
events_marked_for_skip=0
). So only number 4 should be left.
SELECT
*
FROM
t1
;
#
# Check that BINLOG statement preserves the @@
do_not_replicate
flag.
# Check that BINLOG statement preserves the @@
skip_replication
flag.
#
connection
master
;
TRUNCATE
t1
;
...
...
@@ -161,10 +161,10 @@ TRUNCATE t1;
# Format description log event.
BINLOG
'66I6Tg8BAAAAZgAAAGoAAAABAAQANS40LjAtTWFyaWFEQi12YWxncmluZC1tYXgtZGVidWctbG9n
AAAAAAAAAAAAAAAAAADrojpOEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC'
;
# INSERT INTO t1 VALUES (1,8) # with @@
do_not_replicate
=1
# INSERT INTO t1 VALUES (1,8) # with @@
skip_replication
=1
BINLOG
'HaM6ThMBAAAAKgAAANgAAAAAgA8AAAAAAAEABHRlc3QAAnQxAAIDAwAC
HaM6ThcBAAAAJgAAAP4AAAAAgA8AAAAAAAEAAv/8AQAAAAgAAAA='
;
# INSERT INTO t1 VALUES (2,8) # with @@
do_not_replicate
=0
# INSERT INTO t1 VALUES (2,8) # with @@
skip_replication
=0
BINLOG
'JqM6ThMBAAAAKgAAALEBAAAAAA8AAAAAAAEABHRlc3QAAnQxAAIDAwAC
JqM6ThcBAAAAJgAAANcBAAAAAA8AAAAAAAEAAv/8AgAAAAgAAAA='
;
...
...
@@ -172,40 +172,40 @@ SELECT * FROM t1 ORDER BY a;
sync_slave_with_master
;
connection
slave
;
# Slave should have only the second insert, the first should be ignored due to
# the @@
do_not_replicate
flag.
# the @@
skip_replication
flag.
SELECT
*
FROM
t1
ORDER
by
a
;
# Test that it is not possible to d change @@
do_not_replicate
inside a
# Test that it is not possible to d change @@
skip_replication
inside a
# transaction or statement, thereby replicating only parts of statements
# or transactions.
connection
master
;
SET
do_not_replicate
=
0
;
SET
skip_replication
=
0
;
BEGIN
;
--
error
ER_LOCK_OR_ACTIVE_TRANSACTION
SET
do_not_replicate
=
0
;
SET
skip_replication
=
0
;
--
error
ER_LOCK_OR_ACTIVE_TRANSACTION
SET
do_not_replicate
=
1
;
SET
skip_replication
=
1
;
ROLLBACK
;
SET
do_not_replicate
=
1
;
SET
skip_replication
=
1
;
BEGIN
;
--
error
ER_LOCK_OR_ACTIVE_TRANSACTION
SET
do_not_replicate
=
0
;
SET
skip_replication
=
0
;
--
error
ER_LOCK_OR_ACTIVE_TRANSACTION
SET
do_not_replicate
=
1
;
SET
skip_replication
=
1
;
COMMIT
;
SET
autocommit
=
0
;
INSERT
INTO
t2
(
a
)
VALUES
(
100
);
--
error
ER_LOCK_OR_ACTIVE_TRANSACTION
SET
do_not_replicate
=
1
;
SET
skip_replication
=
1
;
ROLLBACK
;
SET
autocommit
=
1
;
SET
do_not_replicate
=
1
;
SET
skip_replication
=
1
;
--
delimiter
|
CREATE
FUNCTION
foo
(
x
INT
)
RETURNS
INT
BEGIN
SET
SESSION
do_not_replicate
=
x
;
RETURN
x
;
END
|
CREATE
PROCEDURE
bar
(
x
INT
)
BEGIN
SET
SESSION
do_not_replicate
=
x
;
END
|
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
|
--
delimiter
;
--
error
ER_LOCK_OR_ACTIVE_TRANSACTION
...
...
@@ -224,22 +224,22 @@ UPDATE t2 SET b=baz(0);
INSERT
INTO
t1
VALUES
(
101
,
foo
(
1
));
--
error
ER_LOCK_OR_ACTIVE_TRANSACTION
INSERT
INTO
t1
VALUES
(
101
,
baz
(
0
));
SELECT
@@
do_not_replicate
;
SELECT
@@
skip_replication
;
CALL
bar
(
0
);
SELECT
@@
do_not_replicate
;
SELECT
@@
skip_replication
;
CALL
bar
(
1
);
SELECT
@@
do_not_replicate
;
SELECT
@@
skip_replication
;
DROP
FUNCTION
foo
;
DROP
PROCEDURE
bar
;
DROP
FUNCTION
baz
;
# Clean up.
connection
master
;
SET
do_not_replicate
=
0
;
SET
skip_replication
=
0
;
DROP
TABLE
t1
,
t2
;
connection
slave
;
STOP
SLAVE
;
SET
GLOBAL
replicate_
ignore_do_not_replicate
=
0
;
SET
GLOBAL
replicate_
events_marked_for_skip
=
1
;
START
SLAVE
;
--
source
include
/
rpl_end
.
inc
sql/log_event.cc
View file @
b1a13cb1
...
...
@@ -671,7 +671,7 @@ Log_event::Log_event(THD* thd_arg, uint16 flags_arg, bool using_trans)
when
=
thd
->
start_time
;
cache_stmt
=
using_trans
;
flags
=
flags_arg
|
(
thd
->
options
&
OPTION_
DO_NOT_REPLICATE
?
LOG_EVENT_DO_NOT_REPLICATE
_F
:
0
);
(
thd
->
options
&
OPTION_
SKIP_REPLICATION
?
LOG_EVENT_SKIP_REPLICATION
_F
:
0
);
}
...
...
@@ -828,8 +828,8 @@ Log_event::do_shall_skip(Relay_log_info *rli)
rli
->
slave_skip_counter
));
if
((
server_id
==
::
server_id
&&
!
rli
->
replicate_same_server_id
)
||
(
rli
->
slave_skip_counter
==
1
&&
rli
->
is_in_group
())
||
(
flags
&
LOG_EVENT_
DO_NOT_REPLICATE
_F
&&
opt_replicate_ignore_do_not_replicate
))
(
flags
&
LOG_EVENT_
SKIP_REPLICATION
_F
&&
!
opt_replicate_events_marked_for_skip
))
return
EVENT_SKIP_IGNORE
;
if
(
rli
->
slave_skip_counter
>
0
)
return
EVENT_SKIP_COUNT
;
...
...
@@ -3488,11 +3488,11 @@ Query_log_event::do_shall_skip(Relay_log_info *rli)
DBUG_ASSERT
(
query
&&
q_len
>
0
);
/*
An event skipped due to @@
do_not_replicate
must not be counted towards the
An event skipped due to @@
skip_replication
must not be counted towards the
number of events to be skipped due to @@sql_slave_skip_counter.
*/
if
(
flags
&
LOG_EVENT_
DO_NOT_REPLICATE
_F
&&
opt_replicate_ignore_do_not_replicate
)
if
(
flags
&
LOG_EVENT_
SKIP_REPLICATION
_F
&&
!
opt_replicate_events_marked_for_skip
)
DBUG_RETURN
(
Log_event
::
EVENT_SKIP_IGNORE
);
if
(
rli
->
slave_skip_counter
>
0
)
...
...
@@ -9792,7 +9792,7 @@ st_print_event_info::st_print_event_info()
auto_increment_increment
(
0
),
auto_increment_offset
(
0
),
charset_inited
(
0
),
lc_time_names_number
(
~
0
),
charset_database_number
(
ILLEGAL_CHARSET_INFO_NUMBER
),
thread_id
(
0
),
thread_id_printed
(
false
),
do_not_replicate
(
0
),
thread_id
(
0
),
thread_id_printed
(
false
),
skip_replication
(
0
),
base64_output_mode
(
BASE64_OUTPUT_UNSPEC
),
printed_fd_event
(
FALSE
)
{
/*
...
...
sql/log_event.h
View file @
b1a13cb1
...
...
@@ -491,16 +491,16 @@ struct sql_ex_info
#define LOG_EVENT_RELAY_LOG_F 0x40
/**
@def LOG_EVENT_
DO_NOT_REPLICATE
_F
@def LOG_EVENT_
SKIP_REPLICATION
_F
Flag set by application creating the event (with @@
do_not_replicate
); the
Flag set by application creating the event (with @@
skip_replication
); the
slave will skip replication of such events if
--replicate-
ignore-do-not-replicate is set
.
--replicate-
events-marked-for-skip is false
.
This is a MariaDB flag; we allocate it from the end of the available
values to reduce risk of conflict with new MySQL flags.
*/
#define LOG_EVENT_
DO_NOT_REPLICATE
_F 0x8000
#define LOG_EVENT_
SKIP_REPLICATION
_F 0x8000
/**
...
...
@@ -670,10 +670,10 @@ typedef struct st_print_event_info
uint
thread_id
;
bool
thread_id_printed
;
/*
Track when @@
do_not_replicate
changes so we need to output a SET
Track when @@
skip_replication
changes so we need to output a SET
statement for it.
*/
int
do_not_replicate
;
int
skip_replication
;
st_print_event_info
();
...
...
@@ -929,7 +929,7 @@ public:
/**
Some 16 flags. See the definitions above for LOG_EVENT_TIME_F,
LOG_EVENT_FORCED_ROTATE_F, LOG_EVENT_THREAD_SPECIFIC_F,
LOG_EVENT_SUPPRESS_USE_F, and LOG_EVENT_
DO_NOT_REPLICATE
_F for notes.
LOG_EVENT_SUPPRESS_USE_F, and LOG_EVENT_
SKIP_REPLICATION
_F for notes.
*/
uint16
flags
;
...
...
@@ -3933,8 +3933,8 @@ public:
DBUG_PRINT
(
"enter"
,
(
"m_incident: %d"
,
m_incident
));
m_message
.
str
=
NULL
;
/* Just as a precaution */
m_message
.
length
=
0
;
/* Replicate the incident irregardless of @@
do_not_replicate
. */
flags
&=
~
LOG_EVENT_
DO_NOT_REPLICATE
_F
;
/* Replicate the incident irregardless of @@
skip_replication
. */
flags
&=
~
LOG_EVENT_
SKIP_REPLICATION
_F
;
DBUG_VOID_RETURN
;
}
...
...
@@ -3944,8 +3944,8 @@ public:
DBUG_ENTER
(
"Incident_log_event::Incident_log_event"
);
DBUG_PRINT
(
"enter"
,
(
"m_incident: %d"
,
m_incident
));
m_message
=
msg
;
/* Replicate the incident irregardless of @@
do_not_replicate
. */
flags
&=
~
LOG_EVENT_
DO_NOT_REPLICATE
_F
;
/* Replicate the incident irregardless of @@
skip_replication
. */
flags
&=
~
LOG_EVENT_
SKIP_REPLICATION
_F
;
DBUG_VOID_RETURN
;
}
#endif
...
...
sql/mysql_priv.h
View file @
b1a13cb1
...
...
@@ -504,7 +504,7 @@ protected:
*/
#define TMP_TABLE_FORCE_MYISAM (ULL(1) << 32)
#define OPTION_PROFILING (ULL(1) << 33)
#define OPTION_
DO_NOT_REPLICATE
(ULL(1) << 34) // THD, user
#define OPTION_
SKIP_REPLICATION
(ULL(1) << 34) // THD, user
...
...
@@ -2065,7 +2065,7 @@ extern my_bool opt_old_style_user_limits, trust_function_creators;
extern
uint
opt_crash_binlog_innodb
;
extern
char
*
shared_memory_base_name
,
*
mysqld_unix_port
;
extern
my_bool
opt_enable_shared_memory
;
extern
my_bool
opt_replicate_
ignore_do_not_replicate
;
extern
my_bool
opt_replicate_
events_marked_for_skip
;
extern
char
*
default_tz_name
;
#endif
/* MYSQL_SERVER */
#if defined MYSQL_SERVER || defined INNODB_COMPATIBILITY_HOOKS
...
...
sql/mysqld.cc
View file @
b1a13cb1
...
...
@@ -553,7 +553,7 @@ uint opt_large_page_size= 0;
uint
opt_debug_sync_timeout
=
0
;
#endif
/* defined(ENABLED_DEBUG_SYNC) */
my_bool
opt_old_style_user_limits
=
0
,
trust_function_creators
=
0
;
my_bool
opt_replicate_
ignore_do_not_replicate
;
my_bool
opt_replicate_
events_marked_for_skip
;
/*
True if there is at least one per-hour limit for some user, so we should
...
...
@@ -5935,6 +5935,7 @@ enum options_mysqld
OPT_SAFEMALLOC_MEM_LIMIT
,
OPT_REPLICATE_DO_TABLE
,
OPT_REPLICATE_IGNORE_TABLE
,
OPT_REPLICATE_WILD_DO_TABLE
,
OPT_REPLICATE_WILD_IGNORE_TABLE
,
OPT_REPLICATE_SAME_SERVER_ID
,
OPT_REPLICATE_EVENTS_MARKED_FOR_SKIP
,
OPT_DISCONNECT_SLAVE_EVENT_COUNT
,
OPT_TC_HEURISTIC_RECOVER
,
OPT_ABORT_SLAVE_EVENT_COUNT
,
OPT_LOG_BIN_TRUST_FUNCTION_CREATORS
,
...
...
@@ -6087,8 +6088,7 @@ enum options_mysqld
OPT_IGNORE_BUILTIN_INNODB
,
OPT_BINLOG_DIRECT_NON_TRANS_UPDATE
,
OPT_DEFAULT_CHARACTER_SET_OLD
,
OPT_MAX_LONG_DATA_SIZE
,
OPT_REPLICATE_IGNORE_DO_NOT_REPLICATE
OPT_MAX_LONG_DATA_SIZE
};
...
...
@@ -6785,11 +6785,12 @@ each time the SQL thread starts.",
"cross database updates. If you need cross database updates to work, "
"make sure you have 3.23.28 or later, and use replicate-wild-ignore-"
"table=db_name.%. "
,
0
,
0
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"replicate-ignore-do-not-replicate"
,
OPT_REPLICATE_IGNORE_DO_NOT_REPLICATE
,
"Tells the slave thread not to replicate events that were created with"
"@@do_not_replicat=1."
,
&
opt_replicate_ignore_do_not_replicate
,
&
opt_replicate_ignore_do_not_replicate
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"replicate-events-marked-for-skip"
,
OPT_REPLICATE_EVENTS_MARKED_FOR_SKIP
,
"Tells the slave thread to replicate events that were created with"
"@@skip_replication=1. Default true. If set to false, such events will not"
"be replicated."
,
&
opt_replicate_events_marked_for_skip
,
&
opt_replicate_events_marked_for_skip
,
0
,
GET_BOOL
,
NO_ARG
,
1
,
0
,
0
,
0
,
0
,
0
},
{
"replicate-ignore-table"
,
OPT_REPLICATE_IGNORE_TABLE
,
"Tells the slave thread to not replicate to the specified table. To specify "
"more than one table to ignore, use the directive multiple times, once for "
...
...
sql/set_var.cc
View file @
b1a13cb1
...
...
@@ -117,7 +117,7 @@ static bool set_option_log_bin_bit(THD *thd, set_var *var);
static
bool
set_option_autocommit
(
THD
*
thd
,
set_var
*
var
);
static
int
check_log_update
(
THD
*
thd
,
set_var
*
var
);
static
bool
set_log_update
(
THD
*
thd
,
set_var
*
var
);
static
int
check_
do_not_replicate
(
THD
*
thd
,
set_var
*
var
);
static
int
check_
skip_replication
(
THD
*
thd
,
set_var
*
var
);
static
int
check_pseudo_thread_id
(
THD
*
thd
,
set_var
*
var
);
void
fix_binlog_format_after_update
(
THD
*
thd
,
enum_var_type
type
);
static
void
fix_low_priority_updates
(
THD
*
thd
,
enum_var_type
type
);
...
...
@@ -831,10 +831,20 @@ static sys_var_thd_bit sys_profiling(&vars, "profiling", NULL,
static
sys_var_thd_ulong
sys_profiling_history_size
(
&
vars
,
"profiling_history_size"
,
&
SV
::
profiling_history_size
);
#endif
static
sys_var_thd_bit
sys_do_not_replicate
(
&
vars
,
"do_not_replicate"
,
check_do_not_replicate
,
/*
When this is set by a connection, binlogged events will be marked with a
corresponding flag. The slave can be configured to not replicate events
so marked.
In the binlog dump thread on the master, this variable is re-used for a
related purpose: The slave sets this flag when connecting to the master to
request that the master filter out (ie. not send) any events with the flag
set, thus saving network traffic on events that would be ignored by the
slave anyway.
*/
static
sys_var_thd_bit
sys_skip_replication
(
&
vars
,
"skip_replication"
,
check_skip_replication
,
set_option_bit
,
OPTION_
DO_NOT_REPLICATE
);
OPTION_
SKIP_REPLICATION
);
/* Local state variables */
...
...
@@ -912,10 +922,10 @@ static sys_var_thd_set sys_log_slow_verbosity(&vars,
&
SV
::
log_slow_verbosity
,
&
log_slow_verbosity_typelib
);
#ifdef HAVE_REPLICATION
static
sys_var_replicate_
ignore_do_not_replicate
sys_replicate_
ignore_do_not_replicate
(
&
vars
,
"replicate_ignore_do_not_replicate
"
,
&
opt_replicate_ignore_do_not_replicate
);
static
sys_var_replicate_
events_marked_for_skip
sys_replicate_
events_marked_for_skip
(
&
vars
,
"replicate_events_marked_for_skip
"
,
&
opt_replicate_events_marked_for_skip
);
#endif
/* Global read-only variable containing hostname */
...
...
@@ -3279,10 +3289,10 @@ static bool set_log_update(THD *thd, set_var *var)
}
static
int
check_
do_not_replicate
(
THD
*
thd
,
set_var
*
var
)
static
int
check_
skip_replication
(
THD
*
thd
,
set_var
*
var
)
{
/*
We must not change @@
do_not_replicate
in the middle of a transaction or
We must not change @@
skip_replication
in the middle of a transaction or
statement, as that could result in only part of the transaction / statement
being replicated.
(This would be particularly serious if we were to replicate eg.
...
...
@@ -4443,11 +4453,11 @@ sys_var_event_scheduler::update(THD *thd, set_var *var)
#ifdef HAVE_REPLICATION
bool
sys_var_replicate_
ignore_do_not_replicate
::
update
(
THD
*
thd
,
set_var
*
var
)
bool
sys_var_replicate_
events_marked_for_skip
::
update
(
THD
*
thd
,
set_var
*
var
)
{
bool
result
;
int
thread_mask
;
DBUG_ENTER
(
"sys_var_replicate_
ignore_do_not_replicate
::update"
);
DBUG_ENTER
(
"sys_var_replicate_
events_marked_for_skip
::update"
);
/* Slave threads must be stopped to change the variable. */
pthread_mutex_lock
(
&
LOCK_active_mi
);
...
...
sql/set_var.h
View file @
b1a13cb1
...
...
@@ -1286,17 +1286,17 @@ public:
#ifdef HAVE_REPLICATION
/**
Handler for setting the system variable --replicate-
ignore-do-not-replicate
.
Handler for setting the system variable --replicate-
events-marked-for-skip
.
*/
class
sys_var_replicate_
ignore_do_not_replicate
:
public
sys_var_bool_ptr
class
sys_var_replicate_
events_marked_for_skip
:
public
sys_var_bool_ptr
{
public:
sys_var_replicate_
ignore_do_not_replicate
(
sys_var_chain
*
chain
,
const
char
*
name_arg
,
my_bool
*
value_arg
)
:
sys_var_replicate_
events_marked_for_skip
(
sys_var_chain
*
chain
,
const
char
*
name_arg
,
my_bool
*
value_arg
)
:
sys_var_bool_ptr
(
chain
,
name_arg
,
value_arg
)
{};
~
sys_var_replicate_
ignore_do_not_replicate
()
{};
~
sys_var_replicate_
events_marked_for_skip
()
{};
bool
update
(
THD
*
thd
,
set_var
*
var
);
};
#endif
...
...
sql/slave.cc
View file @
b1a13cb1
...
...
@@ -1177,18 +1177,18 @@ when it try to get the value of TIME_ZONE global variable from master.";
}
/*
Request the master to filter away events with the @@
do_not_replicate
flag
set, if we are running with --replicate-
ignore-do_not_replicate=1
.
Request the master to filter away events with the @@
skip_replication
flag
set, if we are running with --replicate-
events-marked-for-skip=0
.
*/
if
(
opt_replicate_ignore_do_not_replicate
)
if
(
!
opt_replicate_events_marked_for_skip
)
{
if
(
!
mysql_real_query
(
mysql
,
STRING_WITH_LEN
(
"SET do_not_replicate
=1"
)))
if
(
mysql_real_query
(
mysql
,
STRING_WITH_LEN
(
"SET skip_replication
=1"
)))
{
err_code
=
mysql_errno
(
mysql
);
if
(
is_network_error
(
err_code
))
{
mi
->
report
(
ERROR_LEVEL
,
err_code
,
"Setting master-side filtering of @@
do_not_replicate
failed "
"Setting master-side filtering of @@
skip_replication
failed "
"with error: %s"
,
mysql_error
(
mysql
));
goto
network_err
;
}
...
...
@@ -1196,15 +1196,24 @@ when it try to get the value of TIME_ZONE global variable from master.";
{
/*
The master is older than the slave and does not support the
@@
do_not_replicate
feature.
@@
skip_replication
feature.
This is not a problem, as such master will not generate events with
the @@
do_not_replicate
flag set in the first place. We will still
the @@
skip_replication
flag set in the first place. We will still
do slave-side filtering of such events though, to handle the (rare)
case of downgrading a master and receiving old events generated from
before the downgrade with the @@
do_not_replicate
flag set.
before the downgrade with the @@
skip_replication
flag set.
*/
DBUG_PRINT
(
"info"
,
(
"Old master does not support master-side filtering "
"of @@do_not_replicate events."
));
"of @@skip_replication events."
));
}
else
{
/* Fatal error */
errmsg
=
"The slave I/O thread stops because a fatal error is "
"encountered when it tries to request filtering of events marked "
"with the @@skip_replication flag."
;
sprintf
(
err_buff
,
"%s Error: %s"
,
errmsg
,
mysql_error
(
mysql
));
goto
err
;
}
}
}
...
...
@@ -2146,8 +2155,8 @@ int apply_event_and_update_pos(Log_event* ev, THD* thd, Relay_log_info* rli)
thd
->
lex
->
current_select
=
0
;
if
(
!
ev
->
when
)
ev
->
when
=
my_time
(
0
);
thd
->
options
=
(
thd
->
options
&
~
OPTION_
DO_NOT_REPLICATE
)
|
(
ev
->
flags
&
LOG_EVENT_
DO_NOT_REPLICATE_F
?
OPTION_DO_NOT_REPLICATE
:
0
);
thd
->
options
=
(
thd
->
options
&
~
OPTION_
SKIP_REPLICATION
)
|
(
ev
->
flags
&
LOG_EVENT_
SKIP_REPLICATION_F
?
OPTION_SKIP_REPLICATION
:
0
);
ev
->
thd
=
thd
;
// because up to this point, ev->thd == 0
int
reason
=
ev
->
shall_skip
(
rli
);
...
...
@@ -3627,7 +3636,6 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
buf
[
EVENT_TYPE_OFFSET
]
!=
FORMAT_DESCRIPTION_EVENT
/* a way to escape */
)
DBUG_RETURN
(
queue_old_event
(
mi
,
buf
,
event_len
));
LINT_INIT
(
inc_pos
);
pthread_mutex_lock
(
&
mi
->
data_lock
);
switch
(
buf
[
EVENT_TYPE_OFFSET
])
{
...
...
@@ -3702,7 +3710,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
}
/*
If we filter events master-side (eg. @@
do_not_replicate
), we will see holes
If we filter events master-side (eg. @@
skip_replication
), we will see holes
in the event positions from the master. If we see such a hole, adjust
mi->master_log_pos accordingly so we maintain the correct position (for
reconnect, MASTER_POS_WAIT(), etc.)
...
...
sql/sql_binlog.cc
View file @
b1a13cb1
...
...
@@ -33,7 +33,7 @@
void
mysql_client_binlog_statement
(
THD
*
thd
)
{
ulonglong
save_
do_not_replicate
;
ulonglong
save_
skip_replication
;
DBUG_ENTER
(
"mysql_client_binlog_statement"
);
DBUG_PRINT
(
"info"
,(
"binlog base64: '%*s'"
,
(
int
)
(
thd
->
lex
->
comment
.
length
<
2048
?
...
...
@@ -214,15 +214,15 @@ void mysql_client_binlog_statement(THD* thd)
reporting.
*/
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
save_
do_not_replicate
=
thd
->
options
&
OPTION_DO_NOT_REPLICATE
;
thd
->
options
=
(
thd
->
options
&
~
OPTION_
DO_NOT_REPLICATE
)
|
(
ev
->
flags
&
LOG_EVENT_
DO_NOT_REPLICATE
_F
?
OPTION_
DO_NOT_REPLICATE
:
0
);
save_
skip_replication
=
thd
->
options
&
OPTION_SKIP_REPLICATION
;
thd
->
options
=
(
thd
->
options
&
~
OPTION_
SKIP_REPLICATION
)
|
(
ev
->
flags
&
LOG_EVENT_
SKIP_REPLICATION
_F
?
OPTION_
SKIP_REPLICATION
:
0
);
err
=
ev
->
apply_event
(
rli
);
thd
->
options
=
(
thd
->
options
&
~
OPTION_
DO_NOT_REPLICATE
)
|
save_
do_not_replicate
;
thd
->
options
=
(
thd
->
options
&
~
OPTION_
SKIP_REPLICATION
)
|
save_
skip_replication
;
#else
err
=
0
;
#endif
...
...
sql/sql_repl.cc
View file @
b1a13cb1
...
...
@@ -349,13 +349,17 @@ send_event_to_slave(THD *thd, NET *net, String* const packet)
thd_proc_info
(
thd
,
"Sending binlog event to slave"
);
/*
Skip events with the @@
do_not_replicate
flag set, if slave requested
Skip events with the @@
skip_replication
flag set, if slave requested
skipping of such events.
*/
if
(
thd
->
options
&
OPTION_
DO_NOT_REPLICATE
)
if
(
thd
->
options
&
OPTION_
SKIP_REPLICATION
)
{
/*
The first byte of the packet is a '\0' to distinguish it from an error
packet. So the actual event starts at offset +1.
*/
uint16
flags
=
uint2korr
(
&
((
*
packet
)[
FLAGS_OFFSET
+
1
]));
if
(
flags
&
LOG_EVENT_
DO_NOT_REPLICATE
_F
)
if
(
flags
&
LOG_EVENT_
SKIP_REPLICATION
_F
)
return
NULL
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment