Mysql Dictionary Cache

mysql的dictionary cache 又可以程为 table definition cahe 或者 per-table cache;有趣的是在当前的mysql中表的定义是放在 .frm 文件当中的,当需要打开表时会读取此文件,如果此文件损坏,那么表将无法读取:

mysql> select * from huo;
ERROR 1033 (HY000): Incorrect information in file: './test/huo.frm'
mysql> desc huo;
ERROR 1033 (HY000): Incorrect information in file: './test/huo.frm'
mysql> 

遇到这个错误时,可以有如下几种做法:

如果是在之前打开表,并且数据库没有重启,在最新的mysql,可以查询:

SELECT * FROM information_schema.COLUMNS where table_name='xxxxx'

这样就可以查询到了表的定义;

如果是备份那么也可以从备份中找到表的定义;如果没有备份,没有打开过表,彻底找不到表的定义了,那么可以会直接将将数据从数据文件中提取为可读状态,然后进行反推表定义; 所以做好备份是王道;从这里也可以看出在当前的版本中mysql并没有单独存储数据字典的表;这里推荐个小工具 dbsake

上面只是mysql 数据字典的一个方面,传统的数据字典,可以用下图来表示:

mysqldict

在开头描述问题只是,当前数据字典的一个问题,其还存在很多不足,所以在最新的mysql 规划中,开发团队已经开始重新规划新到数据字典的存储方式:

mysqldict2

详见:http://mysqlserverteam.com/a-preview-on-lab-release-with-new-data-dictionary-in-mysql/

数据字典的含义不仅仅是表定义,它包括的内容是比较多的,比如表的统计信息,但是在mysql表的统计信息是在打开表时进行的,如果表太大,打开速度就会缓慢,所以把一些相关信息放入表中持久存储也是一个好的选择:innodb_stats_persistent;

那么在当前的数据字典,还需要关注的是数据字典缓存也使用了 lru机制;在目前放出的8 的版本当中,数据字典文件已经默认消失,全部放到数据库中存储,那么问题来了,以后的mysql 在启动方面是不是也会越来越像Oracle呢?让我们拭目以待;

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注