Commit 4440b71d authored by mats@mysql.com's avatar mats@mysql.com

Bug#18280 (RBR: Extreneous maps when writing to general_log and slow_log):

Filter out replication general_log and slow_log entirely from binary
log. Caching result of table share-specific tests.
parent 6c37cfee
...@@ -14,7 +14,5 @@ get_lock("a",10) ...@@ -14,7 +14,5 @@ get_lock("a",10)
show binlog events; show binlog events;
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4 master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
master-bin.000001 # Table_map 1 # table_id: # (mysql.proc)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000001 # Query 1 # create database `drop-temp+table-test` master-bin.000001 # Query 1 # create database `drop-temp+table-test`
drop database `drop-temp+table-test`; drop database `drop-temp+table-test`;
...@@ -57,8 +57,6 @@ master-bin.000001 # Rotate 1 # master-bin.000002;pos=4 ...@@ -57,8 +57,6 @@ master-bin.000001 # Rotate 1 # master-bin.000002;pos=4
show binlog events in 'master-bin.000002'; show binlog events in 'master-bin.000002';
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000002 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4 master-bin.000002 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
master-bin.000002 # Table_map 1 # table_id: # (mysql.slow_log)
master-bin.000002 # Table_map 1 # table_id: # (mysql.general_log)
master-bin.000002 # Query 1 # use `test`; create table t3 (a int)ENGINE=MyISAM master-bin.000002 # Query 1 # use `test`; create table t3 (a int)ENGINE=MyISAM
master-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=MyISAM master-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=MyISAM
master-bin.000002 # Table_map 1 # table_id: # (test.t2) master-bin.000002 # Table_map 1 # table_id: # (test.t2)
...@@ -66,12 +64,12 @@ master-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F ...@@ -66,12 +64,12 @@ master-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F
show binary logs; show binary logs;
Log_name File_size Log_name File_size
master-bin.000001 1256 master-bin.000001 1256
master-bin.000002 483 master-bin.000002 373
start slave; start slave;
show binary logs; show binary logs;
Log_name File_size Log_name File_size
slave-bin.000001 1354 slave-bin.000001 1354
slave-bin.000002 384 slave-bin.000002 274
show binlog events in 'slave-bin.000001' from 4; show binlog events in 'slave-bin.000001' from 4;
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
slave-bin.000001 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4 slave-bin.000001 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
...@@ -87,14 +85,12 @@ slave-bin.000001 # Rotate 2 # slave-bin.000002;pos=4 ...@@ -87,14 +85,12 @@ slave-bin.000001 # Rotate 2 # slave-bin.000002;pos=4
show binlog events in 'slave-bin.000002' from 4; show binlog events in 'slave-bin.000002' from 4;
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
slave-bin.000002 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4 slave-bin.000002 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
slave-bin.000002 # Table_map 2 # table_id: # (mysql.slow_log)
slave-bin.000002 # Table_map 2 # table_id: # (mysql.general_log)
slave-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=MyISAM slave-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=MyISAM
slave-bin.000002 # Table_map 1 # table_id: # (test.t2) slave-bin.000002 # Table_map 1 # table_id: # (test.t2)
slave-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F slave-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F
show slave status; show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 483 # # master-bin.000002 Yes Yes # 0 0 483 # None 0 No # # 127.0.0.1 root MASTER_PORT 1 master-bin.000002 373 # # master-bin.000002 Yes Yes # 0 0 373 # None 0 No #
show binlog events in 'slave-bin.000005' from 4; show binlog events in 'slave-bin.000005' from 4;
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log
DROP TABLE t1; DROP TABLE t1;
......
...@@ -61,8 +61,6 @@ master-bin.000001 # Rotate 1 # master-bin.000002;pos=4 ...@@ -61,8 +61,6 @@ master-bin.000001 # Rotate 1 # master-bin.000002;pos=4
show binlog events in 'master-bin.000002'; show binlog events in 'master-bin.000002';
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000002 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4 master-bin.000002 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
master-bin.000002 # Table_map 1 # table_id: # (mysql.slow_log)
master-bin.000002 # Table_map 1 # table_id: # (mysql.general_log)
master-bin.000002 # Query 1 # use `test`; create table t3 (a int)ENGINE=InnoDB master-bin.000002 # Query 1 # use `test`; create table t3 (a int)ENGINE=InnoDB
master-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=InnoDB master-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=InnoDB
master-bin.000002 # Table_map 1 # table_id: # (test.t2) master-bin.000002 # Table_map 1 # table_id: # (test.t2)
...@@ -71,12 +69,12 @@ master-bin.000002 # Xid 1 # COMMIT /* XID */ ...@@ -71,12 +69,12 @@ master-bin.000002 # Xid 1 # COMMIT /* XID */
show binary logs; show binary logs;
Log_name File_size Log_name File_size
master-bin.000001 1310 master-bin.000001 1310
master-bin.000002 510 master-bin.000002 400
start slave; start slave;
show binary logs; show binary logs;
Log_name File_size Log_name File_size
slave-bin.000001 1408 slave-bin.000001 1408
slave-bin.000002 411 slave-bin.000002 301
show binlog events in 'slave-bin.000001' from 4; show binlog events in 'slave-bin.000001' from 4;
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
slave-bin.000001 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4 slave-bin.000001 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
...@@ -94,15 +92,13 @@ slave-bin.000001 # Rotate 2 # slave-bin.000002;pos=4 ...@@ -94,15 +92,13 @@ slave-bin.000001 # Rotate 2 # slave-bin.000002;pos=4
show binlog events in 'slave-bin.000002' from 4; show binlog events in 'slave-bin.000002' from 4;
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
slave-bin.000002 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4 slave-bin.000002 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
slave-bin.000002 # Table_map 2 # table_id: # (mysql.slow_log)
slave-bin.000002 # Table_map 2 # table_id: # (mysql.general_log)
slave-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=InnoDB slave-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=InnoDB
slave-bin.000002 # Table_map 1 # table_id: # (test.t2) slave-bin.000002 # Table_map 1 # table_id: # (test.t2)
slave-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F slave-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F
slave-bin.000002 # Xid 1 # COMMIT /* XID */ slave-bin.000002 # Xid 1 # COMMIT /* XID */
show slave status; show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 510 # # master-bin.000002 Yes Yes # 0 0 510 # None 0 No # # 127.0.0.1 root MASTER_PORT 1 master-bin.000002 400 # # master-bin.000002 Yes Yes # 0 0 400 # None 0 No #
show binlog events in 'slave-bin.000005' from 4; show binlog events in 'slave-bin.000005' from 4;
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log
DROP TABLE t1; DROP TABLE t1;
......
...@@ -58,4 +58,4 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File ...@@ -58,4 +58,4 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File
flush logs; flush logs;
show master status; show master status;
File Position Binlog_Do_DB Binlog_Ignore_DB File Position Binlog_Do_DB Binlog_Ignore_DB
master-bin.000002 212 <Binlog_Ignore_DB> master-bin.000002 102 <Binlog_Ignore_DB>
...@@ -3150,16 +3150,47 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat) ...@@ -3150,16 +3150,47 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat)
declared static, but it works by putting it into an anonymous declared static, but it works by putting it into an anonymous
namespace. */ namespace. */
namespace { namespace {
struct st_table_data {
char const *db;
char const *name;
};
int table_name_compare(void const *a, void const *b)
{
st_table_data const *x = (st_table_data const*) a;
st_table_data const *y = (st_table_data const*) b;
/* Doing lexical compare in order (db,name) */
int const res= strcmp(x->db, y->db);
return res != 0 ? res : strcmp(x->name, y->name);
}
bool check_table_binlog_row_based(THD *thd, TABLE *table) bool check_table_binlog_row_based(THD *thd, TABLE *table)
{ {
static st_table_data const ignore[] = {
{ "mysql", "event" },
{ "mysql", "general_log" },
{ "mysql", "slow_log" }
};
my_size_t const ignore_size = sizeof(ignore)/sizeof(*ignore);
st_table_data const item = { table->s->db.str, table->s->table_name.str };
if (table->s->cached_row_logging_check == -1)
table->s->cached_row_logging_check=
(table->s->tmp_table == NO_TMP_TABLE) &&
binlog_filter->db_ok(table->s->db.str) &&
bsearch(&item, ignore, ignore_size,
sizeof(st_table_data), table_name_compare) == NULL;
DBUG_ASSERT(table->s->cached_row_logging_check == 0 ||
table->s->cached_row_logging_check == 1);
return return
thd->current_stmt_binlog_row_based && thd->current_stmt_binlog_row_based &&
thd && (thd->options & OPTION_BIN_LOG) && thd && (thd->options & OPTION_BIN_LOG) &&
(table->s->tmp_table == NO_TMP_TABLE) &&
mysql_bin_log.is_open() && mysql_bin_log.is_open() &&
binlog_filter->db_ok(table->s->db.str) && table->s->cached_row_logging_check;
(strcmp(table->s->db.str, "mysql") ||
strcmp(table->s->table_name.str, "event"));
} }
} }
......
...@@ -2602,7 +2602,7 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, ...@@ -2602,7 +2602,7 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype,
moving back and forth between using RBR for replication of moving back and forth between using RBR for replication of
system tables and not using it. system tables and not using it.
Make sure to change in check_table_current_stmt_binlog_row_based according Make sure to change in check_table_binlog_row_based() according
to how you treat this. to how you treat this.
*/ */
case THD::ROW_QUERY_TYPE: case THD::ROW_QUERY_TYPE:
......
...@@ -3144,8 +3144,8 @@ end_with_restore_list: ...@@ -3144,8 +3144,8 @@ end_with_restore_list:
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error(); // No binlog error generated thd->clear_error(); // No binlog error generated
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::STMT_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, 0, FALSE);
} }
} }
select_lex->table_list.first= (byte*) first_table; select_lex->table_list.first= (byte*) first_table;
...@@ -3178,8 +3178,8 @@ end_with_restore_list: ...@@ -3178,8 +3178,8 @@ end_with_restore_list:
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error(); // No binlog error generated thd->clear_error(); // No binlog error generated
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::STMT_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, 0, FALSE);
} }
} }
select_lex->table_list.first= (byte*) first_table; select_lex->table_list.first= (byte*) first_table;
...@@ -3203,8 +3203,8 @@ end_with_restore_list: ...@@ -3203,8 +3203,8 @@ end_with_restore_list:
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error(); // No binlog error generated thd->clear_error(); // No binlog error generated
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::STMT_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, 0, FALSE);
} }
} }
select_lex->table_list.first= (byte*) first_table; select_lex->table_list.first= (byte*) first_table;
...@@ -3861,10 +3861,8 @@ end_with_restore_list: ...@@ -3861,10 +3861,8 @@ end_with_restore_list:
if (!(res= mysql_create_user(thd, lex->users_list))) if (!(res= mysql_create_user(thd, lex->users_list)))
{ {
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{
thd->binlog_query(THD::MYSQL_QUERY_TYPE, thd->binlog_query(THD::MYSQL_QUERY_TYPE,
thd->query, thd->query_length, FALSE, FALSE); thd->query, thd->query_length, FALSE, FALSE);
}
send_ok(thd); send_ok(thd);
} }
break; break;
...@@ -4054,8 +4052,8 @@ end_with_restore_list: ...@@ -4054,8 +4052,8 @@ end_with_restore_list:
{ {
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); thd->binlog_query(THD::STMT_QUERY_TYPE,
mysql_bin_log.write(&qinfo); thd->query, thd->query_length, 0, FALSE);
} }
} }
send_ok(thd); send_ok(thd);
......
...@@ -146,6 +146,8 @@ TABLE_SHARE *alloc_table_share(TABLE_LIST *table_list, char *key, ...@@ -146,6 +146,8 @@ TABLE_SHARE *alloc_table_share(TABLE_LIST *table_list, char *key,
under the protection of the LOCK_open mutex. under the protection of the LOCK_open mutex.
*/ */
share->table_map_id= ~0UL; share->table_map_id= ~0UL;
share->cached_row_logging_check= -1;
#endif #endif
memcpy((char*) &share->mem_root, (char*) &mem_root, sizeof(mem_root)); memcpy((char*) &share->mem_root, (char*) &mem_root, sizeof(mem_root));
...@@ -205,6 +207,7 @@ void init_tmp_table_share(TABLE_SHARE *share, const char *key, ...@@ -205,6 +207,7 @@ void init_tmp_table_share(TABLE_SHARE *share, const char *key,
*/ */
share->table_map_version= ~(ulonglong)0; share->table_map_version= ~(ulonglong)0;
share->table_map_id= ~0UL; share->table_map_id= ~0UL;
share->cached_row_logging_check= -1;
#endif #endif
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
......
...@@ -191,6 +191,15 @@ typedef struct st_table_share ...@@ -191,6 +191,15 @@ typedef struct st_table_share
bool waiting_on_cond; /* Protection against free */ bool waiting_on_cond; /* Protection against free */
ulong table_map_id; /* for row-based replication */ ulong table_map_id; /* for row-based replication */
ulonglong table_map_version; ulonglong table_map_version;
/*
Cache for row-based replication table share checks that does not
need to be repeated. Possible values are: -1 when cache value is
not calculated yet, 0 when table *shall not* be replicated, 1 when
table *may* be replicated.
*/
int cached_row_logging_check;
/* /*
TRUE if this is a system table like 'mysql.proc', which we want to be TRUE if this is a system table like 'mysql.proc', which we want to be
able to open and lock even when we already have some tables open and able to open and lock even when we already have some tables open and
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment