diff options
author | unknown <mats@mysql.com> | 2006-03-17 18:11:07 +0100 |
---|---|---|
committer | unknown <mats@mysql.com> | 2006-03-17 18:11:07 +0100 |
commit | 604e0535d770d5608a492d04d3b0255bfb929287 (patch) | |
tree | 10f2655ceef6f6a77c1daf4ef95e28fc10c39efe | |
parent | 2d360cd035849ad678253be7f0d0f559ebe1898d (diff) | |
download | mariadb-git-604e0535d770d5608a492d04d3b0255bfb929287.tar.gz |
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.
mysql-test/r/binlog_row_drop_tmp_tbl.result:
Result change
mysql-test/r/rpl_row_log.result:
Result change
mysql-test/r/rpl_row_log_innodb.result:
Result change
mysql-test/r/rpl_row_max_relay_size.result:
Result change
sql/handler.cc:
Refactoring code to support filtering many tables.
Filtering out mysql.general_log and mysql.slow_log from binary log.
Caching result from table share-specific tests.
sql/sql_class.cc:
Correcting comment
sql/sql_parse.cc:
Using binlog_query() instead of constructing Query_log_events
sql/table.cc:
Adding variable to cache table check parts for row-based logging.
sql/table.h:
Adding variable to cache table check parts for row-based logging.
-rw-r--r-- | mysql-test/r/binlog_row_drop_tmp_tbl.result | 2 | ||||
-rw-r--r-- | mysql-test/r/rpl_row_log.result | 10 | ||||
-rw-r--r-- | mysql-test/r/rpl_row_log_innodb.result | 10 | ||||
-rw-r--r-- | mysql-test/r/rpl_row_max_relay_size.result | 2 | ||||
-rw-r--r-- | sql/handler.cc | 39 | ||||
-rw-r--r-- | sql/sql_class.cc | 2 | ||||
-rw-r--r-- | sql/sql_parse.cc | 18 | ||||
-rw-r--r-- | sql/table.cc | 3 | ||||
-rw-r--r-- | sql/table.h | 9 |
9 files changed, 63 insertions, 32 deletions
diff --git a/mysql-test/r/binlog_row_drop_tmp_tbl.result b/mysql-test/r/binlog_row_drop_tmp_tbl.result index 771bc5f5e44..2b09fe069e3 100644 --- a/mysql-test/r/binlog_row_drop_tmp_tbl.result +++ b/mysql-test/r/binlog_row_drop_tmp_tbl.result @@ -14,7 +14,5 @@ get_lock("a",10) show binlog events; 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 # 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` drop database `drop-temp+table-test`; diff --git a/mysql-test/r/rpl_row_log.result b/mysql-test/r/rpl_row_log.result index c40efaaf952..12b573b8bf6 100644 --- a/mysql-test/r/rpl_row_log.result +++ b/mysql-test/r/rpl_row_log.result @@ -57,8 +57,6 @@ master-bin.000001 # Rotate 1 # master-bin.000002;pos=4 show binlog events in 'master-bin.000002'; 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 # 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 t2 (n int)ENGINE=MyISAM 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 show binary logs; Log_name File_size master-bin.000001 1256 -master-bin.000002 483 +master-bin.000002 373 start slave; show binary logs; Log_name File_size slave-bin.000001 1354 -slave-bin.000002 384 +slave-bin.000002 274 show binlog events in 'slave-bin.000001' from 4; Log_name Pos Event_type Server_id End_log_pos Info 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 show binlog events in 'slave-bin.000002' from 4; 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 # 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 # Table_map 1 # table_id: # (test.t2) slave-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F 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 -# 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; ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log DROP TABLE t1; diff --git a/mysql-test/r/rpl_row_log_innodb.result b/mysql-test/r/rpl_row_log_innodb.result index fa0de780095..48c79c9ab11 100644 --- a/mysql-test/r/rpl_row_log_innodb.result +++ b/mysql-test/r/rpl_row_log_innodb.result @@ -61,8 +61,6 @@ master-bin.000001 # Rotate 1 # master-bin.000002;pos=4 show binlog events in 'master-bin.000002'; 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 # 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 t2 (n int)ENGINE=InnoDB master-bin.000002 # Table_map 1 # table_id: # (test.t2) @@ -71,12 +69,12 @@ master-bin.000002 # Xid 1 # COMMIT /* XID */ show binary logs; Log_name File_size master-bin.000001 1310 -master-bin.000002 510 +master-bin.000002 400 start slave; show binary logs; Log_name File_size slave-bin.000001 1408 -slave-bin.000002 411 +slave-bin.000002 301 show binlog events in 'slave-bin.000001' from 4; Log_name Pos Event_type Server_id End_log_pos Info 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 show binlog events in 'slave-bin.000002' from 4; 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 # 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 # Table_map 1 # table_id: # (test.t2) slave-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F slave-bin.000002 # Xid 1 # COMMIT /* XID */ 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 -# 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; ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log DROP TABLE t1; diff --git a/mysql-test/r/rpl_row_max_relay_size.result b/mysql-test/r/rpl_row_max_relay_size.result index b7afe0b0515..6146d623ec5 100644 --- a/mysql-test/r/rpl_row_max_relay_size.result +++ b/mysql-test/r/rpl_row_max_relay_size.result @@ -58,4 +58,4 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File flush logs; show master status; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000002 212 <Binlog_Ignore_DB> +master-bin.000002 102 <Binlog_Ignore_DB> diff --git a/sql/handler.cc b/sql/handler.cc index 76c3ebd3387..7b232f343c0 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -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 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) { + 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 thd->current_stmt_binlog_row_based && thd && (thd->options & OPTION_BIN_LOG) && - (table->s->tmp_table == NO_TMP_TABLE) && mysql_bin_log.is_open() && - binlog_filter->db_ok(table->s->db.str) && - (strcmp(table->s->db.str, "mysql") || - strcmp(table->s->table_name.str, "event")); + table->s->cached_row_logging_check; } } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index f656f03ddc2..ee0f4e8ad1f 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -2602,7 +2602,7 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, moving back and forth between using RBR for replication of 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. */ case THD::ROW_QUERY_TYPE: diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 871c8bdff9f..386cff9f772 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3144,8 +3144,8 @@ end_with_restore_list: if (mysql_bin_log.is_open()) { thd->clear_error(); // No binlog error generated - Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); - mysql_bin_log.write(&qinfo); + thd->binlog_query(THD::STMT_QUERY_TYPE, + thd->query, thd->query_length, 0, FALSE); } } select_lex->table_list.first= (byte*) first_table; @@ -3178,8 +3178,8 @@ end_with_restore_list: if (mysql_bin_log.is_open()) { thd->clear_error(); // No binlog error generated - Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); - mysql_bin_log.write(&qinfo); + thd->binlog_query(THD::STMT_QUERY_TYPE, + thd->query, thd->query_length, 0, FALSE); } } select_lex->table_list.first= (byte*) first_table; @@ -3203,8 +3203,8 @@ end_with_restore_list: if (mysql_bin_log.is_open()) { thd->clear_error(); // No binlog error generated - Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); - mysql_bin_log.write(&qinfo); + thd->binlog_query(THD::STMT_QUERY_TYPE, + thd->query, thd->query_length, 0, FALSE); } } select_lex->table_list.first= (byte*) first_table; @@ -3861,10 +3861,8 @@ end_with_restore_list: if (!(res= mysql_create_user(thd, lex->users_list))) { if (mysql_bin_log.is_open()) - { thd->binlog_query(THD::MYSQL_QUERY_TYPE, thd->query, thd->query_length, FALSE, FALSE); - } send_ok(thd); } break; @@ -4054,8 +4052,8 @@ end_with_restore_list: { if (mysql_bin_log.is_open()) { - Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE); - mysql_bin_log.write(&qinfo); + thd->binlog_query(THD::STMT_QUERY_TYPE, + thd->query, thd->query_length, 0, FALSE); } } send_ok(thd); diff --git a/sql/table.cc b/sql/table.cc index b7b235dc180..3cba2c163ea 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -146,6 +146,8 @@ TABLE_SHARE *alloc_table_share(TABLE_LIST *table_list, char *key, under the protection of the LOCK_open mutex. */ share->table_map_id= ~0UL; + share->cached_row_logging_check= -1; + #endif 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, */ share->table_map_version= ~(ulonglong)0; share->table_map_id= ~0UL; + share->cached_row_logging_check= -1; #endif DBUG_VOID_RETURN; diff --git a/sql/table.h b/sql/table.h index 688154dd8fc..736e4509cd8 100644 --- a/sql/table.h +++ b/sql/table.h @@ -191,6 +191,15 @@ typedef struct st_table_share bool waiting_on_cond; /* Protection against free */ ulong table_map_id; /* for row-based replication */ 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 able to open and lock even when we already have some tables open and |