提要
长久以来,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 后续的版本准备做相关的改进:
- 使用native InnoDB-based Data Dictionary保存meta data,不再需要frm文件
- 使用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
变化
- 由于使用具有ACID特性的InnoDB引擎,由crash导致的元数据不一致情况将不再出现。
- 对于information_schema中元数据的查询,系统将暴露一个基表上的view出来,供查询。
- 由于使用InnoDB引擎来保存数据,–skip-innodb的参数将不再有意义,5.7版本中做删除处理。
问题
- 系统表切换到InnoDB引擎上,对于版本升级或者降级需要对脚本特殊处理。
- 去掉frm文件,系统如何平滑的进行升级?
- 第三方引擎怎么办?oracle后续的打算是如何?这是一个很大的问题。
由于去掉frm文件使用native InnoDB-based Data Dictionary的特性还在lab环境中酝酿,期待中。
无论如何,提升failure recovery的水平,对于使用者来说,终归是好事情!
当前内容版权归 阿里云RDS-数据库内核组 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 阿里云RDS-数据库内核组 .