千家信息网

InnoDB数据字典--字典表加载

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,1、介绍 在InnoDB启动时,如果是新建数据库则需初始化库,需要创建字典管理的相关信息。函数innobase_start_or_create_for_mysql调用dict_create完成此
千家信息网最后更新 2025年01月21日InnoDB数据字典--字典表加载

1、介绍

    在InnoDB启动时,如果是新建数据库则需初始化库,需要创建字典管理的相关信息。函数innobase_start_or_create_for_mysql调用dict_create完成此功能。即创建数据字典,因为InnoDB系统表的个数结构固定,所以初始化库的时候只需要创建这几个表的B+树即可并将B+树的根页号存放到固定位置。对于B+树,只要找到根页面,就可以从根页面开始检索数据。相关系统表(即上一节讲到的4个系统表)在InnoDB内部,不会暴露给用户。    4个系统表通过固定的硬编码进行构建。具体原理流程如下。

2、数据字典创建及加载原理流程

3、说明

1)innobase_start_or_create_for_mysql函数调用dict_create()函数进行数据字典的创建和加载工作。

2)dict_hdr_create完成系统表空间第7号页面dict header的初始化及创建SYS_TABLES两个索引、SYS_COLUMNS一个索引、SYS_INDEXES一个索引、SYS_FIELDS一个索引,其创建索引的函数是btr_create。

3)创建B+树索引后,通过dict_boot函数加载常驻内存的4个系统表。具体流程见流程图的②部分。

4)加载完成后,将这4个系统表挂在一个全局字典中:

dict0dict.h::

/* Dictionary system struct */  struct dict_sys_t{      ib_mutex_t      mutex;      /*!< mutex protecting the data                     dictionary; protects also the                     disk-based dictionary system tables;                     this mutex serializes CREATE TABLE                     and DROP TABLE, as well as reading                     the dictionary data for a table from                     system tables */      row_id_t    row_id;     /*!< the next row id to assign;                     NOTE that at a checkpoint this                     must be written to the dict system                     header and flushed to a file; in                     recovery this must be derived from                     the log records */      hash_table_t*   table_hash; /*!< hash table of the tables, based                     on name */      hash_table_t*   table_id_hash;  /*!< hash table of the tables, based                     on id */      ulint       size;       /*!< varying space in bytes occupied                     by the data dictionary table and                     index objects */      dict_table_t*   sys_tables; /*!< SYS_TABLES table */      dict_table_t*   sys_columns;    /*!< SYS_COLUMNS table */      dict_table_t*   sys_indexes;    /*!< SYS_INDEXES table */      dict_table_t*   sys_fields; /*!< SYS_FIELDS table */      /*=============================*/      UT_LIST_BASE_NODE_T(dict_table_t)              table_LRU;  /*!< List of tables that can be evicted                     from the cache */      UT_LIST_BASE_NODE_T(dict_table_t)              table_non_LRU;  /*!< List of tables that can't be                     evicted from the cache */  }; 

结构体中sys_tables、sys_columns、sys_indexes、sys_fields四个结构存储上述对应的4个系统表。

结构体中HASH表及链表用来存储InnoDB中的所有表的缓存,包括系统表及用户表。table_hash哈希表按名字缓存,table_id_hash按表ID进行hash,LRU链表用来管理表对象缓存。

5)普通用户表加载流程见流程图的③、④部分。

当用户访问一个用户表时,首先需要从表对象缓存中查找这个表的SHARE对象,如果找到则直接从其实例化表对象链表中拿一个使用;如果没有找到,则需要重新打开这个表,需要找到这个表的字典信息。即③的流程。

具体加载一个表的字典是④流程,dict_load_table的工作。

a)首先需要找到SYS_TABLES表,也是先找缓存,缓存找不到再从系统表加载: dict_table_get_low

b)找到之后构建一个查询键值,从SYS_TABLES的name主键索引进行查询,如果诶呦找到或者该记录已经被删除则返回,否则解析找到的这条记录。然后根据这些信息创建表的内存对象table。

c)加载列操作与加载表的原理基本一样,对应系统表的SYS_COLUMNS,聚集索引为(TABLE_ID,POS),查找时,如果TABLE_ID相同,在POS从小到大排序,所以构造所有列的键值时,只需要通过TABLE_ID查询即可,按顺序取出所有列信息一一构造内存对象。

d)加载索引信息类似的流程

系统 流程 索引 字典 对象 缓存 数据 信息 函数 用户 结构 内存 原理 页面 用户表 查询 流程图 部分 存储 工作 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河北奕腾互联网科技有限公司 网络安全防范研究调查 leaf游戏服务器平滑重启 永兴学电脑软件开发学费多少 数据库的默认扩展名是 日本经济新闻社数据库 大学数据库与技术是什么 重庆互联网软件开发有用吗 计算机网络技术的行业环境 16路监控怎么连监控存储服务器 csgo玩过社区服务器后变卡 市南区分销软件开发哪家靠谱 小红帽网络技术有限公司 学校网络安全记载 软件开发类 昆明软件开发公司哪个靠谱 计算机软件开发实训总结 网络安全教育知识内容幼儿园 服务器管理器查看端口 为什么玩服务器会被黑 网络安全教育的日记怎么写 深入互联网科技高苏华图片 数据库2012镜像技术 重庆互联网软件开发有用吗 山西软件开发培训公司 智慧检务时代的网络安全 文件共享服务器权限管理 属于保护网络安全的措施是 崇明区网络安全审计系统咨询 互联网科技公司协议
0