• 技术文章 >数据库 >MySQL

    mysql InnoDB的崩溃恢复过程

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

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

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

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

    4、purge操作。

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

    实例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    /* 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学习网