MySQL系列:innodb源码分析之表空间管理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL系列:innodb源码分析之表空间管理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5679字,纯文字阅读大概需要9分钟。
内容图文
innodb在实现表空间(table space)基于文件IO之上构建的一层逻辑存储空间管理,table space采用逻辑分层的结构:space、segment inode、extent和page.在实现层的逻辑使用了磁盘链表这种结构来管理逻辑关系。我们先来介绍磁盘链表。
1.磁盘链表
typedef struct fil_addr_struct { ulint page; /*page在space中的编号*/ ulint boffset; /*page中的字节偏移量,在内存中使用2字节表示*/ }fil_addr_t;
flst_node_t可以通过buf_ptr_get_fsp_addr来确定fil_addr_t。
1.1磁盘链表的结构关系
2.space结构分析
2.1 FSP HDR/XDES Page
2.1.1XDES结构分析(extent)
XDES list 是磁盘双向链表的一个节点,分别指向前一个XDES entry的page位置和后一个
state extent的状态, XDES_FREE、XDES_FREE_FRAG、XDES_FULL_FRAG、
bitmap 当前extent的所有page的状态索引,一个page占用2 bit,第一个bit表示是否被使用
2.1.2 FSP Header
limit 当前space已经分配初始化的page数,包括空闲的和已经使用的
flag 未起作用
frage used FSP_FREE_FRAG列表中已经被使用的page数
free list space中可用的extent对象列表,extent里面没有一个page被使用
frag free list 有可用碎叶page的extent列表,exntent里面有部分page被使用
frag full list 没有有可用page的extent列表,exntent里面全部page被使用
segment id 下一个可利用的segment id
full inode list space当前完全占满的segment inode页列表
free inode list space当前完全占满的segment inode页列表
2.2 Fseg inode Page
not full used FSEG_NOT_FULL列表中的page数
FSEG_FREE inode中空闲的extent列表
FSEG_NOT_FULL extent有部分page被占用,有部分page空闲的extent列表
FSEG_FULL 完全占满的extent的列表
FSEG_MAGIC_N 校验魔法字
fragment array 一个长度为32的零散page索引存储的数组,如果这个数据满了.主要的作用是
3.space结构图
3.1space框架关系图
3.2模块关系示意图
4.space的inode、extent和page分配流程
4.1 inode的分配流程
第2步:在申请inode时,如果FSP_SEG_INODES_FREE有可以的inode page,从inode page或的一个inode,对应函数fsp_alloc_seg_inode
第3步:如果在申请inode后,inode所处的inode page已经没有空闲的inode了,会将这个inode page放入FSP_SEG_INODE_FULL,并将其从FSP_SEG_INODES_FREE中删除。
第4步:如果inode管理的所有的页都是空闲,那么这个inode状态会被置为空闲状态,这个时候会将这个inode page从FSP_SEG_INODE_FULL移 到FSP_SEG_INODES_FREE中;这个过程只有在segment删除的时候才会调用。对应的函数fsp_free_seg_inode
4.2extent的分配流程
1: 当inode的free list为空,如果需要使用申请使用新的extent,innodb会从space free list获得空闲的extent加入到inode free list当中。
2: 当inode free list中有extent,如果申请使用新的extent,只只需要从inode free list中拿取,并将extent移到inode not full当中。
3:只是通过inode方式申请页的一个操作,这个时候extent有足够多的空闲page.
4: 当extent中没有空闲的page时,会将这个extent从inode not full中转移到inode full当中。
5: 当一个page释放时,这个page所处的extent是一个完全占用的且被inode管理的extent,那么page释放后,就会将这个extent从inode full移到inode not full
6:当一个page释放时,这个page所处的extent有且只有这一个page被占用,那么page释放后,这个extent就会归还给inode list.并且会直接进行 7将extent归还给space free list.
4.3page的分配流程
1. 指定的inode的hint位置的页是空闲状态,直接返回对应的page
2.descr是空闲状态,但segment inode中的空闲page数量 < 1/8,且碎片页被全部用完,为其分配一个extent,并获得hint对应的page
3.如果descr不是空闲状态,且segment inode中的空闲page数量 < 1/8,在inode当中获得一个空闲的extent,并且将这个extent descr对应的页返回。
4.descr是XDES_FSEG状态,且这个extent中还有空闲page,从其中获取一个page.
5.除了以上情况外,如果descr不是空闲的,但是inode还有其他的空闲extent,从其他的extent获得一个空闲。
6.如果其他的extent没有空闲页,但是fragment array还有空闲的碎片page,从空闲的碎片page中获得一个空闲页。
7.如果连碎页也没有,直接申请分配一个新的extent,并在其中获取一个空闲的page.
5.综述
原文:http://blog.csdn.net/yuanrxdu/article/details/41925279
内容总结
以上是互联网集市为您收集整理的MySQL系列:innodb源码分析之表空间管理全部内容,希望文章能够帮你解决MySQL系列:innodb源码分析之表空间管理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。