• Marko Mäkelä's avatar
    MDEV-29440 InnoDB instant ALTER TABLE recovery must use READ UNCOMMITTED · d2e649ae
    Marko Mäkelä authored
    In commit 8f8ba758 (MDEV-27234)
    the data dictionary recovery was changed to use READ COMMITTED
    so that table-rebuild operations (OPTIMIZE TABLE, TRUNCATE TABLE,
    some forms of ALTER TABLE) would be recovered correctly.
    
    However, for operations that avoid a table rebuild thanks to
    being able to instantly ADD, DROP or reorder columns, recovery
    must use the READ UNCOMMITTED isolation level so that changes to
    the hidden metadata record can be rolled back.
    
    We will detect instant operations by detecting uncommitted changes
    to SYS_COLUMNS in case there is no uncommitted change of SYS_TABLES.ID
    for the table. In any table-rebuilding DDL operation, the SYS_TABLES.ID
    (and likely also the table name) will be updated.
    
    As part of rolling back the instant ALTER TABLE operation, after the
    operation on the hidden metadata record has been rolled back, a rollback
    of an INSERT into SYS_COLUMNS in row_undo_ins_remove_clust_rec() will
    invoke trx_t::evict_table() to discard the READ UNCOMMITTED definition
    of the table. After that, subsequent recovery steps will load and use
    the correct table definition.
    
    Reviewed by: Thirunarayanan Balathandayuthapani
    Tested by: Matthias Leich
    d2e649ae
row0mysql.cc 85.1 KB