MySQL数据字典14章

目录

14.1数据字典模式
14.2去除基于文件的元数据存储
14.3事务性存储数据字典
14.4词典对象缓存
14.5 information_schema和数据字典的整合
14.6系列词典信息(SDI)
14.7数据字典的用法差异
14.8日词典的局限性

MySQL服务器包含一个事务的数据字典存储关于数据库对象的信息。在以前的MySQL版本,字典数据存储在元数据文件,非事务表,存储引擎的具体数据字典。

本章介绍的主要特点、效益、用法的差异,并对数据字典的局限性。对于数据字典功能的其他含义,是指数据字典的笔记部分在MySQL 8版本说明

对MySQL数据字典的好处包括:

重要

数据字典功能的服务器需要一些运作上的差异相比,服务器没有数据字典;看14.7节,“数据字典的用法的差异”。同时,升级到MySQL 8,升级程序有所不同从以前的MySQL版本,要求您验证您的安装升级准备通过检查特定的先决条件。有关更多信息,参见2.10.1节,“升级MySQL”,特别是验证你的MySQL 5.7安装升级的先决条件

14.1数据字典模式

数据字典表的保护,只可在调试版本中访问MySQL。然而,MySQL支持访问存储在数据字典表的数据INFORMATION_SCHEMA表和SHOW声明.对于包含数据字典表的概述,看数据字典表

MySQL数据库系统表中仍然存在MySQL 8可通过发布一个视SHOW TABLES声明对MySQL系统数据库。一般来说,MySQL系统表和数据字典表,系统表包含辅助数据如时区和帮助信息之间的差异,而数据字典表包含需要执行SQL查询的数据。MySQL系统表和数据字典表也不同,他们是如何升级。升级系统需要运行MySQL表mysql_upgrade。数据字典升级由MySQL服务器管理。看到数据字典是如何升级

数据字典是如何升级

MySQL的新版本可能包括数据字典表的定义的变化。这种变化是在新安装的版本的MySQL,但当执行在MySQL的二进制文件升级,变化时应用MySQL服务器重新启动,使用新的二进制文件。在启动时,服务器的数据字典版本相比,存储在数据字典来确定数据字典表应该升级版本信息。如果升级是必要的,支持的,服务器的数据字典表更新的定义创建副本的元数据,坚持新表,自动替换旧表换新的,并重新初始化数据字典。如果升级是不必要的,启动继续不更新数据字典表。

数据字典表的升级是一个原子操作,这意味着所有的数据字典表更正或操作失败。如果升级操作失败,服务器启动失败,错误。在这种情况下,旧的服务器的二进制文件可以使用旧数据目录启动服务器。当新的服务器的二进制文件是用重新启动服务器,数据字典升级重新尝试。

一般来说,在数据字典表成功升级,这是不可能使用旧服务器的二进制文件启动服务器。作为一个结果,降级MySQL服务器的二进制文件之前的MySQL版本不支持升级后的数据字典表。

这个mysqld--no-dd-upgrade选项可以用来防止启动时的数据字典表的自动升级。什么时候--no-dd-upgrade指定的服务器,发现服务器数据字典版本不同,存储在数据字典的版本,启动失败,错误信息:数据字典升级是禁止的。

查看数据字典表使用调试版本的MySQL

数据字典表的保护,默认情况下也可以通过调试支持编译MySQL访问(使用-DWITH_DEBUG=1CMake选项),指定+d,skip_dd_table_access_checkdebug选择改性剂。有关编译调试版本的信息,参见第28.5.1.1,编译调试MySQL

警告

或直接修改数据字典表的写作是不可取的,可能使你的MySQL实例操作。

经过调试支持编译MySQL,使用这SET语句使数据字典表可见的MySQL客户端会话

mysql> SET SESSION debug='+d,skip_dd_table_access_check';

使用此查询来检索列表数据字典表:

mysql> SELECT name, schema_id, hidden, type FROM mysql.tables where schema_id=1 AND hidden='System';

使用SHOW CREATE TABLE查看数据字典表的定义。例如:

MySQL的>SHOW CREATE TABLE mysql.catalogs\G

14.2去除基于文件的元数据存储

在以前的MySQL版本,词典数据部分存储在元数据文件。基于元数据的存储文件的问题包括昂贵的扫描文件,文件系统相关的错误的敏感性,用于复制和故障恢复故障状态处理复杂的代码,和缺乏可扩展性,使得它很难添加新功能和关联对象的元数据。

下面所列的元数据文件删除MySQL。除非另有说明,以前存储在元数据文件中的数据是存储在数据字典表。

  • .frm文件:表的元数据文件。与去除。FRM文件

    • 64KB大小限制的表定义.frm文件结构被移除

    • 这个INFORMATION_SCHEMA.TABLES版本报道一个硬编码的值10,这是最后一次FRM使用MySQL 5.7版本。

  • .par文件:分区定义文件InnoDB停止使用的分区定义文件在MySQL 5.7的本地分区支持的介绍InnoDB

  • .TRN文件:触发命名空间的文件。

  • .TRG文件:触发参数文件

  • .isl文件InnoDB符号链接文件的位置文件表表空间的数据文件创建目录外。

  • db.opt文件:数据库配置文件。这些文件,每一个数据库目录,包含数据库的默认字符集属性。

14.3事务性存储数据字典

在事务性数据字典数据存储字典(InnoDB)表。数据字典表位于MySQL数据库与非数据字典系统表。

数据字典表是建立在一个单一InnoDB表空间的名字mysql.ibd,它驻留在MySQL数据目录。这个mysql.ibd表空间文件必须驻留在MySQL数据目录和名称不能修改或使用另一个表空间。

数据字典是由相同的提交、回滚和崩溃恢复功能,保护,保护用户数据存储在InnoDB

14.4词典对象缓存

字典对象缓存是一个共享的全局缓存存储以前访问数据字典对象在内存使对象重用和减少磁盘I/O。类似于其他缓存机制使用MySQL,字典对象缓存使用LRU基于战略驱逐驱逐最近最少使用的对象从内存。

字典对象缓存包括缓存分区存储不同类型的对象。一些缓存分区的大小限制是可配置的,而有些是硬编码。

  • 表空间定义缓存分区这是一个很好的例子。thetablespace_definition_cache选项设置为表定义的对象可以存储在字典对象缓存数量限制。默认值是256。

  • 架构定义缓存分区对象:存储架构定义。《schema_definition_cache选项设置为架构定义的对象可以存储在字典对象缓存数量限制。默认值是256。

  • 表定义缓存分区:存储表定义对象。对象限制设置的值max_connections,它的默认值为151。

    表定义缓存分区并行存在与表定义缓存配置为使用table_definition_cache配置选项。两者的缓存存储表的定义但为MySQL服务器的不同部分。在一个缓存对象的其他对象的存在不依赖。

  • 存储程序定义缓存分区定义:数据仓库存储的程序。《stored_program_definition_cache选项设置为存储程序定义的对象可以存储在字典对象缓存数量限制。默认值是256。

    存储程序定义缓存分区并行存在的存储过程和存储功能的缓存配置使用stored_program_cache选项

    这个stored_program_cache选项设置为多少缓存存储过程或函数的每个连接的上限,并限制了每次连接执行一个存储过程或函数。存储程序定义缓存分区,另一方面,是一个共享的高速缓存存储用于其它用途的存储程序中定义的对象。在存储程序定义缓存分区对象的存在不依赖于对象的存在在存储过程缓存或存储功能的缓存,反之亦然。

  • 字符集定义缓存分区:存储字符集定义的对象和有256的硬编码的对象限制。

  • collation定义缓存分区整理的定义:存储对象和有256硬编码的对象限制。

关于字典对象缓存配置选项有效值的信息,参见第5.1.7,服务器“系统变量”

14.5 information_schema和数据字典的整合

随着数据字典的介绍,如下INFORMATION_SCHEMA表是数据字典表的视图实现:

这些表的查询现在更有效,因为他们从数据字典表,而不是通过其他手段获取信息,慢。特别是,每个INFORMATION_SCHEMA表,在数据字典表的视图:

  • 服务器不再必须创建一个临时表的查询INFORMATION_SCHEMA

  • 当底层数据字典表存储值由先前获得的扫描目录(例如,枚举数据库名或表名在数据库)或打开文件的操作(例如,从中读取信息.frm文件),information_schema这些值的查询现在用查表代替。(此外,即使非观INFORMATION_SCHEMA表,诸如数据库和表的名称检索查找的数据字典和不需要的目录或文件扫描。)

  • 对基础数据字典表索引允许优化器构建高效的查询执行计划,为实施前处理的东西不是真实的INFORMATION_SCHEMA使用临时表的查询

前面的改进也适用SHOW报表显示相应的信息information_schema表,数据字典表的视图。例如,SHOW DATABASES显示相同的信息SCHEMATA

除了对数据字典表意见的出台,在包含统计表STATISTICSTABLES表现在缓存来提高INFORMATION_SCHEMA查询的性能。Theinformation_schema_stats_expiry系统变量定义了前一段时间的缓存表统计到期。默认是八万六千四秒(24h)。如果没有缓存的统计或统计已经过期,数据从存储引擎在查询统计表列检索。更新缓存值在任何时间对于一个给定的表,使用ANALYZE TABLE

information_schema_stats_expiry可设置INFORMATION_SCHEMA查询检索的最新统计数据直接从存储引擎,它不是快速检索缓存统计。

有关更多信息,参见8.2.3章节,“优化information_schema查询”

14.6系列词典信息(SDI)

除了在数据字典中存储关于数据库对象的元数据,MySQL存储在序列化形式。这一数据称为序列化的字典信息(SDI)。InnoDBSDI数据表文件在其商店。SDI数据存储在其他商店的发动机SDI这是在架构中创建目录文件。SDI数据在一个紧凑的产生JSON格式

序列化的字典信息(SDI)是目前在所有InnoDB表空间文件除临时表空间和undo表空间文件。在一个SDI记录InnoDB表空间文件描述表和表空间的对象包含在表空间。

在一个SDI数据InnoDB表空间文件只有更新表的DDL操作的表空间。

SDI数据存在冗余提供元数据。例如,如果数据字典不可用,对象元数据可以直接提取InnoDB表空间文件使用ibd2sdi工具

InnoDBSDI的记录,需要一个单独的索引页,这是16K大小默认。然而,SDI数据压缩,减少存储的足迹。

对于分区InnoDB由多个表空间,表,SDI的数据被存储在第一分区表空间文件。

MySQL服务器使用内部API访问期间DDL操作来创建和维护SDI记录。

这个IMPORT TABLE声明进口MyISAM基于信息表中.sdi文件有关更多信息,参见第13.2.5,“导入表语法”

14.7数据字典的用法差异

使用数据字典功能的MySQL服务器需要与服务器没有数据字典的一些运作上的差异:

  • 此前,使innodb_read_only系统变量不能创建和删除表只为InnoDB存储在MySQL 5.0,使innodb_read_only防止这些操作对所有的存储引擎。表的创建和删除操作的任何存储引擎修改数据字典表MySQL系统的数据库,但这些表的使用InnoDB存储引擎不能修改时innodb_read_only启用。同样的原则也适用于其他表的操作,需要修改数据字典表。实例:

    笔记

    有可能innodb_read_only也有在非数据字典表的重要意义MySQL系统数据库。详情见描述innodb_read_only进入15.13节,“InnoDB启动选项和系统变量”

  • 此前,中的表mysql系统的数据库是DML和DDL语句可见。在MySQL 8中,数据字典表是不可见的,不能被修改或直接查询。然而,在大多数情况下都有相应的information_schema表格可以查询代替。这使基础数据字典表被改变作为服务器开发收益,同时保持一个稳定的INFORMATION_SCHEMA应用界面的使用

  • INFORMATION_SCHEMA在MySQL 8表紧密相关的数据字典,导致几个用法的差异:

    • 以前,INFORMATION_SCHEMA在统计表的查询STATISTICSTABLES直接从表中检索数据的存储引擎。在MySQL 8,缓存统计表是默认的。这个information_schema_stats_expiry系统变量定义了前一段时间的缓存表统计到期。默认是八万六千四秒(24h)。(更新缓存的值在一个给定的表,任何时间使用ANALYZE TABLE。)如果没有缓存的统计或统计已经过期,数据从存储引擎在查询统计表列检索。要检索的最新统计数据直接从存储引擎,集information_schema_stats_expiry。有关更多信息,参见8.2.3章节,“优化information_schema查询”

    • 几个INFORMATION_SCHEMA表是数据字典表的视图,使优化器使用索引的基础表。因此,根据优化器的选择,结果的排序information_schema查询可能不同于以前的结果。如果一个查询的结果必须有具体的行排序的特点,包括ORDER BY条款.

    • mysqldumpmysqlpump不再倾倒INFORMATION_SCHEMA数据库,即使明确指定的命令行。

    • CREATE TABLE dst_tbl LIKE src_tbl要求src_tbl是一个基本表和失败,如果它是一个information_schema表,在数据字典表的视图。

    • 此前,结果列选择标题INFORMATION_SCHEMA表用于查询指定的资本化。该查询产生的结果集的一头

      SELECT table_name FROM INFORMATION_SCHEMA.TABLES;
      

      在MySQL 8,这些标题都是大写;前面的查询产生的结果集的一头TABLE_NAME。如果有必要,一列别名可以用来实现不同的lettercase。例如:

      选择“从information_schema.tables table_name table_name;
  • 数据目录的影响如何mysqldumpmysqlpump把信息从mysql系统数据库:

    • 此前,有可能把所有的表中mysql系统数据库。在MySQL 5.0,mysqldumpmysqlpump自非数据字典表,数据库。

    • 此前,该--routines--events选择不需要存储程序和事件时,使用--all-databases选项包括:转储MySQL系统的数据库,因此也proc事件表中存储程序和事件的定义。在MySQL 5.0,的event触发不使用表。对于相应的对象定义存储在数据字典表,但这些表不甩了。包括存储程序和转储事件使用--all-databases,使用--routines--events选择明确

    • 此前,该--routines选择所需的SELECT特权的触发表在MySQL 8,该表是没有用的;--routines需要全球SELECT特权而

    • 此前,有可能把存储程序和事件定义连同他们的创建和修改时间戳,通过倾销proc事件表在MySQL 8,不使用这些表,因此不可能把时间戳。

  • 以前,创建一个存储程序,包含非法字符产生一个警告。在MySQL 8中,这是一个错误。

14.8日词典的局限性

本节描述了临时限制MySQL数据字典。

  • 数据目录下的数据库目录(例如,与手工创作mkdir)是不支持的。手动创建数据库目录不被认可的MySQL服务器。

  • DDL操作需要更长的时间,由于写入存储,撤消和重做日志记录,而不是.frm文件