Innodb加载数据字典 && flush tables
测试了两个case,属于之前blog的遗留问题:
- innodb如何加载数据字典
- flush tables都做了什么操作
先来看下innodb加载数据字典:
首次使用:select * from tt;
1. 创建handler对象
函数调用栈:
open_binary_frm
get_new_handler
innobase_create_handler
ha_innobase::ha_innobase
根据单实例 handlerton + table_share两个参数,创建了handler对象,赋值table->file。server层对innodb的操作,都通过这个接口完成。
2. open innobase_share
innobase_share是innodb层对某张表的定义,全局共享结构, 受 innobase_share_mutex保护。
innobase_open_tables hash表保存着所有的INNOBASE_SHARE。
这里完成初始化一个innobase_share结构。
3. 加载数据字典:
初始化innodb_share中的dict_table_t
步骤:
mutex_enter(&(dict_sys->mutex));
dict_sys_t:整个系统的数据字典, 全局的 dict_sys_t* dict_sys;
包括:hash_table_t* table_hash; /*!< hash table of the tables, based
包括:UT_LIST_BASE_NODE_T(dict_table_t) table_LRU; /*!< LRU list of tables */
dict_table_get
dict_table_get_low
存在: dict_table_check_if_in_cache_low: 从hash表中取出,并更新lru链表。
不存在:dict_load_table
1. load 表定义
2. load columns
3. load index
4. load foreign key
注:数组字典使用了两个结构存储,一个hash方便查询, 一个是lru链表,用于缓存的置换。
flush tables
reload_acl_and_cache:
1. 清空query_cache:使用structure_guard_mutex锁。
2. close_cached_tables:关闭没有使用的。使用LOCK_open锁进行保护。
3. 递增:refresh_version
free_cache_entry: free掉 table_cache中的table
inter_close_table: 清空 io_cache
closefrm:
- 关闭handler
- free innobase_share
- 释放table_share: 从table_def_cache上删除。
记录binlog:
flush talbes记录了statement的binlog。
flush tables with read lock
如果使用了flush tables with read lock:会flush table并获取全局锁, 类似于set read_only=1;
global read lock:使用mdl锁的架构实现。一共获取了两个锁:
1. m_mdl_global_shared_lock: 全局范围的共享锁
mdl_request.init(MDL_key::GLOBAL, "", "", MDL_SHARED, MDL_EXPLICIT);
所有的ddl/dml都会被阻塞。
2. m_mdl_blocks_commits_lock:阻塞commit的排它锁
mdl_request.init(MDL_key::COMMIT, "", "", MDL_SHARED, MDL_EXPLICIT);
所有有更新事务的commit都会阻塞,因为commit会写数据到binlog中。
mdl锁的不兼容情况,都是使用排队的阻塞模式,所以,flush tables with read lock经常会被大事务所阻塞,线上慎用。
结论:
对于一个表, flush_tables一共关闭了 table, table_share, handler, innobase_share. 只保留了dict_table_t数据字典。
flush tables不关闭正在使用的,当table再次使用的时候,发现version已经发生了变化,就关闭,并重新打开。
Innodb加载数据字典 && flush tables的更多相关文章
- Spring的web应用启动加载数据字典方法
在一个基于Spring的web项目中,当我们需要在应用启动时加载数据字典时,可写一个监听实现javax.servlet.ServletContextListener 实现其中的contextIniti ...
- 启动就加载(一)----注解方式实现的。static项目启动的时候就加载进来(一般用于常用参数)
一,案例 1.1,图片分析 1.2,代码 1.2.1,编写加载系统参数的servlet public class SysInitServlet extends HttpServlet { public ...
- 如何在tomcat启动时自动加载一个类
有时候在开发web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法. 可以 ...
- InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式
InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式 https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ 在这篇文章里,我将讨论在MySQL 5 ...
- hbase运行mapreduce设置及基本数据加载方法
hbase与mapreduce集成后,运行mapreduce程序,同时需要mapreduce jar和hbase jar文件的支持,这时我们需要通过特殊设置使任务可以同时读取到hadoop jar和h ...
- module加载过程初步分析[更新中]【转】
转自:http://blog.chinaunix.net/uid-1817735-id-2837068.html 分析这个过程可以有助于我们认识在加载模块时出现的问题大抵在哪里了. 直接从sys_in ...
- 使用 jQuery Ajax 在页面滚动时从服务器加载数据
简介 文本将演示怎么在滚动滚动条时从服务器端下载数据.用AJAX技术从服务器端加载数据有助于改善任何web应用的性能表现,因为在打开页面时,只有一屏的数据从服务器端加载了,需要更多的数据时,可以随着用 ...
- Android之Socket通信、List加载更多、Spinner下拉列表
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...
- jquery easyui使用(三)······datagrid加载数据(已解决)
<div id="table_Data"> </div> $("#table_Data").datagrid({ toolbar: '# ...
随机推荐
- JavaScript基础-面向对象编程<1>
1.1 函数与对象 1.定义函数的方式定义类 定义类的方法: function class1(){ //类成员的定义及构造函数部分 } class1既是一个函数,也是一个类. 使用 new 操作符获 ...
- InstallShield : 如何查找编译后的 Merge Module存放路径
工程菜单栏中依次选择 Tools ---> Options… ,选择 Merge Modules tab 页,如下,就会看到Merge Module的存放路径,也可以根据需求修改. Merge ...
- 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)
题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...
- 九度OJ 1209 最小邮票数 -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1209 题目描述: 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值. 如,有1分,3分,3分,3 ...
- jsonp使用规范
这两天花了很多时间弄研究jsonp这个东西, 可是无论我怎么弄..TMD就是不进入success函数,并且一直进入error函数...让我着实DT啊. 可以看下我之间的提问(这就是我遇到的烦恼).. ...
- 《Nodejs开发加密货币》之二十七:开发通用的HTML组件
人的懒惰常常是麻烦的开始.多数程序员都希望自己的工作一劳永逸,一次开发,到处使用,成了人人追逐的目标,我也不例外.最初写<Nodejs开发加密货币>系列文章,因为不喜欢设定好了去写,所以目 ...
- CentOS 6.4 安装SecurectCRT并破解
经过验证此方法使用于Centos 系列. 相关说明: 上篇发了个Linux(Ubuntu) 下 SecureCRT 7 30天循环破解在启动的时候会多输入一次确认窗口, 后来maz-1网友留言说可以用 ...
- oracle忘记用户密码
在cmd命令行下输入sqlplus / as sysdba alter user system identified by abc; 就可以将system用户的密码改成abc了. alter user ...
- 2014年度辛星html教程夏季版第五节
如果读者是一位后台开发者,那么肯定会知道什么叫表单,这里我们就介绍一下前台如何使用表单,表单的使用也是我们编写网页的必须经历的一关,而且,表单也往往是我们网站的漏洞和弱点出现的地方. ******** ...
- Core管道中的处理流程3
通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的? 在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下 ...