Bug #46110 --replicate-wild-do-table invalidates --replicate-do-db matching rule

Submitted: 10 Jul 2009 11:21 Modified: 29 Nov 2010 19:33
Reporter: Luis Soares Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Replication Severity:S3 (Non-critical)
Version:5.1, 4.1, 5.0, azalea OS:Any
Assigned to: Luis Soares CPU Architecture:Any
Tags: replicate-do-db, replicate-wild-do-db, rpl filters

[10 Jul 2009 11:21] Luis Soares
Description:
When using --replicate-do-db and --replicate-wild-do-table
together the result may not be as expected. For instance, using
the slave options:

--replicate-do-db=dbx --replicate-wild-do-table=db%.t1

and then, issuing a 'CREATE DATABASE dbx' on master, the slave
will not create dbx.

From the manual (Section 16.4.3.2):

"The slave checks for and evaluates table options only if no
matching database options were found."

so I would expect the slave to replicate the create database.

Also, from the execution flow chart (Section 16.4.3.1), I see:
that if any --replicate-do-db rule exist AND match then execute
the "update" and exit. If not, then check replicate-ignore-db. If
no match in this last step, finally, proceed to table checking
rules.

I observed this on Linux with a 5.1-bugteam clone:
revno: 3017
revision-id: joro@sun.com-20090707125234-fe4my9xoq1fk7xj2
parent: v.narayanan@sun.com-20090709103406-6gpdkarw16dsmh05

How to repeat:
1. Test case: (place it, for instance, in suite/rpl/t/rpl_filter_bug.test)

-- source include/master-slave.inc

CREATE DATABASE dbx;

-- echo ### ON MASTER ### 
SHOW DATABASES;

-- sync_slave_with_master

-- echo ### ON SLAVE ### 
SHOW DATABASES;

-- connection master
-- echo ### ON MASTER ### 
DROP DATABASE dbx;

-- sync_slave_with_master

-- exit

2. Slave option file: (place it, for instance, in suite/rpl/t/rpl_filter_bug-slave.opt)

--replicate-do-db=dbx --replicate-wild-do-table=db%.t1

3. Run test case on MTR:

.../mysql-test$ ./mtr rpl.rpl_filter_bug

4. Notice that the absence of 'dbx' in the output of slave's SHOW DATABASES.

Suggested fix:
Make behavior consistent to manual description or document this.
[10 Jul 2009 12:47] Sveta Smirnova
Thank you for the report.

Verifeid as described. Workaround: don't use replicate-wild-do-table
[25 Aug 2009 11:16] Mats Kindahl
Could you please add the result of executing SHOW BINLOG EVENTS after execution of the CREATE DATABASE statement?
[25 Aug 2009 15:14] Sveta Smirnova
Output from version 5.1:

stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
CREATE DATABASE dbx;
### ON MASTER ### 
SHOW DATABASES;
Database
information_schema
dbx
mtr
mysql
test
SHOW BINLOG EVENTS;
Log_name        Pos     Event_type      Server_id       End_log_pos     Info
master-bin.000001       4       Format_desc     1       106     Server ver: 5.1.39-debug-log, Binlog ver: 4
master-bin.000001       106     Query   1       187     CREATE DATABASE dbx
### ON SLAVE ### 
SHOW DATABASES;
Database
information_schema
mtr
mysql
test
SHOW BINLOG EVENTS;
Log_name        Pos     Event_type      Server_id       End_log_pos     Info
slave-bin.000001        4       Format_desc     2       106     Server ver: 5.1.39-debug-log, Binlog ver: 4
### ON MASTER ### 
DROP DATABASE dbx;
[3 Sep 2010 9:20] Luis Soares
BUG#56362 has been marked as duplicate of this one.
[16 Sep 2010 14:04] Geert Vanderkelen
Just a note that bug #56362 (duplicate of this one) was verified using 5.1.50.
[20 Sep 2010 15:43] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/118618

3514 Luis Soares	2010-09-20
      BUG#46110: --replicate-wild-do-table invalidates 
                 --replicate-do-db matching rule
      
        When using --replicate-do-db and --replicate-ignore-db with
      --replicate-wild-do-table, some database level statements, eg
      DROP DATABASE or CREATE DATABASE, might not be replayed even if
      the DATABASE name was inline with the rules set in
      --replicate-do-db and/or --replicate-ignore-db. The following
      example would not replicate correctly:
      
        SLAVE, configured with: 
        --replicate-do-db=dbx --replicate-wild-do-table=db%.t1
      
        MASTER, dba issues:
        MASTER> CREATE DATABASE dbx;
      
        Although, at first sight, there is nothing in the filter rules
      that might prevent this statement to be replayed, the slave would
      not execute it. In fact, "replicate-wild-do-table=db%.t1" 
      invalidates the "OK" from "replicate-do-db=dbx", making the event
      to be skipped/filtered out.
      
        We fix this, by making --replicate-do/ignore-db rules take
      precedence over replicate-wild-do-table for *database* level
      statements only:
      
        - CREATE/DROP/ALTER DATABASE ...
      
        As such, when replicating such statements, we only look into
      replicate-wild-do-table if and only if replicate-do/ignore-db 
      rules are void. Otherwise, --replicate-do/ignore-db rules 
      dictate the fate of the statement: either filtered out or 
      executed.
[21 Sep 2010 10:18] Geert Vanderkelen
Yes, I think the last patch is the way forward. This is probably what people would expect anyway.
However, it is a behavior change which might make trouble where people rely on this not to work.

Probably not good putting in MySQL 5.1 or 5.5 ..
[30 Sep 2010 7:49] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/119484

3309 Luis Soares	2010-09-30
      BUG#46110: --replicate-wild-do-table invalidates 
                 --replicate-do-db matching rule
            
      When using --replicate-do-db and --replicate-ignore-db with
      --replicate-wild-do-table, some database level statements, eg
      DROP DATABASE or CREATE DATABASE, might not be replayed even if
      the DATABASE name was inline with the rules set in
      --replicate-do-db and/or --replicate-ignore-db. The following
      example would not replicate correctly:
            
        SLAVE, configured with: 
        --replicate-do-db=dbx --replicate-wild-do-table=db%.t1
            
        MASTER, dba issues:
        MASTER> CREATE DATABASE dbx;
            
      Although, at first sight, there is nothing in the filter rules
      that might prevent this statement to be replayed, the slave would
      not execute it. In fact, "replicate-wild-do-table=db%.t1" 
      invalidates the "OK" from "replicate-do-db=dbx", making the event
      to be skipped/filtered out.
            
      We fix this, by making --replicate-do/ignore-db rules take
      precedence over replicate-wild-do-table for *database* level
      statements only:
            
        - CREATE/DROP/ALTER DATABASE ...
            
      As such, when replicating such statements, we only look into
      replicate-wild-do-table if and only if replicate-do/ignore-db 
      rules are void. Otherwise, --replicate-do/ignore-db rules 
      dictate the fate of the statement: either filtered out or 
      executed.
[6 Oct 2010 12:15] Luis Soares
Queued in mysql-next-mr-bugfixing:
- http://pb2.norway.sun.com/web.py?template=push_details&push=1627475
[13 Nov 2010 16:15] Bugs System
Pushed into mysql-trunk 5.6.99-m5 (revid:alexander.nozdrin@oracle.com-20101113155825-czmva9kg4n31anmu) (version source revid:vasil.dimov@oracle.com-20100629074804-359l9m9gniauxr94) (merge vers: 5.6.99-m4) (pib:21)
[13 Nov 2010 16:41] Bugs System
Pushed into mysql-next-mr (revid:alexander.nozdrin@oracle.com-20101113160336-atmtmfb3mzm4pz4i) (version source revid:jimmy.yang@oracle.com-20100804103744-vbpeghipkz6pyc9z) (pib:21)
[29 Nov 2010 19:33] Jon Stephens
Documented bugfix as follows in the 5.6.1 changelog:

        When determining whether to replicate a CREATE DATABASE, DROP
        DATABASE, or ALTER DATABASE statement, database-level options
        now take precedence over any --replicate-do-wild-table options. 
        In other words, when trying to replicate one of these statements, 
        --replicate-do-wild options are now checked if and only if there 
        are no database-level options that apply to the statement.

Also updated replication-rules section to note example observed by Luís et al. in pre-5.6 versions and new behavior in 5.6 version. See http://lists.mysql.com/commits/125417 for additional docs info.

Closed.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.048 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.