• Marko Mäkelä's avatar
    MDEV-11415 Remove excessive undo logging during ALTER TABLE…ALGORITHM=COPY · 0ba6aaf0
    Marko Mäkelä authored
    If a crash occurs during ALTER TABLE…ALGORITHM=COPY, InnoDB would spend
    a lot of time rolling back writes to the intermediate copy of the table.
    To reduce the amount of busy work done, a work-around was introduced in
    commit fd069e2b in MySQL 4.1.8 and 5.0.2,
    to commit the transaction after every 10,000 inserted rows.
    
    A proper fix would have been to disable the undo logging altogether and
    to simply drop the intermediate copy of the table on subsequent server
    startup. This is what happens in MariaDB 10.3 with MDEV-14717,MDEV-14585.
    In MariaDB 10.2, the intermediate copy of the table would be left behind
    with a name starting with the string #sql.
    
    This is a backport of a bug fix from MySQL 8.0.0 to MariaDB,
    contributed by jixianliang <271365745@qq.com>.
    
    Unlike recent MySQL, MariaDB supports ALTER IGNORE. For that operation
    InnoDB must for now keep the undo logging enabled, so that the latest
    row can be rolled back in case of an error.
    
    In Galera cluster, the LOAD DATA statement will retain the existing
    behaviour and commit the transaction after every 10,000 rows if
    the parameter wsrep_load_data_splitting=ON is set. The logic to do
    so (the wsrep_load_data_split() function and the call
    handler::extra(HA_EXTRA_FAKE_START_STMT)) are joint work
    by Ji Xianliang and Marko Mäkelä.
    
    The original fix:
    
    Author: Thirunarayanan Balathandayuthapani <thirunarayanan.balathandayuth@oracle.com>
    Date:   Wed Dec 2 16:09:15 2015 +0530
    
    Bug#17479594 AVOID INTERMEDIATE COMMIT WHILE DOING ALTER TABLE ALGORITHM=COPY
    
    Problem:
    
    During ALTER TABLE, we commit and restart the transaction for every
    10,000 rows, so that the rollback after recovery would not take so long.
    
    Fix:
    
    Suppress the undo logging during copy alter operation. If fts_index is
    present then insert directly into fts auxiliary table rather
    than doing at commit time.
    
    ha_innobase::num_write_row: Remove the variable.
    
    ha_innobase::write_row(): Remove the hack for committing every 10000 rows.
    
    row_lock_table_for_mysql(): Remove the extra 2 parameters.
    
    lock_get_src_table(), lock_is_table_exclusive(): Remove.
    Reviewed-by: default avatarMarko Mäkelä <marko.makela@oracle.com>
    Reviewed-by: default avatarShaohua Wang <shaohua.wang@oracle.com>
    Reviewed-by: default avatarJon Olav Hauglid <jon.hauglid@oracle.com>
    0ba6aaf0
row0uins.cc 14.8 KB