Commit 1b4516d1 authored by unknown's avatar unknown
Browse files

WL#3171: Dynamic logging format

  Removed error on seeing table map event when slave is in SBR mode
  and switching temporarily to RBR mode to replicate the rows.


sql/log_event.cc:
  Settig binlog format to "row" on seeing a table map event.
  Resetting binlog format on error and seeing STMT_END_F.
sql/sql_class.h:
  Adding method to unconditially set binlog format to "row".
mysql-test/r/rpl_rbr_to_sbr.result:
  New BitKeeper file ``mysql-test/r/rpl_rbr_to_sbr.result''
mysql-test/t/rpl_rbr_to_sbr.test:
  New BitKeeper file ``mysql-test/t/rpl_rbr_to_sbr.test''
parent a5518ba6
Loading
Loading
Loading
Loading
+69 −0
Original line number Diff line number Diff line
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;
SET BINLOG_FORMAT=MIXED;
SELECT @@GLOBAL.BINLOG_FORMAT, @@SESSION.BINLOG_FORMAT;
@@GLOBAL.BINLOG_FORMAT	@@SESSION.BINLOG_FORMAT
STATEMENT	MIXED
SET GLOBAL BINLOG_FORMAT=MIXED;
SELECT @@GLOBAL.BINLOG_FORMAT, @@SESSION.BINLOG_FORMAT;
@@GLOBAL.BINLOG_FORMAT	@@SESSION.BINLOG_FORMAT
MIXED	MIXED
**** On Master ****
CREATE TABLE t1 (a INT, b LONG);
INSERT INTO t1 VALUES (1,1), (2,2);
INSERT INTO t1 VALUES (3,UUID()), (4,UUID());
SHOW BINLOG EVENTS;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
master-bin.000001	4	Format_desc	1	102	Server ver: 5.1.8-beta-debug-log, Binlog ver: 4
master-bin.000001	102	Query	1	196	use `test`; CREATE TABLE t1 (a INT, b LONG)
master-bin.000001	196	Query	1	293	use `test`; INSERT INTO t1 VALUES (1,1), (2,2)
master-bin.000001	293	Table_map	1	333	test.t1
master-bin.000001	333	Write_rows	1	450	
**** On Slave ****
SHOW SLAVE STATUS;
Slave_IO_State	#
Master_Host	127.0.0.1
Master_User	root
Master_Port	MASTER_PORT
Connect_Retry	1
Master_Log_File	master-bin.000001
Read_Master_Log_Pos	450
Relay_Log_File	#
Relay_Log_Pos	#
Relay_Master_Log_File	master-bin.000001
Slave_IO_Running	Yes
Slave_SQL_Running	Yes
Replicate_Do_DB	
Replicate_Ignore_DB	
Replicate_Do_Table	
Replicate_Ignore_Table	
Replicate_Wild_Do_Table	
Replicate_Wild_Ignore_Table	
Last_Errno	0
Last_Error	
Skip_Counter	0
Exec_Master_Log_Pos	450
Relay_Log_Space	#
Until_Condition	None
Until_Log_File	
Until_Log_Pos	0
Master_SSL_Allowed	No
Master_SSL_CA_File	
Master_SSL_CA_Path	
Master_SSL_Cert	
Master_SSL_Cipher	
Master_SSL_Key	
Seconds_Behind_Master	#
SHOW BINLOG EVENTS;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
slave-bin.000001	4	Format_desc	2	102	Server ver: 5.1.8-beta-debug-log, Binlog ver: 4
slave-bin.000001	102	Query	2	212	use `test`; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9
slave-bin.000001	212	Query	1	306	use `test`; CREATE TABLE t1 (a INT, b LONG)
slave-bin.000001	306	Query	1	403	use `test`; INSERT INTO t1 VALUES (1,1), (2,2)
slave-bin.000001	403	Table_map	1	443	test.t1
slave-bin.000001	443	Write_rows	1	560	
DROP TABLE IF EXISTS t1;
+40 −0
Original line number Diff line number Diff line
-- source include/have_binlog_format_statement.inc
-- source include/master-slave.inc

# Test that the slave temporarily switches to ROW when seeing binrow
# events when it is in STATEMENT or MIXED mode

SET BINLOG_FORMAT=MIXED;
SELECT @@GLOBAL.BINLOG_FORMAT, @@SESSION.BINLOG_FORMAT;
SET GLOBAL BINLOG_FORMAT=MIXED;
SELECT @@GLOBAL.BINLOG_FORMAT, @@SESSION.BINLOG_FORMAT;

--echo **** On Master ****
CREATE TABLE t1 (a INT, b LONG);
INSERT INTO t1 VALUES (1,1), (2,2);
INSERT INTO t1 VALUES (3,UUID()), (4,UUID());
SHOW BINLOG EVENTS;
sync_slave_with_master;
--echo **** On Slave ****
--replace_result $MASTER_MYPORT MASTER_PORT
--replace_column 1 # 8 # 9 # 23 # 33 #
--query_vertical SHOW SLAVE STATUS
SHOW BINLOG EVENTS;

--exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert --no-create-info test > $MYSQLTEST_VARDIR/tmp/rpl_rbr_to_sbr_master.sql
--exec $MYSQL_DUMP_SLAVE --compact --order-by-primary --skip-extended-insert --no-create-info test > $MYSQLTEST_VARDIR/tmp/rpl_rbr_to_sbr_slave.sql

connection master;
DROP TABLE IF EXISTS t1;

# Let's compare. Note: If they match test will pass, if they do not match
# the test will show that the diff statement failed and not reject file
# will be created. You will need to go to the mysql-test dir and diff
# the files your self to see what is not matching

--exec diff $MYSQLTEST_VARDIR/tmp/rpl_rbr_to_sbr_master.sql $MYSQLTEST_VARDIR/tmp/rpl_rbr_to_sbr_slave.sql;

# If all is good, we can remove the files

system rm $MYSQLTEST_VARDIR/tmp/rpl_rbr_to_sbr_master.sql;
system rm $MYSQLTEST_VARDIR/tmp/rpl_rbr_to_sbr_slave.sql;
+8 −16
Original line number Diff line number Diff line
@@ -5452,6 +5452,7 @@ int Rows_log_event::exec_event(st_relay_log_info *rli)
      For now we code, knowing that error is not skippable and so slave SQL
      thread is certainly going to stop.
    */
    thd->reset_current_stmt_binlog_row_based();
    rli->cleanup_context(thd, 1);
    thd->query_error= 1;
    DBUG_RETURN(error);
@@ -5495,6 +5496,7 @@ int Rows_log_event::exec_event(st_relay_log_info *rli)
      event flushed.
    */

    thd->reset_current_stmt_binlog_row_based();
    rli->cleanup_context(thd, 0);
    rli->transaction_end(thd);

@@ -5856,24 +5858,14 @@ int Table_map_log_event::exec_event(st_relay_log_info *rli)
      (!rpl_filter->is_on() || rpl_filter->tables_ok("", &table_list)))
  {
    /*
      TODO: Mats will soon change this test below so that a SBR slave always
      accepts RBR events from the master (and binlogs them RBR).
      Check if the slave is set to use SBR.  If so, it should switch
      to using RBR until the end of the "statement", i.e., next
      STMT_END_F or next error.
    */
    /*
      Check if the slave is set to use SBR.  If so, the slave should
      stop immediately since it is not possible to daisy-chain from
      RBR to SBR.  Once RBR is used, the rest of the chain has to use
      RBR.
    */
    if (mysql_bin_log.is_open() && (thd->options & OPTION_BIN_LOG) &&
        !thd->current_stmt_binlog_row_based)
    if (!thd->current_stmt_binlog_row_based &&
        mysql_bin_log.is_open() && (thd->options & OPTION_BIN_LOG))
    {
      slave_print_msg(ERROR_LEVEL, rli, ER_BINLOG_ROW_RBR_TO_SBR,
                      "It is not possible to use statement-based binlogging "
                      "on a slave that replicates row-based.  Please use "
                      "--binrow-format=row on slave if you want to use "
                      "--log-slave-updates and read row-based binlog events.");
      DBUG_RETURN(ERR_RBR_TO_SBR);
      thd->set_current_stmt_binlog_row_based();
    }

    /*
+4 −0
Original line number Diff line number Diff line
@@ -1387,6 +1387,10 @@ class THD :public Statement,
    if (variables.binlog_format == BINLOG_FORMAT_MIXED)
      current_stmt_binlog_row_based= 1;
  }
  inline void set_current_stmt_binlog_row_based()
  {
    current_stmt_binlog_row_based= 1;
  }
  inline void reset_current_stmt_binlog_row_based()
  {
    current_stmt_binlog_row_based= test(variables.binlog_format == BINLOG_FORMAT_ROW);