数据库内核月报 - 2014 / 10

MySQL · 文件结构 · 告别frm文件

提要

长久以来,server层和InnoDB层都保存了表的元数据,server使用frm文件保存了column,data_types等信息,而InnoDB使用data dictionary来保存meta data。

由于server层使用文件系统,而InnoDB使用事务引擎,所以经常会存在两者不一致的情况,比如:

create table的过程中实例crash
alter table过程中实例crash

具体可以参见:http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting-datadict.html 包括相关的解决方法。

改进

MySQL 后续的版本准备做相关的改进:

  1. 使用native InnoDB-based Data Dictionary保存meta data,不再需要frm文件
  2. 使用InnoDB引擎保存MySQL的系统表,比如privileges和timezones相关的表

使用new Data Dictionary,去掉frm文件,目前还在MySQL lab版本中。

而在MySQL 5.7的版本中,以下的系统表已不再使用MyISAM,而使用InnoDB引擎保存数据:

  • help_category
  • help_keyword
  • help_relation
  • help_topic
  • time_zone
  • time_zone_leap_second
  • time_zone_name
  • time_zone_transition,
  • time_zone_transition_type

变化

  1. 由于使用具有ACID特性的InnoDB引擎,由crash导致的元数据不一致情况将不再出现。
  2. 对于information_schema中元数据的查询,系统将暴露一个基表上的view出来,供查询。
  3. 由于使用InnoDB引擎来保存数据,–skip-innodb的参数将不再有意义,5.7版本中做删除处理。

问题

  1. 系统表切换到InnoDB引擎上,对于版本升级或者降级需要对脚本特殊处理。
  2. 去掉frm文件,系统如何平滑的进行升级?
  3. 第三方引擎怎么办?oracle后续的打算是如何?这是一个很大的问题。

由于去掉frm文件使用native InnoDB-based Data Dictionary的特性还在lab环境中酝酿,期待中。

无论如何,提升failure recovery的水平,对于使用者来说,终归是好事情!