Two additional notes:

1.  Using the "replicate-wild-ignore-table" option in my.cnf produces the
same results.

2.  If the my.cnf "replicate-ignore-table=db.log" setting on the master  is
removed and mysql restarted so "db.log" is no longer ignored in replication,
this bug goes away and correct results are reported on the slave.

-Hank Eskin


On Wed, Jun 15, 2011 at 4:38 PM, Hank <hes...@gmail.com> wrote:

>
> This is a follow-up to my previous post.  I have been narrowing down what
> is causing this bug.  It is a timing issue of a replication ignored table
> with an auto-increment primary key values leaking over into a non-ignored
> table with inserts immediately after the ignore table has had rows inserted.
>
> Basically, data from the ignored table is corrupting a non-ignored table on
> the slave upon immediate inserts.
>
> Here is how to repeat:
>
> On a master issue:
>
> use db;
> drop table test;
> CREATE TABLE test (id int NOT NULL,   cnt int unsigned  NOT NULL
>  AUTO_INCREMENT,  PRIMARY KEY (id,cnt) ) ENGINE=MyISAM ;
> drop table log;
> CREATE TABLE log (id int unsigned NOT NULL AUTO_INCREMENT, log varchar(20),
>  PRIMARY KEY (id) ) ENGINE=MyISAM AUTO_INCREMENT = 44444;
>
> make sure those two tables are created on the slave through regular
> replication.
>
> on slave>
>
> desc test;
> desc log;
>
> Once replicated, on the master, add the following line to the [mysqld]
> section of my.cnf, and then restart mysql.
>
>          replicate-ignore-table=db.log
>
> The on the master, issue the following statements as a copy/paste of all of
> them at once.
> It's critical that the statements are executed in immediate succession (no
> delays)
>
> insert into log values (null,"info1");
> insert into log values (null,"info2");
> insert into log values (null,"info3");
> insert into log values (null,"info4");
> insert into test values (1,null);
> insert into log values (null,"info5");
> insert into test values (1,null);
> insert into log values (null,"info6");
> insert into test values (2,null);
> insert into log values (null,"info7");
> insert into test values (2,null);
> insert into log values (null,"info8");
>
> Here are the results from the master (all correct):
>
> master>select * from log;
> +-------+-------+
> | id    | log   |
> +-------+-------+
> | 44444 | info1 |
> | 44445 | info2 |
> | 44446 | info3 |
> | 44447 | info4 |
> | 44448 | info5 |
> | 44449 | info6 |
> | 44450 | info7 |
> | 44451 | info8 |
> +-------+-------+
> master>select * from test;
> +----+-----+
> | id | cnt |
> +----+-----+
> |  1 |   1 |
> |  1 |   2 |
> |  2 |   1 |
> |  2 |   2 |
> +----+-----+
> Here are the results from the slave:
>
> slave>select * from log;
>
> Empty set (0.00 sec)  <--- as expected, since it is ignored
>
> slave>select * from test;
> +----+-------+
> | id | cnt   |
> +----+-------+
> |  1 | 44447 |   <-- should be "1", but has values from "log" on the master
> |  1 | 44448 |   <-- should be "2"
> |  2 | 44449 |   <-- should be "1"
> |  2 | 44450 |   <-- should be "2"
> +----+-------+
>
> If there is the slightest delay between the inserts into "log" and "test",
> the replication happens correctly.
>
> Thoughts?
>
> -Hank Eskin
>

Reply via email to