MySQL 8.0·New data dictionary

admin 2024-12-27 86人围观 ,发现268个评论

众所周知,由于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

猜你喜欢
    不容错过