undo 表空间物理文件的建立

Posted 李艳艳665

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了undo 表空间物理文件的建立相关的知识,希望对你有一定的参考价值。

根据参数innodb_undo_tablespaces 的配置通过调用srv_undo_tablespace_create分别进行文件建立,默认建立的大小为10M:

for (i = 0; create_new_db && i < n_conf_tablespaces; ++i) //n_conf_tablespaces 为innodb_undo_tablespaces的配置的个数

/** Default undo tablespace size in UNIV_PAGEs count (10MB). */
const ulint SRV_UNDO_TABLESPACE_SIZE_IN_PAGES =
((1024 * 1024) * 10) / UNIV_PAGE_SIZE_DEF;
...
err = srv_undo_tablespace_create(
name, SRV_UNDO_TABLESPACE_SIZE_IN_PAGES); //建立undo文件
...
本步骤会有一个注释如下:

/* Create the undo spaces only if we are creating a new
instance. We don‘t allow creating of new undo tablespaces(http://www.amjmh.com/v/BIBRGZ_558768/)
in an existing instance (yet). This restriction exists because
we check in several places for SYSTEM tablespaces to be less than
the min of user defined tablespace ids. Once we implement saving
the location of the undo tablespaces and their space ids this
restriction will/should be lifted. */
简单的讲就是建立undo tablespace只能在初始化实例的时候,因为space id已经固定了。

分别对4个undo tablespace调用srv_undo_tablespace_open 其主要调用fil_space_create 和 fil_node_create将新建立的undo tablespace加入Innodb的文件体系。

for (i = 0; i < n_undo_tablespaces; ++i) {
....
err = srv_undo_tablespace_open(name, undo_tablespace_ids[i]); //打开UNDO文件 建立 file node
...
}
分别对4个undo tablespace 进行fsp header初始化

for (i = 0; i < n_undo_tablespaces; ++i) {

fsp_header_init( //初始化fsp header 明显 space id 已经写入
undo_tablespace_ids[i],
SRV_UNDO_TABLESPACE_SIZE_IN_PAGES, &mtr); //SRV_UNDO_TABLESPACE_SIZE_IN_PAGES 默认的undo大小 10MB
}
其中fsp_header_init部分代码如下:

mlog_write_ulint(header + FSP_SPACE_ID, space_id, MLOG_4BYTES, mtr);
mlog_write_ulint(header + FSP_NOT_USED, 0, MLOG_4BYTES, mtr);

mlog_write_ulint(header + FSP_SIZE, size, MLOG_4BYTES, mtr);
mlog_write_ulint(header + FSP_FREE_LIMIT, 0, MLOG_4BYTES, mtr);
mlog_write_ulint(header + FSP_SPACE_FLAGS, space->flags,
MLOG_4BYTES, mtr);
mlog_write_ulint(header + FSP_FRAG_N_USED, 0, MLOG_4BYTES, mtr);

flst_init(header + FSP_FREE, mtr);
flst_init(header + FSP_FREE_FRAG, mtr);
flst_init(header + FSP_FULL_FRAG, mtr);
flst_init(header + FSP_SEG_INODES_FULL, mtr);
flst_init(header + FSP_SEG_INODES_FREE, mtr);

以上是关于undo 表空间物理文件的建立的主要内容,如果未能解决你的问题,请参考以下文章

物理文件

模拟数据库丢失undo表空间

undo表空间概述-1

MySQL5.7新特性——在线收缩undo表空间

无备份情况下回复undo表空间

oracle undo表空间被删除,数据库无法启动,请问如何恢复