ITPub博客

首页 > 数据库 > > openfile解读以及和latch的一点关系

openfile解读以及和latch的一点关系

作者:xuexiaogang 时间:2019-07-18 11:03:49 0 删除 编辑

最初启动 MySQL 服务器的时候,需要完成对 Buffer Pool 的初始化过程,就是分配 Buffer Pool 的内存空间,把它划分成若干对控制块和缓存页。但是此时并没有真实的磁盘页被缓存到 Buffer Pool 中(因为还没有用到),之后随着程序的运行,会不断的有磁盘上的页被缓存到 Buffer Pool 中 .

举例:

show status like 'open%_table%';

 

注意会话 opened 开头的都是当前会话的。

再开一个窗口

Opened 的是 ,而 open 的不受影响。 Open 的是全局的。

 

回过来

 

一旦执行 flush tables 那么内存的就被刷掉了。 Open 的全局的没有了。

 

被打开的就是被缓存了。为什么要缓存。因为要快啊!缓存的快,每次从磁盘访问表结构和一些刚被读过的,这样就慢。

但是数据库要知道哪些表和数据被缓存了。以防止增加了不知道 flush 了也不知道。所以我们最好在某个地方记录一下哪些页是可用的,我们可以把所有空闲的页包装成一个节点组成一个链表,这个链表也可以被称作 Free 链表(或者说空闲链表)。因为刚刚完成初始化的 Buffer Pool 中所有的缓存页都是空闲的,所以每一个缓存页都会被加入到 Free 链表中有了这个 Free 链表事儿就好办了,每当需要从磁盘中加载一个页到 Buffer Pool 中时,就从 Free 链表中取一个空闲的缓存页,并且把该缓存页对应的控制块的信息填上,然后把该缓存页对应的 Free 链表节点从链表中移除,表示该缓存页已经被使用了。

 

那么如果频繁更新 free 链表会如何?

答案只有一个,等啊。

那一次等待一次爽,一直等待一直爽。

一直到 10-15 分钟左右。数据库估算都 10 几分钟大家都堵在这里等待什么都做不了了。那再等下去也没有结果。

好吧重启实例。

 


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/637517/viewspace-3170077/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 我的2019DTCC
请登录后发表评论 登录
全部评论
OracleACE/PostgreSQLACE/阿里云MVP/腾讯云TVP/墨天轮 MVP/TiDBMVA/数盟会华东区长老/OpenTenBase社区委和技术委委员/架构师技术同盟名人堂成员上海地区理事会成员/if社区联合发起人/《DBA实战手记》作者/公众号:四海内皆兄弟

注册时间:2013-07-01

  • 博文量
    422
  • 访问量
    953117