应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

MySQL8。0数据字典表

  MySQL8。0对数据字典进行了重构,用户表、数据字典表、MySQL其它系统表的元数据都统一保存到mysql库的数据字典表中了。
  mysql库中,除了generallog、slowlog2个日志表,其它所有表的存储引擎都是InnoDB,伴随而来的是DDL终于能够支持原子操作了。
  以DROPTABLEt1,t2为例,不会出现t1表删除成功,t2表删除失败的情况,而是要么都删除成功,要么都删除失败。
  本文我们就来聊聊MySQL8。0中的数据字典表。
  本文内容基于MySQL8。0。29源码。
  目录1。概述2。数据字典表有哪些?3。数据字典表元数据在哪里?4。创建数据字典表5。打开数据字典表6。总结
  正文1。概述
  MySQL8。0重构数据字典之后,废除了MySQL5。7中用于保存元数据的磁盘文件:。frm、。par、。TRN、。TRG、。isl、db。opt、ddllog。log。
  如果想要了解上面这些磁盘文件都保存了什么元数据,可以参照MySQL官方文档:https:dev。mysql。comdocrefman8。0endatadictionaryfileremoval。html
  这些文件被废除之后,原本保存到这些文件中的元数据,都保存到数据字典表中了。
  数据字典表本身也大变样了:数据字典表不再位于InnoDB系统表空间,而是迁移到mysql库中,mysql库位于mysql表空间,磁盘文件为mysql。ibd。SYSTABLES、SYSCOLUMNS、SYSINDEXES、SYSFIELDS这4个数据字典表也不再完全依赖硬编码在源码中的元数据了,而是和其它表一样,使用保存在mysql库的数据字典表中的元数据。
  上面4个数据字典表的名字也发生了变化,后面会介绍。2。数据字典表有哪些?
  按照官方文档的定义,MySQL8。0一共有31张数据字典表:ddpropertiesinnodbddllogcatalogscharactersetscheckconstraintscollationscolumnstatisticscolumntypeelementscolumnseventsforeignkeycolumnusageforeignkeysindexcolumnusageindexpartitionsindexstatsindexesparametertypeelementsparametersresourcegroupsroutinesschematastspatialreferencesystemstablepartitionvaluestablepartitionstablestatstablestablespacefilestablespacestriggersviewroutineusageviewtableusage
  上面只是简单列出了数据字典表的表名,如果想了解每个表存放了什么内容,可以参照官方文档:https:dev。mysql。comdocrefman8。0ensystemschema。html
  默认情况下,我们是看不到数据字典表的,需要满足以下条件才能看到:源码编译Debug版本MySQL,以使用cmake编译为例,需要带上DCMAKEBUILDTYPEDebug编译选项。连接MySQL之后,先执行下面的SQL告诉MySQL跳过数据字典表的权限检查:SETSESSIONdebugd,skipddtableaccesscheck
  满足以上2个条件之后,执行下面这条SQL就可以看到所有数据字典表了:SELECTa。nameASdbname,b。FROMmysql。schemataASaINNERJOINmysql。tablesASbONa。idb。schemaidWHEREb。schemaid1ANDb。hiddenSystemORDERBYb。id
  执行上面的SQL列出来的表有32个,其中innodbdynamicmetadata表不属于数据字典表。
  上面列出的数据字典表中,有4个需要重点介绍,因为不管是数据字典表本身,还是用户表,都离不开这4个表:tables:存储表的元数据,包括表空间ID、数据库ID、表ID、表名、表注释、行格式等信息,对应MySQL5。7中的数据字典表SYSTABLES。columns:存储表中字段的元数据,包括表ID、字段ID、字段名、字段注释、字段类型、是否自增等信息,对应MySQL5。7中的数据字典表SYSCOLUMNS。indexes:存储表的索引元数据,包括表空间ID、表ID、索引ID、索引名、索引注释、是否是隐藏索引等信息,对应MySQL5。7中的数据字典表SYSINDEXES。indexcolumnusage:存储索引中字段的元数据,包括索引ID、字段ID、字段在索引中的编号(从1开始)、索引字段长度(如果是前缀索引字段,则是前缀的长度)、索引字段排序、是否隐藏,共6个字段,对应MySQL5。7中的数据字典表SYSFIELDS。
  这个表中没有包含更详细的字段信息,如果需要,可以通过字段ID到columns表获取。
  indexcolumnusage和SYSFIELDS表不完全一样,有2点需要说明:indexcolumnusage包含6个字段,比SYSFIELDS多3个字段:
  order:表示索引字段的排序。
  length:hidden0时,表示索引字段长度,或前缀索引字段的前缀长度;hidden1时,字段值为NULL。
  hidden:0表示索引中该字段由用户定义;1表示索引中该字段是MySQL给加上的。以下是一个测试表,图中name是从columns表中连表查询得到的,其它都是indexcolumnusage表的字段。CREATETABLEt5(idintunsignedNOTNULLAUTOINCREMENT,str1varchar(255)CHARACTERSETutf8mb3COLLATEutf8generalciNOTNULLDEFAULT,i1intNOTNULLDEFAULT0,str2varchar(255)CHARACTERSETutf8mb3COLLATEutf8generalciNOTNULLDEFAULT,i2intNOTNULLDEFAULT0,PRIMARYKEY(id)USINGBTREE,UNIQUEKEYidxi1(i1)USINGBTREE,KEYidxstr1(str1)USINGBTREE)ENGINEInnoDBDEFAULTCHARSETutf8mb3;
  indexid310是主键索引,hidden0的记录是主键字段;hidden1的记录是主键索引中的其它字段,也就是表中的字段。
  indexid312是二级索引,其中str1是前缀索引字段,前缀长度为2553(utf8一个字符最多占用的字节数)765,hidden0表示str1是用户定义的二级索引字段;hidden1的记录是MySQL自己增加到二级索引中的主键字段。indexcolumnusage表中的ordinalposition表示编号,从1开始;SYSFIELDS中的POS表示序号,从0开始。
  除了在Debug版本的MySQL中设置跳过数据字典表的权限检查之外,还可以通过informationschema数据库中的表或视图查看其对应的数据字典表:
  数据字典表informationschema表或视图tablesINNODBTABLEScolumnsINNODBCOLUMNSindexesINNODBINDEXESindexcolumnusage
  INNODBFIELDS
  3。数据字典表元数据在哪里?
  数据字典表用于存储用户表的元数据,这个比较好理解,因为创建用户表的时候,所有数据字典表都已经存在了,把用户表的各种元数据插入到相应的数据字典表就可以了。
  数据字典表本身的元数据也会保存到数据字典表里,但是某个数据字典表创建的时候,有一些数据字典表还没有创建,这就有问题了。
  我们以columns、indexes这2个数据字典表为例来说明:columns表先于indexes表创建,columns表创建成功之后,需要把索引元数据保存到indexes表中,而此时indexes表还没有创建,columns表的索引元数据自然也就没办法保存到indexes表中了。
  MySQL解决这个问题的方案是引入一个中间层,用于临时存放所有数据字典表的各种元数据,等到所有数据字典表都创建完成之后,再把临时存放在中间层的所有数据字典表的元数据保存到相应的数据字典表中。
  这里所谓的中间层实际上是一个存储适配器,源码中对应的类名为Storageadapter,这是一个实现了单例模式的类。
  MySQL在初始化数据目录的过程中,Storageadapter类的实例属性mcoreregistry就是所有数据字典表元数据的临时存放场所。4。创建数据字典表
  我们安装MySQL完成之后,想让MySQL运行起来,要做的第一件事就是初始化MySQL,实际上就是初始化MySQL数据目录。
  初始化过程会创建MySQL运行时需要的各种表空间、数据库、表,其中就包含数据字典表。
  创建数据字典表的过程分为3个步骤进行:
  第1步,把代表每个数据字典表的Objecttable对象注册到Systemtables类的实例属性mregistry中。
  除了数据字典表,mregistry中还包含了mysql库中的其它MySQL系统表。
  第2步,循环mregistry中的所有表,通过Objecttable得到数据字典表的DDL,然后调用dd::executequery()执行DDL语句创建数据字典表。
  dd::executequery()创建数据字典表的过程中,会把表的元数据临时存放到Storageadapter类的实例属性mcoreregistry中,而不会保存到各种元数据对应的数据字典表中,这么做的原因在上一小节中介绍数据字典表的元数据在哪里时,已经介绍过了,这里不再赘述。
  dd::executequery()执行完一个数据字典表的DDL语句之后,这个数据字典表在表空间中就已经存在了,mregistry中的所有表都处理完成之后,所有数据字典表就都存在了。
  第3步,循环mregistry中的所有表,把每个表本身的元数据(数据库ID、表ID、表名、注释、字段数量等)保存到mysql。tables数据字典表中,然后把表的字段、索引等元数据保存到对应的数据字典表中。
  所有数据字典表的元数据都从Storageadapter类的实例属性mcoreregistry中读取。
  经过3个步骤的通力协作,所有数据字典表的元数据就都保存到数据字典表中了,这个鸡生蛋、蛋生鸡的问题,就这样通过引入外力(mcoreregistry)解决了。5。打开数据字典表
  数据字典表保存着MySQL运行过程中需要的一系列关键数据,使用频次很高,MySQL启动过程中就会把数据字典表的元数据都加载到内存中,这就是打开表的过程。
  也就是说,打开数据字典表是在MySQL启动过程中完成的。
  前面我们介绍过,数据字典表的元数据也是保存在数据字典表中的。
  MySQL启动过程中,要先打开数据字典表才能拿到数据字典表的元数据,而要拿到数据字典表的元数据,又必须先打开数据字典表。
  这个过程很绕,不是很好理解,我们来打个比方:数据字典表是一个房间,数据字典表的元数据是打开房间门的钥匙。
  现在问题来了,因为MySQL把数据字典表的元数据保存在数据字典表中,这就相当于把打开房间门的钥匙落在房间里了。
  要想打开房间,必须先拿到钥匙,而要想拿到钥匙又必须先打开房间,这样一转换,问题是不是更好理解点了?
  我们先来想想怎么解决房间和钥匙问题,如果把打开房间的钥匙落在房间里了,有哪些办法可以解决?
  我能想到的有以下3种解决方案:暴力破解,把锁撬开。找专业的开锁师傅把锁打开。用备用钥匙开门。这个方法最好,但是有个前提条件:已经提前准备好了备用钥匙。
  MySQL里没有前2种方案,而是留了一把备用钥匙,也就是第3种方案,接下来我们看看MySQL打开数据字典表的过程:
  第1步,和创建数据字典表一样,把代表每个数据字典表的Objecttable对象注册到Systemtables类的实例属性mregistry中。
  每个数据字典表的Objecttable对象中,都定义了这个表的表名、字段、索引、外键等信息。
  Objecttable对象中保存的并不是DDL语句,却类似于我们建表时的DDL语句。
  下面这个例子是源码中表空间数据字典表mysql。tablespacesObjecttable对象中定义的该表的信息:Tablespaces::Tablespaces(){表名mtargetdef。settablename(tablespaces);字段mtargetdef。addfield(FIELDID,FIELDID,idBIGINTUNSIGNEDNOTNULLAUTOINCREMENT);mtargetdef。addfield(FIELDNAME,FIELDNAME,nameVARCHAR(268)NOTNULLCOLLATEStringtype(Objecttabledefinitionimpl::namecollation()mcollname));mtargetdef。addfield(FIELDOPTIONS,FIELDOPTIONS,optionsMEDIUMTEXT);mtargetdef。addfield(FIELDSEPRIVATEDATA,FIELDSEPRIVATEDATA,seprivatedataMEDIUMTEXT);mtargetdef。addfield(FIELDCOMMENT,FIELDCOMMENT,commentVARCHAR(2048)NOTNULL);mtargetdef。addfield(FIELDENGINE,FIELDENGINE,engineVARCHAR(64)NOTNULLCOLLATEutf8generalci);mtargetdef。addfield(FIELDENGINEATTRIBUTE,FIELDENGINEATTRIBUTE,engineattributeJSON);索引mtargetdef。addindex(INDEXPKID,INDEXPKID,PRIMARYKEY(id));mtargetdef。addindex(INDEXUKNAME,INDEXUKNAME,UNIQUEKEY(name));如果有外键等其它信息,也会加在这里}
  第2步,循环mregistry中的所有表,通过Objecttable得到数据字典表的DDL,然后调用dd::executequery()执行DDL语句创建数据字典表。
  和创建数据字典表中的第2步不一样,dd::executequery()执行DDL,并不会真正的创建表,只是为了生成数据字典表元数据,并把元数据保存到Storageadapter类的实例属性mcoreregistry中。
  保存到mcoreregistry中的数据字典表元数据,就是我们前面说的备用钥匙,有了这把备用钥匙,就能打开数据字典表了。
  第3步,循环mregistry中的所有表,通过第2步生成的数据字典表元数据,去mysql表空间中(表空间文件:mysql。ibd)读取各个数据字典表的元数据。
  这一步执行完成之后,所有数据字典表的元数据都被加载到内存中了,数据字典表都被打开了。
  第4步,循环mregistry中的所有表,把数据字典表的元数据从mcoreregistry删除。
  第5步,循环mregistry中所有的表,把从表空间中读取出来的数据字典表的元数据存入mcoreregistry中。
  不过,这一步存入mcoreregistry的并不是所有数据字典表的元数据,而是22个核心(CORE)数据字典表的元数据:catalogscharactersetscheckconstraintscollationscolumnstatisticscolumntypeelementscolumnsforeignkeycolumnusageforeignkeysindexcolumnusageindexpartitionsindexesresourcegroupsschematatablepartitionvaluestablepartitionstablestablespacefilestablespacestriggersviewroutineusageviewtableusage
  15步执行完成之后,mcoreregistry中就只包含上面22个核心数据字典表的元数据了,有了这些表的元数据,就可以打开其它所有表了。
  第6步,调用dd::executequery()执行FLUSHTABLES关闭已经打开的所有数据字典表、非数据字典表,后续就可以用从数据字典表中读取出来的元数据来打开数据字典表和其它所有需要的表了。
  到这里,打开数据字典表的大体流程就已经介绍完了,也许大家会有疑问:
  第2步调用dd::executequery()执行DDL,已经拿到了数据字典表的元数据。
  为了区分,把这里拿到的元数据叫作备用元数据。
  第3步根据备用元数据打开数据字典表,从表空间中读取到数据字典表的元数据。
  同样为了区分,把这里拿到的元数据叫作原配元数据。
  第4步从mcoreregistry中删除备用元数据。第5步把原配元数据存入mcoreregistry。
  数据字典表的备用元数据和原配元数据不是一样的吗?为什么还要用原配元数据替换备用元数据,这是不是多此一举?
  我没有逐个对比备用元数据和原配元数据是否完全一样,这是个不小的工程。不过,既然源码中这么实现,那应该是有它的原因,只是我还没有发现。如果后面发现其中的原因,我会再补充到我的博客中。6。总结
  要理解MySQL8。0中的数据字典表,核心是理解以下2点:初始化数据目录时,数据字典表的元数据是怎么存放到数据字典表中的?
  这主要是借助了Storageadapter类实例的mcoreregistry属性。
  在创建数据字典表的过程中,先创建每个数据字典表,并把元数据临时存放到mcoreregistry中,所有数据字典表都创建成功之后,最后再一次性把所有数据字典表的元数据保存到对应的数据字典表中。MySQL启动时,怎么用数据字典表的元数据打开数据字典表?
  这同时借助了硬编码在源码中的数据字典表定义,以及Storageadapter类实例的mcoreregistry属性。
  MySQL启动过程中,先通过Objecttable得到创建数据字典表的DDL,调用dd::executequery()执行DDL,拿到元数据(备用原数据),把备用元数据临时存放到mcoreregistry属性中,再通过备用元数据打开数据字典表。

大衣哥亲自道歉,前儿媳这次失算了近段时间,朱志文一家子的风波轰动全网,而陈亚楠曝出了大衣嫂说发洪水与自己不相干不慈善捐款的言论以后,更加是舆论哗然,没有人会想到身为公众人物的家属,会讲出那样不得体的话,一下子……据说,那是藏族一种独特的历史遗留文化?崇文尚礼,西陲宝地仍属礼仪之邦;热情好客,藏族同胞共是华夏儿女。关注小布的粉丝们都知道,小布的团队一直在做的就是传播西藏的文化、产物和风俗。在西藏这个佛教圣地……你们有没有感觉这一幕好像发生过?最近我经常恍惚,总有一种这一幕发生过的感觉,我总感觉这件事我经历过然后在上一世是按照坏的方向发展,心里老有一种不安的感觉。除此之外我睡觉总是做梦,做的梦都跟现实有关,比如……宁德云里雾里游三景闽地记游之九宁德,是福建省的一个地级市,在福建最东北角上。再往北,便进了浙江省的温州。网上查看宁德旅游攻略,点赞最多的是福鼎的太姥山和霞浦的三沙海滩,也有说宁德市区……质粒构建问题频出?一篇文章帮你扫清所有障碍研究一个蛋白质的第一步是拿到它准确的基因序列,有了基因序列,我们就可以构建合适的质粒,表达出所需要的蛋白。质粒构建,英文名为plasmidconstruction。选定的……粤水电购买广东建工集团100股权并配套募资事宜获证监会有条件粤水电11月9日公告,2022年11月9日,中国证监会上市公司并购重组审核委员会(以下简称并购重组委)召开2022年第20次并购重组委工作会议,对公司以发行股份的方式向广东省建……全球医疗健康旅游需求的增长为泰国带来发展前景新冠疫情后健康意识的提高和全球老龄化趋势正在推动全球医疗和健康旅游业的发展。对高技能专业人员以可承受的价格提供的健康和保健服务的需求增加了,泰国已成为一个受欢迎的目的地。……看了删减内容,我知道人民的名义为啥重播难了,难怪导演讳莫如深2017年3月,《人民的名义》横空出世。它以反腐倡廉为主题,不管是剧情的安排还是角色的演绎,都获得了观众非常高的评价,因此这无疑是一部经典好剧。按照一般常理,一部电……视频怎么转音频mp3在很多时候我们进行视频录制的时候,画面的内容过于模糊或是其他原因导致不可用。我们往往只需要那些视频的音频,音频播放通常选择mp3格式。那么视频怎么转音频mp3?一般正常处理方式……K联赛全明星36热刺,上演人情世故,现场让中超球迷羡慕北京时间7月13日晚19:00,韩国首尔世界杯体育场迎来了一场备受瞩目的对决,由K联赛全明星队对阵英超托特纳姆热刺队,本场比赛也是托特纳姆热刺的首场季前热身赛。尽管现场首尔是阴……发力数字经济,打造产业互联网之都!三龙湾赴深圳招商推介佛山再度携手深圳,让更多企业看到三龙湾科技城的城市机会!10月25日,由佛山市投资促进局、佛山中德工业服务区(佛山三龙湾科技城)管理委员会联合主办的2022佛山三龙湾科技……出现这4种表现,可能是血栓的征兆,细心点就能早察觉疾病入侵并非无迹可寻,许多信号会悄悄浮现。那些细心观察的人可以尽早发现,同时警觉起来并采取合理的改善措施,自然把疾病隐患消除。越来越多的人血液变得粘稠,胆固醇,甘油三酯水平超标……
双人成行获TGA2021年度游戏大奖,不愧是你祝贺《双人成行》荣获年度游戏奖!这次的大奖可以说是实至名归了,玩过的人知道这个消息估计都会露出姨母笑。《双人成行》这次的获奖有很多原因,在疫情侵袭的时候,各大IP工……王者荣耀幸运值最大值是多少幸运值多少满今天为大家带来的是王者荣耀幸运值最大值是多少,幸运值多少满?王者荣耀中喜欢点券夺宝的玩家都知道有个幸运值,那么幸运值多少会满呢?感兴趣的小伙伴一起来看看吧。王者荣耀点券夺……让马化腾失望了!Web3。0,毫无希望2018年,马化腾在知乎上问了一个问题:未来十年哪些基础科学突破会影响互联网科技产业?产业互联网和消费互联网融合创新,会带来哪些改变?四年过去了,许多被给予厚望的新……电竞经历新区七天开局攻略大家好,我是江湖人称一条柴,今天讲解下电竞经理萌新开区要做的事情。开区再不氪金,也最好弄个首冲小明,这样阵容更容易成型,进度加快些。体力值首先就是如下图右上角,这里……展望2022年,依旧看好游戏业今天聊一下展望未来。在2021年,米忽悠的原神这款游戏出海,为中国收割了巨量的老外的财富,阴差阳错之下,版号高度稀缺,导致精品游戏大爆发。处于良币驱逐劣币的正循环。……柯洁再当西南棋王自嘲忘了自己曾是冠军6月19日,四川航空熊猫之路杯2022年第21届西南棋王赛决赛在成都杜甫草堂战罢;中国围棋第一人柯洁战胜唐韦星,再度加冕西南棋王。这也是柯洁继第18届比赛后再度称霸西南棋王赛。……洋浦盐田独一无二的制盐工艺已传承千年,只能远观,航拍视角绝佳2016年春节,中央电视台有一档节目在全国引起轰动,它叫《航拍中国》。它的开篇就在海南拍摄的,美丽的风光,独特的视角,深深吸引了我,从此也拉开了我的航拍梦。能来洋浦航拍古盐田一……中国股市天玑科技朗玛信息等五家被严重低估的大数据企业导语:天玑科技、朗玛信息、银江技术、银信科技、数据港五家被严重低估的大数据优质企业。天玑科技公司致力于数据中心相关业务服务,主要业务包括外包服务、支持及维护服务、软件服务……红米note11pro的体验报告红米note11pro已经使用了好几天了。不得不说,这个手机性价比真的很高。在小米手机店买的8128版本的1799元。整个手机很方正,手感中规中矩,不是很重。……青蛙眼,蛤蟆嘴,大象腿,这9位明星的外形,真独特现在的颜控越来越多,很多人都是看人先看外形。说起外形,大部分人相貌平庸,极少数人美若天仙,小部分人其貌不扬。另外,还有一些人,长相比较独特。这些独特的长相,大概可以分为三部分,……什么?湖南向贵州学习!湖南举办首届旅发大会,而贵州已办十六届据官媒报道,湖南从2022年开始,将每年举办一届旅游产业发展大会,由各个市州轮流申办。湖南首届旅发大会将于2022年9月在张家界举办。这在湖南文旅界引起了不小的反响。湖南是首次……CBA常规赛接近尾声,辽宁能不能夺得常规赛冠军CBA常规赛第31轮已经全部结束,常规赛剩下七轮的情况下,上海、辽宁、浙江双雄同为25胜6负,分别排在积分榜第一到第四,榜首的竞争可谓是非常激烈。和之前的赛季不同,这个赛……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网