众所周知,由于MySQL采用统一Server层+不同的底层引擎插件的架构模式,在Server层为每个表创建了frm文件,以保存与表定义相关的元数据信息。然而某些引擎(例如InnoDB)本身也会存储元数据,这样不仅产生了元数据冗余,而且由于Server层和引擎层分别各自管理,在执行DDL之类的操作时,很难做到crash-safe,更别说让DDL具备事务性了。
为了解决这些问题(尤其是DDL无法做到atomic),从开始取消了FRM文件及其他server层的元数据文件(frm,par,trn,trg,isl,),所有的元数据都用InnoDB引擎进行存储,另外一些诸如权限表之类的系统表也改用InnoDB引擎。
本文是笔者初次了解这块内容,因此不会过多深入,由于涉及的改动太多,后面有空再逐个展开。
本文所有测试和代码相关部分都是基于版本,由于这是8.0大版本的第一个开发版本,不排除未来行为会发生变化。
测试
首先我们创建一个新库,并在库下创建两个表来开启我们的测试
mysqlCREATEDATABASEsbtest;
QueryOK,1rowaffected(0.00sec)
mysqlUSEsbtest
Databasechanged
mysqlCREATETABLEt1(aintprimarykey);
QueryOK,0rowsaffected(0.00sec)
mysqlCREATETABLEt2(aintprimarykey,bint);
QueryOK,0rowsaffected(0.00sec)$ls-lh/u01/my80/data/sbtest
total256K
-:44
-:44$ls/u01/my80/data/sbtest_9.SDI
/u01/my80/data/sbtest_9.SDI$cat/u01/my80/data/sbtest_9.SDI
{"sdi_version":1,"dd_version":1,"dd_object_type":"Schema","dd_object":{"name":"sbtest","default_collation_id":33,"created":0,"last_altered":0
}
}
可以看到在库目录下只有ibd文件,并没有frm文件,而在数据目录下,相应的生成了一个SDI文件,来描述这个sbtest库的信息。
我们再来看看创建一个MYISAM引擎的表:
mysqlcreatedatabasemy;QueryOK,1rowaffected(0.00sec)
mysqlusemyDatabasechanged
mysqlcreatetablet1(aint,bvarchar(320))engine=myisam;QueryOK,0rowsaffected(0.00sec)
$lsmy/
t1_435.{"sdi_version":1,"dd_version":1,"dd_object_type":"Table","dd_object":{"name":"t1","mysql_version_id":80000,"created":20161005201935,"last_altered":20161005201935,"options":"avg_row_length=0;key_block_size=0;keys_disabled=0;pack_record=1;stats_auto_recalc=0;stats_sample_pages=0;","columns":[
{"name":"a","type":4,"is_nullable":true,"is_zerofill":false,"is_unsigned":false,"is_auto_increment":false,"is_virtual":false,"hidden":false,"ordinal_position":1,"char_length":11,"numeric_precision":10,"numeric_scale":0,"datetime_precision":0,"has_no_default":false,"default_value_null":true,"default_value":"","default_option":"","update_option":"","comment":"","generation_expression":"","generation_expression_utf8":"","options":"interval_count=0;","se_private_data":"","column_key":1,"column_type_utf8":"int(11)","elements":[],"collation_id":33
},
{"name":"b","type":16,"is_nullable":true,"is_zerofill":false,"is_unsigned":false,"is_auto_increment":false,"is_virtual":false,"hidden":false,"ordinal_position":2,"char_length":960,"numeric_precision":0,"numeric_scale":0,"datetime_precision":0,"has_no_default":false,"default_value_null":true,"default_value":"","default_option":"","update_option":"","comment":"","generation_expression":"","generation_expression_utf8":"","options":"interval_count=0;","se_private_data":"","column_key":1,"column_type_utf8":"varchar(320)","elements":[],"collation_id":33
}
],"schema_ref":"my","hidden":false,"se_private_id":709551615,"engine":"MyISAM","comment":"","se_private_data":"","row_format":2,"partition_type":0,"partition_expression":"","default_partitioning":0,"subpartition_type":0,"subpartition_expression":"","default_subpartitioning":0,"indexes":[],"foreign_keys":[],"partitions":[],"collation_id":33
}
}
这里我们创建了一个MyISAM表t1,相应的一个SDI文件被创建,文件中以JSON的格式记录了该表的详细信息。根据官方文件的描述,这个文件的存在是为了一个还未完全实现的功能。
新的InformationSchema定义
一些新IS表使用View进行了重新设计,主要包括这些表:
CHARACTER_SETS
COLLATIONS
COLLATION_CHARACTER_SET_APPLICABILITY
COLUMNS
KEY_COLUMN_USAGE
SCHEMATA
STATISTICS
TABLES
TABLE_CONSTRAINTS
VIEWS
6379:SchemadefinitionsfornewDD
WL6381:HandlerAPIchangesfornewdictionary
WL6383:DefineandImplementAPIforTriggers
WL6385:DefineandImplementAPIforSchema
WL6388:DefineandImplementAPIforEvents
WL6390:UsenewDDAPIforhandlingnon-partitionedtables
WL6392:UpgradetoTransactionalDataDictionary
WL6416:InnoDB:Removetheuseof*.islfiles
WL6929:MoveFOREIGNKEYconstraintstotheglobaldatadictionary
WL7066:ExternaltooltoextractInnoDBtablespacedictionaryinformation
WL7167:
WL7464:InnoDB:provideawaytodonon-lockingreads
WL7630:DefineandImplementAPIforTablePartitionInfo
WL7784:Storetemporarytablemetadatainmemory
WL7896:UseDDAPItoworkwithtriggers
WL7898:UseDDAPItoworkwithevents
WL8150:Dictionaryobjectcache
WL8980:MoveUDFtablefromMyISAMtoTransactionalStorage
WL#9045:MakeusermanagementDDLsatomic