初始化rollback segments 段

n_noredo_created = trx_sys_create_noredo_rsegs(n_tmp_rsegs); //创建 32个 临时rollback segments
我们这里不准备考虑临时rollback segments

建立 95个(33-128) 普通rollback segments

ulint new_rsegs = n_rsegs - n_used; //eg:128 -33 = 95

for (i = 0; i < new_rsegs; ++i) { //对每个rollback segment进行初始化
ulint space_id;
space_id = (n_spaces == 0) ? 0
: (srv_undo_space_id_start + i % n_spaces); //获取 undo space_id 采用 取模的方式循环初始化 1 2 3 4

ut_ad(n_spaces == 0
|| srv_is_undo_tablespace(space_id));

if (trx_rseg_create(space_id, 0) != NULL)
我们能够注意到这里是i % n_spaces的取模方式n_spaces为我们innodb_undo_tablespaces参数设置的值,因此每个rollback segment 是轮序的方式分布到4个不同的undo tablespace中的。

具体的rollback segment header初始化过程

如上是trx_rseg_create调用trx_rseg_header_create完成的。步骤大概如下:

1、建立rollback segment

block = fseg_create(space, 0, TRX_RSEG + TRX_RSEG_FSEG_HEADER, mtr); //建立一个回滚段,返回段头所在的块
2、初始化TRX_RSEG_MAX_SIZE和TRX_RSEG_HISTORY_SIZE信息

/* Initialize max size field */
mlog_write_ulint(rsegf + TRX_RSEG_MAX_SIZE, max_size,
MLOG_4BYTES, mtr);

/* Initialize the history list */

mlog_write_ulint(rsegf + TRX_RSEG_HISTORY_SIZE, 0, MLOG_4BYTES, mtr);
flst_init(rsegf + TRX_RSEG_HISTORY, mtr);(http://www.amjmh.com/v/BIBRGZ_558768/)
3、初始化每个undo segment header所在的page no

for (i = 0; i < TRX_RSEG_N_SLOTS; i++) { //TRX_RSEG_N_SLOTS 为1024 初始化每个槽 值为 4字节指向 undo segment header的page no

trx_rsegf_set_nth_undo(rsegf, i, FIL_NULL, mtr);
}
初始化的情况下我们看到指向的page no都是 FIL_NULL,说明没有分配任何实际的undo segment。

posted @ 2019-08-06 19:32  李艳艳665  阅读(214)  评论(0编辑  收藏  举报