• Marko Mäkelä's avatar
    MDEV-14717 RENAME TABLE in InnoDB is not crash-safe · cf2a4426
    Marko Mäkelä authored
    This is a backport of commit 0bc36758
    and commit 9eb3fcc9.
    
    InnoDB in MariaDB 10.2 appears to only write MLOG_FILE_RENAME2
    redo log records during table-rebuilding ALGORITHM=INPLACE operations.
    We must write the records for any .ibd file renames, so that the
    operations are crash-safe.
    
    If InnoDB is killed during a RENAME TABLE operation, it can happen that
    the transaction for updating the data dictionary will be rolled back.
    But, nothing will roll back the renaming of the .ibd file
    (the MLOG_FILE_RENAME2 only guarantees roll-forward), or for that matter,
    the renaming of the dict_table_t::name in the dict_sys cache. We introduce
    the undo log record TRX_UNDO_RENAME_TABLE to fix this.
    
    fil_space_for_table_exists_in_mem(): Remove the parameters
    adjust_space, table_id and some code that was trying to work around
    these deficiencies.
    
    fil_name_write_rename(): Write a MLOG_FILE_RENAME2 record.
    
    dict_table_rename_in_cache(): Invoke fil_name_write_rename().
    
    trx_undo_rec_copy(): Set the first 2 bytes to the length of the
    copied undo log record.
    
    trx_undo_page_report_rename(), trx_undo_report_rename():
    Write a TRX_UNDO_RENAME_TABLE record with the old table name.
    
    row_rename_table_for_mysql(): Invoke trx_undo_report_rename()
    before modifying any data dictionary tables.
    
    row_undo_ins_parse_undo_rec(): Roll back TRX_UNDO_RENAME_TABLE
    by invoking dict_table_rename_in_cache(), which will take care
    of both renaming the table and the file.
    
    ha_innobase::truncate(): Remove a work-around.
    cf2a4426
trx0roll.cc 32.4 KB