长久以来,server层和InnoDB层都保存了表的元数据,server使用frm文件保存了column,data_types等信息,而InnoDB使用data dictionary来保存meta data。
由于server层使用文件系统,而InnoDB使用事务引擎,所以经常会存在两者不一致的情况,比如:
具体可以参见: 包括相关的解决方法。
MySQL 后续的版本准备做相关的改进:
- 使用InnoDB引擎保存MySQL的系统表,比如privileges和timezones相关的表
使用new Data Dictionary,去掉frm文件,目前还在MySQL lab版本中。
而在MySQL 5.7的版本中,以下的系统表已不再使用MyISAM,而使用InnoDB引擎保存数据:
- help_category
- help_keyword
- help_relation
- time_zone
- time_zone_leap_second
- time_zone_name
- time_zone_transition,
- 由于使用具有ACID特性的InnoDB引擎,由crash导致的元数据不一致情况将不再出现。
- 对于information_schema中元数据的查询,系统将暴露一个基表上的view出来,供查询。
- 由于使用InnoDB引擎来保存数据,–skip-innodb的参数将不再有意义,5.7版本中做删除处理。
问题
- 系统表切换到InnoDB引擎上,对于版本升级或者降级需要对脚本特殊处理。
- 第三方引擎怎么办?oracle后续的打算是如何?这是一个很大的问题。
由于去掉frm文件使用native InnoDB-based Data Dictionary的特性还在lab环境中酝酿,期待中。
无论如何,提升failure recovery的水平,对于使用者来说,终归是好事情!