MySQL31张基表
1.数据字典表有哪些
按照官方文档的定义,MySQL 8.0 一共有 31 张数据字典表:
dd_properties 标识数据字典属性,例如其版本。服务器 使用它来确定数据字典是否必须 已升级到较新版本。
innodb_ddl_log Stores DDL logs for crash-safe DDL operations.
catalogs catalog信息
character_sets 可用字符集
check_constraints 表上的约束
collations 每种字符集的排序规则
column_statistics 列的直方图信息
column_type_elements 列的使用类型信息
columns 列
events 有关事件调度程序的信息事件 If the server is started with the --skip-grant-tables option, the event scheduler is disabled and events registered in the table do not run.
foreign_key_column_usage
foreign_keys
index_column_usage
index_partitions Information about partitions used by indexes.
index_stats Used to store dynamic index statistics generated when ANALYZE TABLE is executed.
indexes
parameter_type_elements Information about stored procedure and function parameters, and about return values for stored functions.
parameters Information about stored procedures and functions
resource_groups
routines nformation about stored procedures and functions
schemata 模式(表空间)
st_spatial_reference_systems
table_partition_values Information about values used by table partitions.
table_partitions Information about partitions used by tables.
table_stats Information about dynamic table statistics generated when ANALYZE TABLE is executed.
tables
tablespace_files
tablespaces
triggers
view_routine_usage
view_table_usage
2.查看数据字典表
默认情况下,我们是看不到数据字典表的,需要满足以下条件才能看到:
1.源码编译 Debug 版本 MySQL,以使用 cmake 编译为例,需要带上 -DCMAKE_BUILD_TYPE=Debug 编译选项。
2.连接 MySQL 之后,先执行下面的 SQL 告诉 MySQL 跳过数据字典表的权限检查:
SET SESSION debug = '+d,skip_dd_table_access_check';
满足以上 2 个条件之后,执行下面这条 SQL 就可以看到所有数据字典表了:
SELECT a.name AS db_name, b.*
FROM mysql.schemata AS a INNER JOIN mysql.tables AS b
ON a.id = b.schema_id
WHERE b.schema_id = 1 AND b.hidden = 'System'
ORDER BY b.id;
执行上面的 SQL 列出来的表有 32 个,其中 innodb_dynamic_metadata 表不属于数据字典表。
===============================================================================================================
1.概述
MySQL 8.0 对数据字典进行了重构,用户表、数据字典表、MySQL 其它系统表的元数据都统一保存到 mysql 库的数据字典表中了。
mysql 库中,除了 general_log、slow_log 2 个日志表,其它所有表的存储引擎都是 InnoDB,伴随而来的是 DDL 终于能够支持原子操作了。 ----在mysql文件里,其他在mysql.ibd
MySQL 8.0 重构数据字典之后,废除了 MySQL 5.7 中用于保存元数据的磁盘文件:.frm、.par、.TRN、.TRG、.isl、db.opt、ddl_log.log。
这些文件被废除之后,原本保存到这些文件中的元数据,都保存到数据字典表中了。 ---mysql.ibd
数据字典表本身也大变样了:
数据字典表不再位于 InnoDB 系统表空间,而是迁移到 mysql 库中,mysql 库位于 mysql 表空间,磁盘文件为 mysql.ibd。
SYS_TABLES、SYS_COLUMNS、SYS_INDEXES、SYS_FIELDS 这 4 个数据字典表也不再完全依赖硬编码在源码中的元数据了,而是和其它表一样,使用保存在 mysql 库的数据字典表中的元数据。---上面4个数据字典表的名字也发生了变化,后面会介绍。
上面列出的数据字典表中,有 4 个需要重点介绍,因为不管是数据字典表本身,还是用户表,都离不开这 4 个表:
tables:存储表的元数据,包括表空间 ID、数据库 ID、表 ID、表名、表注释、行格式等信息,对应 MySQL 5.7 中的数据字典表 SYS_TABLES。
columns:存储表中字段的元数据,包括表 ID、字段 ID、字段名、字段注释、字段类型、是否自增等信息,对应 MySQL 5.7 中的数据字典表 SYS_COLUMNS。
indexes:存储表的索引元数据,包括表空间 ID、表 ID、索引 ID、索引名、索引注释、是否是隐藏索引等信息,对应 MySQL 5.7 中的数据字典表 SYS_INDEXES。
index_column_usage:存储索引中字段的元数据,包括索引 ID、字段 ID、字段在索引中的编号(从 1 开始)、索引字段长度(如果是前缀索引字段,则是前缀的长度)、索引字段排序、是否隐藏,共 6 个字段,对应 MySQL 5.7 中的数据字典表 SYS_FIELDS。
这个表中没有包含更详细的字段信息,如果需要,可以通过字段 ID 到 columns 表获取。
index_column_usage 和 SYS_FIELDS 表不完全一样,有 2 点需要说明:
index_column_usage 包含 6 个字段,比 SYS_FIELDS 多 3 个字段:
order:表示索引字段的排序。
length:hidden = 0 时,表示索引字段长度,或前缀索引字段的前缀长度;hidden = 1 时,字段值为 NULL。
hidden:0 表示索引中该字段由用户定义;1 表示索引中该字段是 MySQL 给加上的。
除了在 Debug 版本的 MySQL 中设置跳过数据字典表的权限检查之外,还可以通过 information_schema 数据库中的表或视图查看其对应的数据字典表:
====================================================================================================================
2.数据字典表元数据在哪里?
数据字典表用于存储用户表的元数据,这个比较好理解,因为创建用户表的时候,所有数据字典表都已经存在了,把用户表的各种元数据插入到相应的数据字典表就可以了。
数据字典表本身的元数据也会保存到数据字典表里,但是某个数据字典表创建的时候,有一些数据字典表还没有创建,这就有问题了。
例子: =
我们以 columns、indexes 这 2 个数据字典表为例来说明:columns 表先于 indexes 表创建,columns 表创建成功之后,需要把索引元数据保存到 indexes 表中,而此时 indexes 表还没有创建,
columns 表的索引元数据自然也就没办法保存到 indexes 表中了。
MySQL 解决这个问题的方案是引入一个中间层,用于临时存放所有数据字典表的各种元数据,等到所有数据字典表都创建完成之后,再把临时存放在中间层的所有数据字典表的元数据保存到相应的数据字典表中。
这里所谓的中间层实际上是一个存储适配器,源码中对应的类名为 Storage_adapter,这是一个实现了单例模式的类。
MySQL 在初始化数据目录的过程中,Storage_adapter 类的实例属性 m_core_registry 就是所有数据字典表元数据的临时存放场所。
===================================================================================================================
1.源码编译debug版本MySQL:
源码编译参数:
-DWITH_BO0ST:指定Boost库的位置。
-DENABLE_DOWNLOADS:自动下载某些扩展文件,如Googletest。如果在内网环境中,则可不指定
-DBUILD_CONFIG=mysql_release:使用官方二进制包的编译选项。
当然,也可指定其他选项。常用的编译选项如下。
-DCMAKE_BUILD_TYPE:build的类型,如果要编译成 debug版本,需将该选项设置为 Debug。
-DWITH_DEBUG:是否编译成debug版本。若设置为1,效果同-DCMAKE_BUILD_TYPE=Debug 一样
-DCMAKE_INSTALL_PREFIX:指定安装目录的位置,默认为/usr/local/mysql。
-DMYSQL_DATADIR:指定数据目录的默认位置。
-DDEFAULT_CHARSET:指定默认字符集。
-DDEFAULT_COLLATION:指定字符集的默认校验规则
-DMYSQL_TCP_PORT:指定MySQLServer 的监听端口,默认为 3306。
-DMYSQL_UNIX_ADDR:指定套接字文件的位置,默认为/tmp/mysql.sock。
-WITHOUT_XXX_STORAGE_ENGINE:排除某些存储引擎的编译。
比如不编译 BLACKHOLE存储弓擎,可指定以下选项:
-WITH_XXX_STORAGE_ENGINE:指定某些存储引擎的编译。在二进制包中,默认不支持FEDERATED引擎。如果要开启,只能编译源码,
且需指定以下选项:-DWITH FEDERATED STORAGE ENGINE=1
-DWITHOUT_SERVER:是否编译 MySQLServer。如果设置为1,则不会编译.
操作:
1.装依赖 ---能连外网的yum源
yum install cmake3 gcc gcc-c++ glibc ncurses-devel openssl-devel libaio-devel
2.解压
mv mysql-boost-8.0.25.tar.gz /usr/src/
tar -xvf mysql-boost-8.0.25.tar.gz
3.cmake配置编译文件
cd mysql-8.0.25/
mkdir build --由于在当前目录下装会报错
cd build/
cmake3 /usr/src/mysql-8.0.25/ -DWITH_BOOST=/usr/src/mysql-8.0.25/boost/boost_1_73_0 -DENABLE_DOWNLOADS=1 -DCMAKE_BUILD_TYPE=Debug -DWITH_DEBUG=1 -DCMAKE_INSTALL_PREFIX=/usr/locl/mysqlsrc/ -DMYSQL_TCP_PORT=3209 -DMYSQL_UNIX_ADDR=/tmp/mysqlsrc.sock
报错:yum install centos-release-scl
yum install devtoolset-10-gcc devtoolset-10-gcc-c++
注意:如果在CMake过程中出现问题,那么当解决完问题重新CMake时,需要先删除当前目录下的CMakeCache.txt文件。
4.make编译
make -j 2 --并行大了内存不够会报错
5.安装
make install --安装到指定安装位置
6.初始化实例:
省略。