/* 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);
}