欢迎关注MySQL 8.0必知必会系列课程。
MySQL8.0必知必会-自动化部署 https://edu.51cto.com/course/16368.html
MySQL8.0必知必会之参数标准化配置 https://edu.51cto.com/course/16358.html
1 主要内容
• 数据字典表
• 元数据文件
• INFORMATION_SCHEMA的变化
• Innodb的变化-SDI
• 使用数据字典后的变化
• 数据字典的局限性
2 数据字典表
2.1 在MySQL 8.0 以前的版本中
• 字典数据存储在元数据文件和非事务系统表中
• 存储引擎 MyISAM innodb csv
• SELECT TABLE_SCHEMA,TABLE_NAME,ENGINE FROM information_schema.TABLES a WHERE a.TABLE_SCHEMA in ('mysql') order by 1,3;
2.2 MySQL 8.0
• 事务数据字典,数据库对象的信息存储在事务表中。
• 存储引擎 innodb
• 数据字典表是不可见的
• 无法读取 SELECT
• 不会出现在输出中SHOW TABLES
• 未列在INFORMATION_SCHEMA.TABLES 表中
• 在大多数情况下INFORMATION_SCHEMA,可以查询相应的表(名称相同)。
• 从概念上讲,INFORMATION_SCHEMA提供了一个MySQL公开数据字典元数据的视图
2.3 查看隐藏的Data Dictionary表
1) cmake编译时,必须使用-DWITH_DEBUG=1
2) 设置debug参数
SET SESSION debug='+d,skip_dd_table_access_check’;
3) 查询mysql.tables字典表
SELECT name, schema_id, hidden, type FROM mysql.tables where schema_id=1 AND hidden='System’;
4) 访问字典表
SHOW CREATE TABLE mysql.catalogs\G
l 隐藏的数据字典表
l 打开debug
l 未打开debug
l 数据字典表
catalogs |
目录信息。 |
character_sets |
有关可用字符集的信息。 |
collations |
有关每个字符集的排序规则的信息。 |
column_statistics |
列值的直方图统计信息。 |
column_type_elements |
有关列使用的类型的信息。 |
columns |
有关表中列的信息。 |
dd_properties |
标识数据字典属性(例如其版本)的表。服务器使用它来确定是否必须将数据字典升级到较新的版本。 |
events |
有关事件计划程序事件的信息。 |
foreign_keys, foreign_key_column_usage |
有关外键的信息。 |
index_column_usage |
有关索引使用的列的信息。 |
index_partitions |
有关索引使用的分区的信息。 |
index_stats |
用于存储ANALYZE TABLE执行时生成的动态索引统计信息。 |
indexes |
有关表索引的信息。 |
innodb_ddl_log |
存储DDL日志以进行崩溃安全的DDL操作。 |
parameter_type_elements |
有关存储过程和函数参数的信息,以及有关存储函数的返回值的信息。 |
parameters |
有关存储过程和函数的信息。 |
resource_groups |
有关资源组的信息。 |
routines |
有关存储过程和函数的信息。 |
schemata |
有关schemata的信息。该表提供了有关数据库的信息。 |
st_spatial_reference_systems |
有关空间数据的可用空间参考系统的信息。 |
table_partition_values |
有关表分区使用的值的信息。 |
table_partitions |
有关表使用的分区的信息。 |
table_stats |
有关ANALYZE TABLE执行时生成的动态表统计信息的信息。 |
tables |
有关数据库中表的信息。 |
tablespace_files |
有关表空间使用的文件的信息。 |
tablespaces |
有关活动表空间的信息。 |
triggers |
有关触发器的信息。 |
view_routine_usage |
有关视图与它们使用的存储函数之间的依赖关系的信息。 |
view_table_usage |
用于跟踪视图及其基础表之间的依赖关系。 |
3 元数据存储
• 先前存储在元数据文件中的数据现在存储在数据字典表
• 被删除的元数据文件
• .frm:表元数据文件。
• .par:分区定义文件。
• .TRN :触发命名空间文件。
• .TRG :触发器参数文件。
• .isl:InnoDB符号链接文件,包含在数据目录外部创建的每表文件表空间文件的位置。
• db.opt:数据库配置文件。
l isl 文件
• Mysql 5.7.22
• create table test(a int) DIRECTORY=‘/home/mysql/’ ENGINE= innodb;
• Mysql 8.0.11
• create table test1(a int) DIRECTORY=‘/home/mysql/’ ENGINE= innodb;
4 数据存储
• 字典数据存储在innodb表
• 数据字典表和非数据字典系统表都存储在mysql数据库
• mysql.ibd
• 位于datadir目录中
• 存储数据库字典表
• 只用于MySQL 数据字典数据
• 文件名字禁止修改,不能被其他表空使用
• 具备事务的特性
• commit
• rollback
• crash-recovery
5 字典对象缓存
• 共享的全局缓存
• 将先前访问的数据字典对象存储在内存中,便于重用对象,减少磁盘I / O
• 使用 LRU的策略删除最近最少使用的对象
• tablespace定义缓存分区
• 存储数据字典表空间定义对象
• tablespace_definition_cache
• 可以存储在字典对象高速缓存中的表空间定义对象数(已使用和未使用)的数量。
• 默认值为256。
• 0,表示仅保存使用的表空间定义对象
• 当在用的表空间定义对象数量小于tablespace_definition_cache的值时,可以保存未使用的表空间定义对象
6 INFORMATION_SCHEMA
6.1 数据字典表的视图
• datadir下没有information_schema目录
• 直接从数据字典表获取信息,查询效率更高
• 改进点:
• 查询INFORMATION_SCHEMA表时,不创建临时表
• 直接通过数据字典表获取数据,不在通过目录扫描(show databases,show tables)或文件打开(从frm读取信息)获取数据。
• 允许使用索引构建有效的执行计划
• 缓存STATISTICS和 TABLES中的表统计信息
6.2 执行计划
EXPLAIN SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY WHERE CHARACTER_SET_NAME = 'utf8mb4';
7 统计信息
7.1 INFORMATION_SCHEMA表包含提供表统计信息的列:
• STATISTICS.CARDINALITY
• TABLES.AUTO_INCREMENT
• TABLES.AVG_ROW_LENGTH
• TABLES.CHECKSUM
• TABLES.CHECK_TIME
• TABLES.CREATE_TIME
• TABLES.DATA_FREE
• TABLES.DATA_LENGTH
• TABLES.INDEX_LENGTH
• TABLES.MAX_DATA_LENGTH
• TABLES.TABLE_ROWS
• TABLES.UPDATE_TIME
• 统计信息来源于mysql.index_stats、mysql.table_stats
• 缓存的统计信息有过期时间
• 缓存的统计信息不可用或已过期时,MySQL将从存储引擎中检索最新的统计信息,并更新mysql.index_stats和 mysql.table_stats字典表。
• 查询优先检索缓存的统计信息,直到缓存的统计信息过期
7.2 以下情况不更新统计信息:
• 缓存统计信息尚未过期时。
• information_schema_stats_expiry 设置为0。
• 当服务器打开read_only, super_read_only, transaction_read_only,或 innodb_read_only模式。
• 当查询还需要获取Performance Schema数据时。
• 手工更新给定表的缓存值,请使用 ANALYZE TABLE
7.3 information_schema_stats_expiry
• 定义缓存统计信息到期时间段
• 单位:秒
• 默认值为86400秒(24小时) ,但时间段可以延长至一年。
• 0:要始终直接从存储引擎检索最新统计信息并绕过缓存值
• 会话变量
• 每个客户端会话都可以定义自己的到期值。
• 从存储引擎检索并由一个会话缓存的统计信息可供其他会话使用。
8 序列化字典信息(SDI)
8.1 元数据存储的两种方式:
• 数据字典表
• 序列化字典信息(SDI)
• 不同存储引擎SDI的存储方式:
• Innodb存储引擎:存储在其表空间文件中
• 其他存储引擎: 将SDI数据存储在对应schema目录下.sdi文件中
• SDI数据以紧凑JSON格式存储
8.2 innodb
• 存储在除临时表空间和撤消表空间文件之外的所有表空间文件中
• 仅记录了表空间中包含的表和表空间对象的描述。
• 仅通过表空间中的表上的DDL操作进行更新
• 单独使用一个16K的索引页,以压缩的方式存储SDI 信息
• 提供了元数据冗余。例如,如果数据字典变得不可用,则可以InnoDB 使用ibd2sdi工具直接从表空间文件中提取对象元数据
• /usr/local/mysql8/bin/ibd2sdi --dump-file=test.sdi /mysqldb/db_vastdata8/data/sakila/city.ibd
9 使用数据字典后的变化
9.1 innodb_read_only
• 阻止所有存储引擎的创建和删除表操作
• 任何存储引擎的表创建和删除操作都会修改mysql系统数据库中的数据字典表
• ANALYZE TABLE 失败,因为它更新了表统计信息,这些统计信息存储在数据字典中。
• ALTER TABLE tbl_name ENGINE=engine_name 失败,因为它更新了存储在数据字典中的存储引擎名称。
9.2 CREATE TABLE dst_tbl LIKE src_tbl
• 要求它 src_tbl是一个基表,如果它是一个INFORMATION_SCHEMA 数据字典表视图的表,则会失败。
• create table t like information_schema.tables;
9.3 mysqldump 和mysqlpump
• 只导出该数据库中的非数据字典表
• proc and event表不在使用
• 导出routines and events时,必须使用--all-databases --routines --events
• --routines 需要select on *.*权限
• 导出routine and event 时,无法导出creation and modification timestamps
• stored routine 创建时,如果包括非法字符,会直接报错。以前的版本只是抛出warning
10 数据字典的局限性
• MySQL服务器无法识别手动创建的数据库目录。
• 不支持在数据目录下手动创建数据库目录(例如,使用mkdir)
• DDL操作耗时变长
• 不是单纯的修改.frm文件
• 需要写入redo log和undo log
• [mysql@localhost data]$ mkdir zhumh