Bug #74828 Restart incorrectly stated as required to change binlog_format
Submitted: 13 Nov 2014 3:28 Modified: 17 Jan 2018 14:27
Reporter: Brian Papantonio Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Documentation Severity:S3 (Non-critical)
Version:5.7, 5.6 OS:Any
Assigned to: David Moss CPU Architecture:Any

[13 Nov 2014 3:28] Brian Papantonio
Description:
http://dev.mysql.com/doc/refman/5.6/en/replication-formats.html
The documentation on this page states "The logging format in a running MySQL server is controlled by setting the binlog_format server system variable...setting the variable globally requires a restart of the server to take effect".

In fact, the server switches seamlessly between statement and row-based replication modes. No restart is required. All clients that connect thereafter will immediately start using the new mode.

How to repeat:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.20-log MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select @@global.binlog_format, @@session.binlog_format;
+------------------------+-------------------------+
| @@global.binlog_format | @@session.binlog_format |
+------------------------+-------------------------+
| STATEMENT              | STATEMENT               |
+------------------------+-------------------------+
1 row in set (0.00 sec)

mysql> create table test.tbl (id int primary key, col int);
Query OK, 0 rows affected (0.25 sec)

mysql> insert test.tbl (id, col) values (1, 123);
Query OK, 1 row affected (0.01 sec)

mysql> update test.tbl set col=col*2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> drop table test.tbl;
Query OK, 0 rows affected (0.00 sec)

mysql> set global binlog_format=ROW;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@global.binlog_format, @@session.binlog_format;
+------------------------+-------------------------+
| @@global.binlog_format | @@session.binlog_format |
+------------------------+-------------------------+
| ROW                    | STATEMENT               |
+------------------------+-------------------------+
1 row in set (0.00 sec)

mysql> connect
Connection id:    3
Current database: *** NONE ***

mysql> select @@global.binlog_format, @@session.binlog_format;
+------------------------+-------------------------+
| @@global.binlog_format | @@session.binlog_format |
+------------------------+-------------------------+
| ROW                    | ROW                     |
+------------------------+-------------------------+
1 row in set (0.00 sec)

mysql> create table test.tbl (id int primary key, col int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert test.tbl (id, col) values (1, 123);
Query OK, 1 row affected (0.00 sec)

mysql> update test.tbl set col=col*2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> drop table test.tbl;
Query OK, 0 rows affected (0.00 sec)

--

# mysqlbinlog mysqld-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#141113  3:06:03 server id 1  end_log_pos 120 CRC32 0x45454827  Start: binlog v 4, server v 5.6.20-log created 141113  3:06:03 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
GyBkVA8BAAAAdAAAAHgAAAABAAQANS42LjIwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAbIGRUEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAASdI
RUU=
'/*!*/;
# at 120
#141113  3:06:27 server id 1  end_log_pos 241 CRC32 0x5272ae22  Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1415847987/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1073741824/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create table test.tbl (id int primary key, col int)
/*!*/;
# at 241
#141113  3:06:34 server id 1  end_log_pos 316 CRC32 0x996c70ec  Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1415847994/*!*/;
BEGIN
/*!*/;
# at 316
#141113  3:06:34 server id 1  end_log_pos 427 CRC32 0x42b06845  Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1415847994/*!*/;
insert test.tbl (id, col) values (1, 123)
/*!*/;
# at 427
#141113  3:06:34 server id 1  end_log_pos 458 CRC32 0xe3aa7469  Xid = 5
COMMIT/*!*/;
# at 458
#141113  3:06:36 server id 1  end_log_pos 533 CRC32 0x9e556a57  Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1415847996/*!*/;
BEGIN
/*!*/;
# at 533
#141113  3:06:36 server id 1  end_log_pos 632 CRC32 0xb1377aac  Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1415847996/*!*/;
update test.tbl set col=col*2
/*!*/;
# at 632
#141113  3:06:36 server id 1  end_log_pos 663 CRC32 0xfc47f945  Xid = 6
COMMIT/*!*/;
# at 663
#141113  3:06:46 server id 1  end_log_pos 782 CRC32 0xc862d644  Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1415848006/*!*/;
DROP TABLE `test`.`tbl` /* generated by server */
/*!*/;
# at 782
#141113  3:07:30 server id 1  end_log_pos 903 CRC32 0xbafc0e23  Query   thread_id=3     exec_time=0     error_code=0
SET TIMESTAMP=1415848050/*!*/;
create table test.tbl (id int primary key, col int)
/*!*/;
# at 903
#141113  3:07:34 server id 1  end_log_pos 971 CRC32 0x4c8f5605  Query   thread_id=3     exec_time=0     error_code=0
SET TIMESTAMP=1415848054/*!*/;
BEGIN
/*!*/;
# at 971
#141113  3:07:34 server id 1  end_log_pos 1018 CRC32 0xca5958f8         Table_map: `test`.`tbl` mapped to number 71
# at 1018
#141113  3:07:34 server id 1  end_log_pos 1062 CRC32 0x7ca62cae         Write_rows: table id 71 flags: STMT_END_F

BINLOG '
diBkVBMBAAAALwAAAPoDAAAAAEcAAAAAAAEABHRlc3QAA3RibAACAwMAAvhYWco=
diBkVB4BAAAALAAAACYEAAAAAEcAAAAAAAEAAgAC//wBAAAAewAAAK4spnw=
'/*!*/;
# at 1062
#141113  3:07:34 server id 1  end_log_pos 1093 CRC32 0xf9e79101         Xid = 13
COMMIT/*!*/;
# at 1093
#141113  3:07:39 server id 1  end_log_pos 1161 CRC32 0x02db19f7         Query   thread_id=3     exec_time=0     error_code=0
SET TIMESTAMP=1415848059/*!*/;
BEGIN
/*!*/;
# at 1161
#141113  3:07:39 server id 1  end_log_pos 1208 CRC32 0x8d1ef751         Table_map: `test`.`tbl` mapped to number 71
# at 1208
#141113  3:07:39 server id 1  end_log_pos 1262 CRC32 0x08933306         Update_rows: table id 71 flags: STMT_END_F

BINLOG '
eyBkVBMBAAAALwAAALgEAAAAAEcAAAAAAAEABHRlc3QAA3RibAACAwMAAlH3Ho0=
eyBkVB8BAAAANgAAAO4EAAAAAEcAAAAAAAEAAgAC///8AQAAAHsAAAD8AQAAAPYAAAAGM5MI
'/*!*/;
# at 1262
#141113  3:07:39 server id 1  end_log_pos 1293 CRC32 0x1551002e         Xid = 14
COMMIT/*!*/;
# at 1293
#141113  3:07:49 server id 1  end_log_pos 1412 CRC32 0xc9eaca60         Query   thread_id=3     exec_time=0     error_code=0
SET TIMESTAMP=1415848069/*!*/;
DROP TABLE `test`.`tbl` /* generated by server */
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

Suggested fix:
Remove the text about a restart being required. You may wish to clarify that other active connections will not pick up the change until they reconnect.
[17 Jan 2018 14:27] Margaret Fisher
Posted by developer:
 
Thanks for the report - sorry this wasn't handled earlier. I have corrected the text in
http://dev.mysql.com/doc/refman/8.0/en/replication-formats.html
and earlier releases, to read
The rules governing when and how the new setting takes effect are the same as for other MySQL server system variables. Setting the variable for the current session lasts only until the end of that session, and the change is not visible to other sessions. Setting the variable globally takes effect for clients that connect after the change, but not for any current client sessions, including the session where the variable setting was changed. To make the global system variable setting permanent so that it applies across server restarts, you must set it in an option file.