• Michael Widenius's avatar
    Replication changes for CREATE OR REPLACE TABLE · 5426facd
    Michael Widenius authored
    - CREATE TABLE is by default executed on the slave as CREATE OR REPLACE
    - DROP TABLE is by default executed on the slave as DROP TABLE IF NOT EXISTS
    
    This means that a slave will by default continue even if we try to create
    a table that existed on the slave (the table will be deleted and re-created) or
    if we try to drop a table that didn't exist on the slave.
    This should be safe as instead of having the slave stop because of an inconsistency between
    master and slave, it will fix the inconsistency.
    Those that would prefer to get a stopped slave instead for the above cases can set slave_ddl_exec_mode to STRICT. 
    
    - Ensure that a CREATE OR REPLACE TABLE which dropped a table is replicated
    - DROP TABLE that generated an error on master is handled as an identical DROP TABLE on the slave (IF NOT EXISTS is not added in this case)
    - Added slave_ddl_exec_mode variable to decide how DDL's are replicated
    
    New logic for handling BEGIN GTID ... COMMIT from the binary log:
    
    - When we find a BEGIN GTID, we start a transaction and set OPTION_GTID_BEGIN
    - When we find COMMIT, we reset OPTION_GTID_BEGIN and execute the normal COMMIT code.
    - While OPTION_GTID_BEGIN is set:
      - We don't generate implict commits before or after statements
      - All tables are regarded as transactional tables in the binary log (to ensure things are executed exactly as on the master)
    - We reset OPTION_GTID_BEGIN also on rollback
    
    This will help ensuring that we don't get any sporadic commits (and thus new GTID's) on the slave and will help keep the GTID's between master and slave in sync.
    
    
    mysql-test/extra/rpl_tests/rpl_log.test:
      Added testing of mode slave_ddl_exec_mode=STRICT
    mysql-test/r/mysqld--help.result:
      New help messages
    mysql-test/suite/rpl/r/create_or_replace_mix.result:
      Testing of CREATE OR REPLACE TABLE with replication
    mysql-test/suite/rpl/r/create_or_replace_row.result:
      Testing of CREATE OR REPLACE TABLE with replication
    mysql-test/suite/rpl/r/create_or_replace_statement.result:
      Testing replication of create or replace
    mysql-test/suite/rpl/r/rpl_gtid_startpos.result:
      Test must be run in slave_ddl_exec_mode=STRICT as part of the test depends on that DROP TABLE should fail on slave.
    mysql-test/suite/rpl/r/rpl_row_log.result:
      Updated result
    mysql-test/suite/rpl/r/rpl_row_log_innodb.result:
      Updated result
    mysql-test/suite/rpl/r/rpl_row_show_relaylog_events.result:
      Updated result
    mysql-test/suite/rpl/r/rpl_stm_log.result:
      Updated result
    mysql-test/suite/rpl/r/rpl_stm_mix_show_relaylog_events.result:
      Updated result
    mysql-test/suite/rpl/r/rpl_temp_table_mix_row.result:
      Updated result
    mysql-test/suite/rpl/t/create_or_replace.inc:
      Testing of CREATE OR REPLACE TABLE with replication
    mysql-test/suite/rpl/t/create_or_replace_mix.cnf:
      Testing of CREATE OR REPLACE TABLE with replication
    mysql-test/suite/rpl/t/create_or_replace_mix.test:
      Testing of CREATE OR REPLACE TABLE with replication
    mysql-test/suite/rpl/t/create_or_replace_row.cnf:
      Testing of CREATE OR REPLACE TABLE with replication
    mysql-test/suite/rpl/t/create_or_replace_row.test:
      Testing of CREATE OR REPLACE TABLE with replication
    mysql-test/suite/rpl/t/create_or_replace_statement.cnf:
      Testing of CREATE OR REPLACE TABLE with replication
    mysql-test/suite/rpl/t/create_or_replace_statement.test:
      Testing of CREATE OR REPLACE TABLE with replication
    mysql-test/suite/rpl/t/rpl_gtid_startpos.test:
      Test must be run in slave_ddl_exec_mode=STRICT as part of the test depends on that DROP TABLE should fail on slave.
    mysql-test/suite/rpl/t/rpl_stm_log.test:
      Removed some lines
    mysql-test/suite/sys_vars/r/slave_ddl_exec_mode_basic.result:
      Testing of slave_ddl_exec_mode
    mysql-test/suite/sys_vars/t/slave_ddl_exec_mode_basic.test:
      Testing of slave_ddl_exec_mode
    sql/handler.cc:
      Regard all tables as transactional in commit if OPTION_GTID_BEGIN is set.
      This is to ensure that statments are not commited too early if non transactional tables are used.
    sql/log.cc:
      Regard all tables as transactional in commit if OPTION_GTID_BEGIN is set.
      Also treat 'direct' log events as transactional (to get them logged as they where on the master)
    sql/log_event.cc:
      Ensure that the new error from DROP TABLE when trying to drop a view is treated same as the old one.
      Store error code that slave expects in THD.
      Set OPTION_GTID_BEGIN if we find a BEGIN.
      Reset OPTION_GTID_BEGIN if we find a COMMIT.
    sql/mysqld.cc:
      Added slave_ddl_exec_mode_options
    sql/mysqld.h:
      Added slave_ddl_exec_mode_options
    sql/rpl_gtid.cc:
      Reset OPTION_GTID_BEGIN if we record a gtid (safety)
    sql/sql_class.cc:
      Regard all tables as transactional in commit if OPTION_GTID_BEGIN is set.
    sql/sql_class.h:
      Added to THD: log_current_statement and slave_expected_error
    sql/sql_insert.cc:
      Ensure that CREATE OR REPLACE is logged if table was deleted.
      Don't do implicit commit for CREATE if we are under OPTION_GTID_BEGIN
    sql/sql_parse.cc:
      Change CREATE TABLE -> CREATE OR REPLACE TABLE for slaves
      Change DROP TABLE -> DROP TABLE IF EXISTS for slaves
      CREATE TABLE doesn't force implicit commit in case of OPTION_GTID_BEGIN
      Don't do commits before or after any statement if OPTION_GTID_BEGIN was set.
    sql/sql_priv.h:
      Added OPTION_GTID_BEGIN
    sql/sql_show.cc:
      Enhanced store_create_info() to also be able to handle CREATE OR REPLACE
    sql/sql_show.h:
      Updated prototype
    sql/sql_table.cc:
      Ensure that CREATE OR REPLACE is logged if table was deleted.
    sql/sys_vars.cc:
      Added slave_ddl_exec_mode
    sql/transaction.cc:
      Added warning if we got a GTID under OPTION_GTID_BEGIN
    5426facd
log.cc 281 KB