InnoDB undo log物理结构的初始化( 二 )

<= page + (UNIV_PAGE_SIZE - FIL_PAGE_DATA_END));/* Initialize all of the page.This part used to be uninitialized. */memset(ptr, 0, UNIV_PAGE_SIZE - FIL_PAGE_DATA_END + page - ptr); //将剩下的空间设置为0x00mlog_log_string(sys_header, UNIV_PAGE_SIZE - FIL_PAGE_DATA_END+ page - sys_header, mtr);/* Create the first rollback segment in the SYSTEM tablespace */slot_no = trx_sysf_rseg_find_free(mtr, false, 0);page_no = trx_rseg_header_create(TRX_SYS_SPACE, univ_page_size,ULINT_MAX, slot_no, mtr); //将第一个slot固定在ibdata中
完成了这一步过后的 block 5 就初始化完了,而且我们看到所有的slots 都初始化完成(源码所示有256个,实际上最多只会有128个,其中0号solt固定在中),注意这里的槽大小是ZE设置的大小为8字节,4字节space id ,4字节 page no,它们会指向所在的位置 。
/** Transaction system header *//*------------------------------------------------------------- @{ */#define TRX_SYS_TRX_ID_STORE0/*!< the maximum trx id or trxnumber moduloTRX_SYS_TRX_ID_UPDATE_MARGINwritten to a file page by anytransaction; the assignment oftransaction ids continues fromthis number rounded up byTRX_SYS_TRX_ID_UPDATE_MARGINplusTRX_SYS_TRX_ID_UPDATE_MARGINwhen the database isstarted *///最大的事物ID,下次实例启动会加上TRX_SYS_TRX_ID_UPDATE_MARGIN启动#define TRX_SYS_FSEG_HEADER 8/*!< segment header for thetablespace segment the trxsystem is created into */#define TRX_SYS_RSEGS(8 + FSEG_HEADER_SIZE)/*!< the start of the array ofrollback segment specificationslots *///指向rollback segment header的槽/*------------------------------------------------------------- @} */
三、进行的初始化
调用 进行:
根据注释和代码已经是个淘汰的参数,应该用ents代替 。
这两个参数默认是就是及 128 其实不用设置的 。本文也用128进行讨论 。
参数 ents
static MYSQL_SYSVAR_ULONG(rollback_segments, srv_rollback_segments,PLUGIN_VAR_OPCMDARG,"Number of rollback segments to use for storing undo logs.",NULL, NULL,TRX_SYS_N_RSEGS,/* Default setting */1,/* Minimum value */TRX_SYS_N_RSEGS, 0);/* Maximum value */
参数
static MYSQL_SYSVAR_ULONG(undo_logs, srv_undo_logs,PLUGIN_VAR_OPCMDARG,"Number of rollback segments to use for storing undo logs. (deprecated)",NULL, innodb_undo_logs_update,TRX_SYS_N_RSEGS,/* Default setting */1,/* Minimum value */TRX_SYS_N_RSEGS, 0);/* Maximum value */
就是128
下面是注释和代码
/* Deprecate innodb_undo_logs.But still use it if it is set tonon-default and innodb_rollback_segments is default. */if (srv_undo_logs < TRX_SYS_N_RSEGS) {ib::warn() << deprecated_undo_logs;if (srv_rollback_segments == TRX_SYS_N_RSEGS) {srv_rollback_segments = srv_undo_logs;}}
n_noredo_created = trx_sys_create_noredo_rsegs(n_tmp_rsegs); //创建 32个 临时rollback segments
我们这里不准备考虑临时
ulintnew_rsegs = n_rsegs - n_used; //eg:128 -33 = 95for (i = 0; i < new_rsegs; ++i) { //对每个rollback segment进行初始化ulintspace_id;space_id = (n_spaces == 0) ? 0: (srv_undo_space_id_start + i % n_spaces); //获取 undo space_id 采用 取模的方式循环初始化 1 2 3 4ut_ad(n_spaces == 0|| srv_is_undo_tablespace(space_id));if (trx_rseg_create(space_id, 0) != NULL)
我们能够注意到这里是i % 的取模方式为我们ces参数设置的值,因此每个是轮序的方式分布到4个不同的undo 中的 。
如上是调用te完成的 。步骤大概如下:
1、建立
block = fseg_create(space, 0, TRX_RSEG + TRX_RSEG_FSEG_HEADER, mtr); //建立一个回滚段,返回段头所在的块