测试了两个case,属于之前blog的遗留问题:

  1.   innodb如何加载数据字典
  2.   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:

  1. 关闭handler
  2. free innobase_share
  3. 释放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的更多相关文章

  1. Spring的web应用启动加载数据字典方法

    在一个基于Spring的web项目中,当我们需要在应用启动时加载数据字典时,可写一个监听实现javax.servlet.ServletContextListener 实现其中的contextIniti ...

  2. 启动就加载(一)----注解方式实现的。static项目启动的时候就加载进来(一般用于常用参数)

    一,案例 1.1,图片分析 1.2,代码 1.2.1,编写加载系统参数的servlet public class SysInitServlet extends HttpServlet { public ...

  3. 如何在tomcat启动时自动加载一个类

    有时候在开发web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法. 可以 ...

  4. InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式

    InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式 https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ 在这篇文章里,我将讨论在MySQL 5 ...

  5. hbase运行mapreduce设置及基本数据加载方法

    hbase与mapreduce集成后,运行mapreduce程序,同时需要mapreduce jar和hbase jar文件的支持,这时我们需要通过特殊设置使任务可以同时读取到hadoop jar和h ...

  6. module加载过程初步分析[更新中]【转】

    转自:http://blog.chinaunix.net/uid-1817735-id-2837068.html 分析这个过程可以有助于我们认识在加载模块时出现的问题大抵在哪里了. 直接从sys_in ...

  7. 使用 jQuery Ajax 在页面滚动时从服务器加载数据

    简介 文本将演示怎么在滚动滚动条时从服务器端下载数据.用AJAX技术从服务器端加载数据有助于改善任何web应用的性能表现,因为在打开页面时,只有一屏的数据从服务器端加载了,需要更多的数据时,可以随着用 ...

  8. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  9. jquery easyui使用(三)······datagrid加载数据(已解决)

    <div id="table_Data"> </div> $("#table_Data").datagrid({ toolbar: '# ...

随机推荐

  1. 严重: Exception starting filter struts2 java.lang.NullPointerException (转载)

    严重: Exception starting filter struts2 java.lang.NullPointerException at com.opensymphony.xwork2.util ...

  2. 英语中的 姓氏/Surname

    .Chomsky (Belarusian: Хомскі, Russian: Хомский, Ukrainian: Хомський, Hebrew: חומסקי‎‎, "from (V ...

  3. (poj)3020 Antenna Placement 匹配

    题目链接 : http://poj.org/problem?id=3020 Description The Global Aerial Research Centre has been allotte ...

  4. 以boost::function和boost:bind取代虚函数

    转自:http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx 这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不 ...

  5. 清橙 A1120 拦截导弹 -- 动态规划(最长上升子序列)

    题目地址:http://oj.tsinsen.com/A1120 问题描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但 ...

  6. 九度OJ 1514 数值的整数次方【算法】

    题目地址:http://ac.jobdu.com/problem.php?pid=1514 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的expo ...

  7. table隔行换色

    以前做表格隔行换色,是在tr上添加不同的背景色,但在程序开发的过程需要做判断,不够方便,而且生成的代码也比较多,现在的需求逐渐修改为JQ去控制简洁的表格去显示隔行换色 <script type= ...

  8. 初涉GitHub

    安装 访问https://help.github.com/articles/set-up-git/,选择对应OS平台.有文档参考,我的是OpenSuse. 在console中下载安装http://ww ...

  9. 过滤部分错误信息,不输出到stderr

    cmd 2>/tmp/stderr.log cat /tmp/stderr.log | grep -v “要过滤信息的关键字” >&2 rm /tmp/stderr.log

  10. 在Windows Server 2008上部署SVN代码管理总结

    这段时间在公司开发Flex程序,所以使用TortoiseSVN作为团队代码管理器,今天在公司服务器上部署SVN服务器,并实验成功,总结如下: 服务器环境: 操作系统:Windows Server 20 ...