• 技术文章 >数据库 >MySQL

    mysql InnoDB的崩溃恢复过程

    小妮浅浅小妮浅浅2021-10-25 09:52:03原创3819

    1、redo log操作:保证已提交事务影响的最新数据刷到数据页里。

    2、undo log操作:保证未提交事务影响的数据页回滚。

    3、写缓冲(change buffer)合并。

    4、purge操作。

    InnoDB的一种垃圾收集机制,使用单独的后台线程周期性处理索引中标记删除的数据。

    实例

    /* Look for MLOG_CHECKPOINT. */
    recv_group_scan_log_recs(group, &contiguous_lsn, false);
    /* The first scan should not have stored or applied any records. */
    ut_ad(recv_sys->n_addrs == 0);
    ut_ad(!recv_sys->found_corrupt_fs);
     
    if (recv_sys->found_corrupt_log && !srv_force_recovery) {
    log_mutex_exit();
    return(DB_ERROR);
    }
     
    if (recv_sys->mlog_checkpoint_lsn == 0) {
    if (!srv_read_only_mode
        && group->scanned_lsn != checkpoint_lsn) {
    ib::error() << "Ignoring the redo log due to missing"
    " MLOG_CHECKPOINT between the checkpoint "
    << checkpoint_lsn << " and the end "
    << group->scanned_lsn << ".";
    if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
    log_mutex_exit();
    return(DB_ERROR);
    }
    }
     
    group->scanned_lsn = checkpoint_lsn;
    rescan = false;
    } else {
    contiguous_lsn = checkpoint_lsn;
    rescan = recv_group_scan_log_recs(
    group, &contiguous_lsn, false);
     
    if ((recv_sys->found_corrupt_log && !srv_force_recovery)
        || recv_sys->found_corrupt_fs) {
    log_mutex_exit();
    return(DB_ERROR);
    }
    }
     
    /* NOTE: we always do a 'recovery' at startup, but only if
    there is something wrong we will print a message to the
    user about recovery: */
     
    if (checkpoint_lsn != flush_lsn) {
     
    if (checkpoint_lsn + SIZE_OF_MLOG_CHECKPOINT < flush_lsn) {
    ib::warn() << " Are you sure you are using the"
    " right ib_logfiles to start up the database?"
    " Log sequence number in the ib_logfiles is "
    << checkpoint_lsn << ", less than the"
    " log sequence number in the first system"
    " tablespace file header, " << flush_lsn << ".";
    }
     
    if (!recv_needed_recovery) {
     
    ib::info() << "The log sequence number " << flush_lsn
    << " in the system tablespace does not match"
    " the log sequence number " << checkpoint_lsn
    << " in the ib_logfiles!";
     
    if (srv_read_only_mode) {
    ib::error() << "Can't initiate database"
    " recovery, running in read-only-mode.";
    log_mutex_exit();
    return(DB_READ_ONLY);
    }
     
    recv_init_crash_recovery();
    }
    }
     
    log_sys->lsn = recv_sys->recovered_lsn;
     
    if (recv_needed_recovery) {
    err = recv_init_crash_recovery_spaces();
     
    if (err != DB_SUCCESS) {
    log_mutex_exit();
    return(err);
    }
     
    if (rescan) {
    contiguous_lsn = checkpoint_lsn;
    recv_group_scan_log_recs(group, &contiguous_lsn, true);
     
    if ((recv_sys->found_corrupt_log
         && !srv_force_recovery)
        || recv_sys->found_corrupt_fs) {
    log_mutex_exit();
    return(DB_ERROR);
    }
    }
    } else {
    ut_ad(!rescan || recv_sys->n_addrs == 0);
    }

    以上就是mysql InnoDB的崩溃恢复过程,希望对大家有所帮助。更多mysql学习指路:MySQL

    推荐操作系统:windows7系统、mysql5.8、DELL G3电脑

    专题推荐:mysql innodb
    上一篇:mysql插入意向锁的使用 下一篇:mysql存储引擎的整理

    相关文章推荐

    • mysql中正则表达式是什么• mysql中regexp_instr函数的使用• mysql中regexp_substr函数的使用• mysql中regexp_replace函数的使用• mysql全局锁如何使用• mysql元数据锁是什么• mysql InnoDB的四种锁定范围• mysql间隙锁的用法• mysql临键锁的使用• mysql插入意向锁的使用

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网