diff options
-rw-r--r-- | client/mysqlbinlog.cc | 27 | ||||
-rw-r--r-- | mysql-test/suite/rpl/r/rpl_skip_replication.result (renamed from mysql-test/suite/rpl/r/rpl_do_not_replicate.result) | 64 | ||||
-rw-r--r-- | mysql-test/suite/rpl/t/rpl_skip_replication.test (renamed from mysql-test/suite/rpl/t/rpl_do_not_replicate.test) | 86 | ||||
-rw-r--r-- | sql/log_event.cc | 14 | ||||
-rw-r--r-- | sql/log_event.h | 22 | ||||
-rw-r--r-- | sql/mysql_priv.h | 4 | ||||
-rw-r--r-- | sql/mysqld.cc | 17 | ||||
-rw-r--r-- | sql/set_var.cc | 34 | ||||
-rw-r--r-- | sql/set_var.h | 12 | ||||
-rw-r--r-- | sql/slave.cc | 34 | ||||
-rw-r--r-- | sql/sql_binlog.cc | 14 | ||||
-rw-r--r-- | sql/sql_repl.cc | 10 |
12 files changed, 178 insertions, 160 deletions
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 40f0348d3a2..4b563090f25 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -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); } } diff --git a/mysql-test/suite/rpl/r/rpl_do_not_replicate.result b/mysql-test/suite/rpl/r/rpl_skip_replication.result index d0f1df310c1..4baa5b993a3 100644 --- a/mysql-test/suite/rpl/r/rpl_do_not_replicate.result +++ b/mysql-test/suite/rpl/r/rpl_skip_replication.result @@ -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 diff --git a/mysql-test/suite/rpl/t/rpl_do_not_replicate.test b/mysql-test/suite/rpl/t/rpl_skip_replication.test index 5d3984db0bd..d4657806efe 100644 --- a/mysql-test/suite/rpl/t/rpl_do_not_replicate.test +++ b/mysql-test/suite/rpl/t/rpl_skip_replication.test @@ -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 diff --git a/sql/log_event.cc b/sql/log_event.cc index 05313dc3337..ffe4fb2a4fc 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -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) { /* diff --git a/sql/log_event.h b/sql/log_event.h index b3a6d0c9d48..153c2999bf6 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -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 diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 1322ea1b165..295b913e623 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -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 diff --git a/sql/mysqld.cc b/sql/mysqld.cc index e966b35a556..a4477ba58e8 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -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 " diff --git a/sql/set_var.cc b/sql/set_var.cc index dc52ed7baf3..04d57e50737 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -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); diff --git a/sql/set_var.h b/sql/set_var.h index e2c6f4b95d2..25a9a054ce0 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -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 diff --git a/sql/slave.cc b/sql/slave.cc index bffbfacc40b..7e759eecb90 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -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.) diff --git a/sql/sql_binlog.cc b/sql/sql_binlog.cc index bb95054a371..319d08d2a96 100644 --- a/sql/sql_binlog.cc +++ b/sql/sql_binlog.cc @@ -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 diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 8de2ce5fcf1..8c2e6e82cd4 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -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; } |