Below is the list of changes that have just been committed into a local
5.1 repository of mats. When mats does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2006-10-25 22:19:06+02:00, mats@romeo.(none) +5 -0
BUG#18581 (Creation of system tables recorded in binlog causing slave failure):
Not replicating the mysql database *at all* any more. All changes to
mysql tables are replicated by replicating the statements that do
the changes.
mysql-test/r/rpl_do_grant.result@stripped, 2006-10-25 22:19:00+02:00, mats@romeo.(none) +2 -0
Result change
mysql-test/t/rpl_do_grant.test@stripped, 2006-10-25 22:19:00+02:00, mats@romeo.(none) +5 -5
Deleting grants on both master and server since the mysql
database is not replicated any more.
sql/handler.cc@stripped, 2006-10-25 22:19:00+02:00, mats@romeo.(none) +6 -29
Removing code that selectively checks what tables in the mysql
database to ignore. The entire mysql database is not replicated
any more.
sql/log_event.cc@stripped, 2006-10-25 22:19:01+02:00, mats@romeo.(none) +2 -0
Disabling code to reload grants and access when certain tables are
touched.
sql/sql_class.cc@stripped, 2006-10-25 22:19:01+02:00, mats@romeo.(none) +6 -6
Mysql queries (i.e., queries that affects tables in the mysql database)
are now replicated by statement instead of replicating the tables in
the mysql database.
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: mats
# Host: romeo.(none)
# Root: /home/bk/b18581-mysql-5.1-new-rpl
--- 1.273/sql/handler.cc 2006-10-25 22:19:15 +02:00
+++ 1.274/sql/handler.cc 2006-10-25 22:19:15 +02:00
@@ -3456,38 +3456,15 @@
declared static, but it works by putting it into an anonymous
namespace. */
namespace {
- struct st_table_data {
- char const *db;
- char const *name;
- };
-
- static 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;
+ {
+ 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->s->cached_row_logging_check= check;
+ }
DBUG_ASSERT(table->s->cached_row_logging_check == 0 ||
table->s->cached_row_logging_check == 1);
--- 1.246/sql/log_event.cc 2006-10-25 22:19:15 +02:00
+++ 1.247/sql/log_event.cc 2006-10-25 22:19:15 +02:00
@@ -5694,7 +5694,9 @@
for (ptr= rli->tables_to_lock ; ptr ; ptr= ptr->next_global)
{
rli->m_table_map.set_table(ptr->table_id, ptr->table);
+#if 0
rli->touching_table(ptr->db, ptr->table_name, ptr->table_id);
+#endif
}
#ifdef HAVE_QUERY_CACHE
query_cache.invalidate_locked_for_write(rli->tables_to_lock);
--- 1.293/sql/sql_class.cc 2006-10-25 22:19:15 +02:00
+++ 1.294/sql/sql_class.cc 2006-10-25 22:19:15 +02:00
@@ -2778,6 +2778,12 @@
#endif /*HAVE_ROW_BASED_REPLICATION*/
switch (qtype) {
+ case THD::ROW_QUERY_TYPE:
+#ifdef HAVE_ROW_BASED_REPLICATION
+ if (current_stmt_binlog_row_based)
+ DBUG_RETURN(0);
+#endif
+ /* Otherwise, we fall through */
case THD::MYSQL_QUERY_TYPE:
/*
Using this query type is a conveniece hack, since we have been
@@ -2787,12 +2793,6 @@
Make sure to change in check_table_binlog_row_based() according
to how you treat this.
*/
- case THD::ROW_QUERY_TYPE:
-#ifdef HAVE_ROW_BASED_REPLICATION
- if (current_stmt_binlog_row_based)
- DBUG_RETURN(0);
-#endif
- /* Otherwise, we fall through */
case THD::STMT_QUERY_TYPE:
/*
The MYSQL_LOG::write() function will set the STMT_END_F flag and
--- 1.5/mysql-test/r/rpl_do_grant.result 2006-10-25 22:19:15 +02:00
+++ 1.6/mysql-test/r/rpl_do_grant.result 2006-10-25 22:19:15 +02:00
@@ -23,6 +23,8 @@
delete from mysql.user where user=_binary'rpl_do_grant';
delete from mysql.db where user=_binary'rpl_do_grant';
flush privileges;
+delete from mysql.user where user=_binary'rpl_do_grant';
+delete from mysql.db where user=_binary'rpl_do_grant';
flush privileges;
show grants for rpl_do_grant@localhost;
ERROR 42000: There is no such grant defined for user 'rpl_do_grant' on host 'localhost'
--- 1.6/mysql-test/t/rpl_do_grant.test 2006-10-25 22:19:15 +02:00
+++ 1.7/mysql-test/t/rpl_do_grant.test 2006-10-25 22:19:15 +02:00
@@ -39,11 +39,11 @@
delete from mysql.user where user=_binary'rpl_do_grant';
delete from mysql.db where user=_binary'rpl_do_grant';
flush privileges;
-save_master_pos;
-connection slave;
-sync_with_master;
-# no need to delete manually, as the DELETEs must have done some real job on
-# master (updated binlog)
+sync_slave_with_master;
+# The mysql database is not replicated, so we have to do the deletes
+# manually on the slave as well.
+delete from mysql.user where user=_binary'rpl_do_grant';
+delete from mysql.db where user=_binary'rpl_do_grant';
flush privileges;
# End of 4.1 tests
| Thread |
|---|
| • bk commit into 5.1 tree (mats:1.2310) BUG#18581 | Mats Kindahl | 25 Oct |