欢迎关注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