Commit cdfc516d authored by unknown's avatar unknown
Browse files

BUG#25091 (A DELETE statement to mysql database is not logged in ROW format):

With this patch, statements that change metadata (in the mysql database)
is logged as statements, while normal changes (e.g., using INSERT, DELETE,
and/or UPDATE) is logged according to the format in effect.

The log tables (i.e., general_log and slow_log) are not replicated at all.

With this patch, the following statements are replicated as statements:
GRANT, REVOKE (ALL), CREATE USER, DROP USER, and RENAME USER.


mysql-test/extra/binlog_tests/binlog.test:
  Added test to check that normal INSERT, DELETE, and UPDATE to a table in
  the mysql database is replicated both under row-based and statement-based
  replication.
mysql-test/r/binlog_row_binlog.result:
  Result change.
mysql-test/r/binlog_stm_binlog.result:
  Result change.
sql/handler.cc:
  Removed hardcoded check for mysql database.
  Added table-specific flag for non-replication (used by log tables).
sql/log.cc:
  Adding flag that a table shall not be replicated and set it for log
  tables.
sql/sp.cc:
  Turning row-based replication off for statements that change metadata.
sql/sql_acl.cc:
  Turning row-based replication off for statements that change metadata.
sql/table.h:
  Adding flag that a table shall not be replicated.
parent fa22d34e
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -67,6 +67,19 @@ create table if not exists t2 select * from t1;
create temporary table tt1 (a int);
create table if not exists t3 like tt1;

# BUG#25091 (A DELETE statement to mysql database is not logged with
# ROW mode format): Checking that some basic operations on tables in
# the mysql database is replicated even when the current database is
# 'mysql'.

--disable_warnings
USE mysql;
INSERT INTO user SET host='localhost', user='@#@', password=password('Just a test');
UPDATE user SET password=password('Another password') WHERE host='localhost' AND user='@#@';
DELETE FROM user WHERE host='localhost' AND user='@#@';
--enable_warnings

use test;
--replace_column 2 # 5 #
--replace_regex /table_id: [0-9]+/table_id: #/ /\/\* xid=.* \*\//\/* xid= *\//
show binlog events from 102;
+17 −0
Original line number Diff line number Diff line
@@ -249,6 +249,11 @@ create table t1 (a int);
create table if not exists t2 select * from t1;
create temporary table tt1 (a int);
create table if not exists t3 like tt1;
USE mysql;
INSERT INTO user SET host='localhost', user='@#@', password=password('Just a test');
UPDATE user SET password=password('Another password') WHERE host='localhost' AND user='@#@';
DELETE FROM user WHERE host='localhost' AND user='@#@';
use test;
show binlog events from 102;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
master-bin.000001	#	Query	1	#	use `test`; create table t1 (id tinyint auto_increment primary key)
@@ -262,6 +267,12 @@ master-bin.000001 # Query 1 # use `test`; CREATE TABLE IF NOT EXISTS `t2` (
master-bin.000001	#	Query	1	#	use `test`; CREATE TABLE IF NOT EXISTS `t3` (
  `a` int(11) DEFAULT NULL
)
master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
master-bin.000001	#	Write_rows	1	#	table_id: # flags: STMT_END_F
master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
master-bin.000001	#	Update_rows	1	#	table_id: # flags: STMT_END_F
master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
master-bin.000001	#	Delete_rows	1	#	table_id: # flags: STMT_END_F
drop table t1,t2,t3,tt1;
create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
@@ -281,6 +292,12 @@ master-bin.000001 # Query 1 # use `test`; CREATE TABLE IF NOT EXISTS `t2` (
master-bin.000001	#	Query	1	#	use `test`; CREATE TABLE IF NOT EXISTS `t3` (
  `a` int(11) DEFAULT NULL
)
master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
master-bin.000001	#	Write_rows	1	#	table_id: # flags: STMT_END_F
master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
master-bin.000001	#	Update_rows	1	#	table_id: # flags: STMT_END_F
master-bin.000001	#	Table_map	1	#	table_id: # (mysql.user)
master-bin.000001	#	Delete_rows	1	#	table_id: # flags: STMT_END_F
master-bin.000001	#	Query	1	#	use `test`; DROP TABLE `t1`,`t2`,`t3` /* generated by server */
master-bin.000001	#	Query	1	#	use `test`; create table t1 (a int not null auto_increment, primary key (a)) engine=myisam
master-bin.000001	#	Table_map	1	#	table_id: # (test.t1)
+11 −0
Original line number Diff line number Diff line
@@ -159,6 +159,11 @@ create table t1 (a int);
create table if not exists t2 select * from t1;
create temporary table tt1 (a int);
create table if not exists t3 like tt1;
USE mysql;
INSERT INTO user SET host='localhost', user='@#@', password=password('Just a test');
UPDATE user SET password=password('Another password') WHERE host='localhost' AND user='@#@';
DELETE FROM user WHERE host='localhost' AND user='@#@';
use test;
show binlog events from 102;
Log_name	Pos	Event_type	Server_id	End_log_pos	Info
master-bin.000001	#	Query	1	#	use `test`; create table t1 (id tinyint auto_increment primary key)
@@ -169,6 +174,9 @@ master-bin.000001 # Query 1 # use `test`; create table t1 (a int)
master-bin.000001	#	Query	1	#	use `test`; create table if not exists t2 select * from t1
master-bin.000001	#	Query	1	#	use `test`; create temporary table tt1 (a int)
master-bin.000001	#	Query	1	#	use `test`; create table if not exists t3 like tt1
master-bin.000001	#	Query	1	#	use `mysql`; INSERT INTO user SET host='localhost', user='@#@', password=password('Just a test')
master-bin.000001	#	Query	1	#	use `mysql`; UPDATE user SET password=password('Another password') WHERE host='localhost' AND user='@#@'
master-bin.000001	#	Query	1	#	use `mysql`; DELETE FROM user WHERE host='localhost' AND user='@#@'
drop table t1,t2,t3,tt1;
create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
@@ -185,6 +193,9 @@ master-bin.000001 # Query 1 # use `test`; create table t1 (a int)
master-bin.000001	#	Query	1	#	use `test`; create table if not exists t2 select * from t1
master-bin.000001	#	Query	1	#	use `test`; create temporary table tt1 (a int)
master-bin.000001	#	Query	1	#	use `test`; create table if not exists t3 like tt1
master-bin.000001	#	Query	1	#	use `mysql`; INSERT INTO user SET host='localhost', user='@#@', password=password('Just a test')
master-bin.000001	#	Query	1	#	use `mysql`; UPDATE user SET password=password('Another password') WHERE host='localhost' AND user='@#@'
master-bin.000001	#	Query	1	#	use `mysql`; DELETE FROM user WHERE host='localhost' AND user='@#@'
master-bin.000001	#	Query	1	#	use `test`; drop table t1,t2,t3,tt1
master-bin.000001	#	Query	1	#	use `test`; create table t1 (a int not null auto_increment, primary key (a)) engine=myisam
master-bin.000001	#	Table_map	1	#	table_id: # (test.t1)
+1 −1
Original line number Diff line number Diff line
@@ -3481,7 +3481,7 @@ namespace {
    {
      int const check(table->s->tmp_table == NO_TMP_TABLE &&
                      binlog_filter->db_ok(table->s->db.str) &&
                      strcmp("mysql", table->s->db.str) != 0);
                      !table->no_replicate);
      table->s->cached_row_logging_check= check;
    }

+1 −0
Original line number Diff line number Diff line
@@ -312,6 +312,7 @@ bool Log_to_csv_event_handler::open_log_table(uint log_table_type)
  {
    table->table->use_all_columns();
    table->table->locked_by_logger= TRUE;
    table->table->no_replicate= TRUE;
  }
  /* restore thread settings */
  if (curr)
Loading