mysqlInnoDB的崩溃恢复过程

美女程序员鼓励师

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电脑

以上是 mysqlInnoDB的崩溃恢复过程 的全部内容, 来源链接: utcz.com/z/546136.html

回到顶部