DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(mysql.info) replication-rules

Info Catalog (mysql.info) replication-options (mysql.info) replication (mysql.info) replication-faq
 
 6.9 How Servers Evaluate Replication Rules
 ==========================================
 
 If a master server does not write a statement to its binary log, the
 statement is not replicated. If the server does log the statement, the
 statement is sent to all slaves and each slave determines whether to
 execute it or ignore it.
 
 On the master side, decisions about which statements to log are based
 on the -binlog-do-db and -binlog-ignore-db options that control binary
 logging. For a description of the rules that servers use in evaluating
 these options, see  binary-log.
 
 On the slave side, decisions about whether to execute or ignore
 statements received from the master are made according to the
 -replicate-* options that the slave was started with. (See 
 replication-options.) The slave evaluates these options using the
 following procedure, which first checks the database-level options and
 then the table-level options.
 
 In the simplest case, when there are no -replicate-* options, the
 procedure yields the result that the slave executes all statements that
 it receives from the master. Otherwise, the result depends on the
 particular options given. In general, to make it easier to determine
 what effect an option set will have, it is recommended that you avoid
 mixing `do' and `ignore' options, or wildcard and non-wildcard options.
 
 *Stage 1. Check the database options.*
 
 The slave performs the following test At this stage, the slave checks
 whether there are any -replicate-do-db or -replicate-ignore-db options
 that specify database-specific conditions:
 
    * _No_: Permit the statement and proceed to the table-checking stage.
 
    * _Yes_: Test the options using the same rules as for the
      -binlog-do-db and -binlog-ignore-db options to determine whether
      to permit or ignore the statement. What is the result of the test?
 
         * _Permit_: Do not execute the statement immediately. Defer the
           decision and proceed to the table-checking stage.
 
         * _Ignore_: Ignore the statement and exit.
 
 This stage can permit a statement for further option-checking, or cause
 it to be ignored. However, statements that are permitted at this stage
 are not actually executed yet. Instead, they pass to the following
 stage that checks the table options.
 
 *Stage 2. Check the table options.*
 
 First, as a preliminary condition, the slave checks whether the
 statement occurs within a stored function or (prior to MySQL 5.0.12) a
 stored procedure. If so, execute the statement and exit.  (Stored
 procedures are exempt from this test as of MySQL 5.0.12 because
 procedure logging occurs at the level of statements that are executed
 within the routine rather than at the `CALL' level.)
 
 Next, the slave checks for table options and evaluates them. If the
 server reaches this point, it executes all statements if there are no
 table options. If there are `do' table options, the statement must
 match one of them if it is to be executed; otherwise, it is ignored. If
 there are any `ignore' options, all statements are executed except
 those that match any `ignore' option. The following steps describe how
 this evaluation occurs in more detail.
 
   1. Are there any -replicate-*-table options?
 
         * _No_: There are no table restrictions, so all statements
           match. Execute the statement and exit.
 
         * _Yes_: There are table restrictions.  Evaluate the tables to
           be updated against them. There might be multiple tables to
           update, so loop through the following steps for each table
           looking for a matching option (first the non-wild options,
           and then the wild options). Only tables that are to be
           updated are compared to the options. For example, if the
           statement is `INSERT INTO sales SELECT * FROM prices', only
           `sales' is compared to the options).  If several tables are
           to be updated (multiple-table statement), the first table
           that matches `do' or `ignore' wins. That is, the server checks
           the first table against the options. If no decision could be
           made, it checks the second table against the options, and so
           on.
 
   2. Are there any -replicate-do-table options?
 
         * _No_: Proceed to the next step.
 
         * _Yes_: Does the table match any of them?
 
              * _No_: Proceed to the next step.
 
              * _Yes_: Execute the statement and exit.
 
   3. Are there any -replicate-ignore-table options?
 
         * _No_: Proceed to the next step.
 
         * _Yes_: Does the table match any of them?
 
              * _No_: Proceed to the next step.
 
              * _Yes_: Ignore the statement and exit.
 
   4. Are there any -replicate-wild-do-table options?
 
         * _No_: Proceed to the next step.
 
         * _Yes_: Does the table match any of them?
 
              * _No_: Proceed to the next step.
 
              * _Yes_: Execute the statement and exit.
 
   5. Are there any -replicate-wild-ignore-table options?
 
         * _No_: Proceed to the next step.
 
         * _Yes_: Does the table match any of them?
 
              * _No_: Proceed to the next step.
 
              * _Yes_: Ignore the statement and exit.
 
   6. No -replicate-*-table option was matched. Is there another table
      to test against these options?
 
         * _No_: We have now tested all tables to be updated and could
           not match any option. Are there -replicate-do-table or
           -replicate-wild-do-table options?
 
              * _No_: There were no `do' table options, so no explicit
                `do' match is required. Execute the statement and exit.
 
              * _Yes_: There were `do' table options, so the statement
                is executed only with an explicit match to one of them.
                Ignore the statement and exit.
 
         * _Yes_: Loop.
 
 Examples:
 
    * No -replicate-* options at all
 
      The slave executes all statements that it receives from the master.
 
    * -replicate-*-db options, but no table options
 
      The slave permits or ignores statements using the database
      options. Then it executes all statements permitted by those
      options because there are no table restrictions.
 
    * -replicate-*-table options, but no database options
 
      All statements are permitted at the database-checking stage
      because there are no database conditions. The slave executes or
      ignores statements based on the table options.
 
    * A mix of database and table options
 
      The slave permits or ignores statements using the database
      options. Then it evaluates all statements permitted by those
      options according to the table options. In some cases, this
      process can yield what might seem a counterintuitive result.
      Consider the following set of options:
 
           [mysqld]
           replicate-do-db    = db1
           replicate-do-table = db2.mytbl2
 
      Suppose that `db1' is the default database and the slave receives
      this statement:
 
           INSERT INTO mytbl1 VALUES(1,2,3);
 
      The database is `db1', which matches the -replicate-do-db option
      at the database-checking stage. The algorithm then proceeds to the
      table-checking stage. If there were no table options, the
      statement would be executed. However, because the options include
      a `do' table option, the statement must match if it is to be
      executed. The statement does not match, so it is ignored. (The
      same would happen for any table in `db1'.)
 
Info Catalog (mysql.info) replication-options (mysql.info) replication (mysql.info) replication-faq
automatically generated byinfo2html