Skip to content

Commit

Permalink
Allow row events in replication stream for slave in all cases
Browse files Browse the repository at this point in the history
(even when configured with --binlog-format=statement).
Before we got an error on the slave and the slave stopped if the master
was configured with --binlog-format=mixed or --binlog-format=row.
  • Loading branch information
montywi committed Oct 8, 2015
1 parent d278fb4 commit ca051fa
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 9 deletions.
28 changes: 28 additions & 0 deletions mysql-test/suite/rpl/r/rpl_row_to_stmt.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
include/master-slave.inc
[connection master]
use test;
create table t1 (a int primary key);
insert into t1 values (1),(2),(3),(4),(5);
update t1 set a=a*10;
use test;
select * from t1;
a
10
20
30
40
50
include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info
slave-bin.000001 # Gtid # # GTID #-#-#
slave-bin.000001 # Query # # use `test`; create table t1 (a int primary key)
slave-bin.000001 # Gtid # # BEGIN GTID #-#-#
slave-bin.000001 # Table_map # # table_id: # (test.t1)
slave-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
slave-bin.000001 # Query # # COMMIT
slave-bin.000001 # Gtid # # BEGIN GTID #-#-#
slave-bin.000001 # Table_map # # table_id: # (test.t1)
slave-bin.000001 # Update_rows_v1 # # table_id: # flags: STMT_END_F
slave-bin.000001 # Query # # COMMIT
drop table t1;
include/rpl_end.inc
1 change: 1 addition & 0 deletions mysql-test/suite/rpl/t/rpl_row_to_stmt-master.opt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
--binlog-format=row
1 change: 1 addition & 0 deletions mysql-test/suite/rpl/t/rpl_row_to_stmt-slave.opt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
--binlog-format=statement
23 changes: 23 additions & 0 deletions mysql-test/suite/rpl/t/rpl_row_to_stmt.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#
# check that master starterd with log-format=ROW replication can replicate to
# slave started with log-format=STATEMENT
#

--source include/have_binlog_format_row.inc
--source include/master-slave.inc

use test;

create table t1 (a int primary key);
insert into t1 values (1),(2),(3),(4),(5);
update t1 set a=a*10;

sync_slave_with_master;
use test;
select * from t1;
source include/show_binlog_events.inc;

connection master;
drop table t1;

--source include/rpl_end.inc
15 changes: 6 additions & 9 deletions sql/sql_class.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5156,16 +5156,13 @@ void xid_cache_delete(XID_STATE *xid_state)
BINLOG_FORMAT = STATEMENT and at least one table uses a storage
engine limited to row-logging.
6. Error: Cannot execute row injection: binlogging impossible since
BINLOG_FORMAT = STATEMENT.
7. Warning: Unsafe statement binlogged in statement format since
6. Warning: Unsafe statement binlogged in statement format since
BINLOG_FORMAT = STATEMENT.
In addition, we can produce the following error (not depending on
the variables of the decision diagram):
8. Error: Cannot execute statement: binlogging impossible since more
7. Error: Cannot execute statement: binlogging impossible since more
than one engine is involved and at least one engine is
self-logging.
Expand Down Expand Up @@ -5444,10 +5441,10 @@ int THD::decide_logging_format(TABLE_LIST *tables)
if (lex->is_stmt_row_injection())
{
/*
6. Error: Cannot execute row injection since
BINLOG_FORMAT = STATEMENT
We have to log the statement as row or give an error.
Better to accept what master gives us than stopping replication.
*/
my_error((error= ER_BINLOG_ROW_INJECTION_AND_STMT_MODE), MYF(0));
set_current_stmt_binlog_format_row();
}
else if ((flags_write_all_set & HA_BINLOG_STMT_CAPABLE) == 0 &&
sqlcom_can_generate_row_events(this))
Expand All @@ -5472,7 +5469,7 @@ int THD::decide_logging_format(TABLE_LIST *tables)
DBUG_PRINT("info", ("binlog_unsafe_warning_flags: 0x%x",
binlog_unsafe_warning_flags));
}
/* log in statement format! */
/* log in statement format (or row if row event)! */
}
/* No statement-only engines and binlog_format != STATEMENT.
I.e., nothing prevents us from row logging if needed. */
Expand Down

0 comments on commit ca051fa

Please sign in to comment.