MySQL 8.0 Data Dictionary显示

news2024/11/29 18:45:18

数据字典

对于MySQL的系统库都不会陌生,因为是基本框架,支撑着MySQL有效运行。这些系统库提供诸多功能,如:账号,表,存储过程,表空间,性能监控,配置 等基础信息。系统库目前有4个大类schema组成:mysql,information_schema,performance_schema,sys。都有各自的特性和运行模式。

  • mysql
    最基本的基础元数据元表,它包含一些表存储MySQL服务器在运行时所需的信息。这些表InnoDB引擎utf8字符集的实际物理储存表(在MySQL8.0版本中已经去掉MyISAM引擎)。

  • INFORMATION_SCHEMA:
    提供对数据库元数据、MySQL服务器的信息(如数据库或表的名称、列的数据类型或访问权限)的访问。有时用于此信息的其他术语是数据字典和系统目录。视图组成。DDL是不允许执行的。

  • Performance Schema:
    MySQL性能模式是一种在低级别上监视MySQL服务器执行的特性。内存表组成。DDL是不允许执行的。

  • sys
    这是帮助dba和开发人员解释性能模式收集的数据的对象。Sys对象可用于典型的调优和诊断用例。视图组成。DDL是不允许执行的。

从上述结构中,可以判断,mysql schema就是最核心的驱动表。但实际运行当中,这些数据字典表是不可见。考虑到安全问题和维护元数据正确性,避免随意更改,可能破坏整个系统,不在debug模式下,无法直接访问的。

同时不能人为 DDL和更改操作,也不会出现在SHOW表的输出中,也没有列在INFORMATION_SCHEMA.TABLES中。但可通过INFORMATION_SCHEMA的视图访问数据字典元数据。
WL#6391: Protect Data Dictionary tables

This WL restricts the availability of DD information to the users. We do not
want to expose DD tables directly to users, so access must happen through I_S.
Additionally, access to the system schema and tablespace is limited.

从MySQL 8.0开始,这些表是InnoDB(事务)表。以前版本是MyISAM(非事务性)表,因为事务特性,对于数据一致性不会产生任何影响。目前为止的MySQL 8.0的数据字典表如下:

开启方式

如访问,会提示如下错误:

mysql> SELECT name FROM mysql.tables where schema_id=1 AND hidden='System';
ERROR 3554 (HY000): Access to data dictionary table 'mysql.tables' is rejected.

权限判断:mysql-8.0.31\sql\dd\impl\dictionary_impl.cc

bool Dictionary_impl::is_dd_table_access_allowed(bool is_dd_internal_thread,
                                                 bool is_ddl_statement,
                                                 const char *schema_name,
                                                 size_t schema_length,
                                                 const char *table_name) const {
  /*
    From WL#6391, we have the following matrix describing access:
    For performance reasons, we first check the schema
    name to shortcut the evaluation. If the table is not in
    the 'mysql' schema, we don't need any further checks. Same for
    checking for internal threads - an internal thread has full
    access. We also allow access if the appropriate debug flag
    is set.
  */
  if (schema_length != MYSQL_SCHEMA_NAME.length ||
      strncmp(schema_name, MYSQL_SCHEMA_NAME.str, MYSQL_SCHEMA_NAME.length) ||
      is_dd_internal_thread ||
      DBUG_EVALUATE_IF("skip_dd_table_access_check", true, false))
    return true;

开始方式:
采用MySQL源码编译,同时添加参数-DWITH_DEBUG=1配置选项。可以通过执行:mysqld --help来检查是否开启调试。

shell#  mysqld --help | grep debug
mysqld  Ver 8.0.31-debug for Linux on x86_64 (Source distribution)

采用tar包下mysqld-debug执行文件,重新启动服务

mysqld-debug --defaults-file=/etc/my8.0.cnf  --user=mysql   &

权限开启

mysql> SET SESSION debug='+d,skip_dd_table_access_check';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@debug;
+------------------------------+
| @@DEBUG                      |
+------------------------------+
| d,skip_dd_table_access_check |
+------------------------------+
1 row in set (0.01 sec)
#访问基础表
mysql> SELECT name FROM mysql.tables where schema_id=1 AND hidden='System';
。。。

DD 表名说明
catalogs目录信息。
character_sets可用字符集的信息。
check_constraints关于表上定义的CHECK约束的信息。
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操作的崩溃安全日志。
parameter_type_elements关于存储过程和函数参数的信息,以及关于存储函数返回值的信息。
parameters存储过程和函数的相关信息。
resource_groups资源组信息。
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用于跟踪视图及其底层表之间的依赖关系。

表结构

InnoDB 引擎 utf8字符集

mysql> SHOW CREATE  TABLE mysql.tables\G;
*************************** 1. row ***************************
       Table: tables
Create Table: CREATE TABLE `tables` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `schema_id` bigint unsigned NOT NULL,
  `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_tolower_ci NOT NULL,
  `type` enum('BASE TABLE','VIEW','SYSTEM VIEW') COLLATE utf8_bin NOT NULL,
  `engine` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `mysql_version_id` int unsigned NOT NULL,
  。。。
  PRIMARY KEY (`id`),
  UNIQUE KEY `schema_id` (`schema_id`,`name`),
  UNIQUE KEY `engine` (`engine`,`se_private_id`)
) /*!50100 TABLESPACE `mysql` */ ENGINE=InnoDB AUTO_INCREMENT=2412 DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0 ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)

Debug模式下允许更改操作
正常模式下允许呈现基础表名,但无法进行操作,必须在debug模式下:

mysql> UPDATE  mysql.tables SET hidden='Visible' WHERE name='catalogs';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 

总结

Data Dictionary Table是系统的根本,同时数据也非常敏感,必须保护这些表不受DDL的影响,同时不受人为的更改。不了解底层实现原理下,一旦更改那就是灾难性的,所以应该保持隐藏。

但对于开源来说,围绕这些基础表,理解设计理念,通过更改定义和字段,实现更多的便利功能。

参考

https://dev.mysql.com/worklog/task/?id=6391
https://dev.mysql.com/doc/refman/8.0/en/system-schema.html
https://dev.mysql.com/doc/refman/8.0/en/dbug-package.html
https://dev.mysql.com/doc/dev/mysql-server/latest/classdd_1_1tables_1_1DD__properties.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前沿技术RPA】 一文了解UiPath 使用Git管理项目

🐋作者简介:博主是一位.Net开发者,同时也是RPA和低代码平台的践行者。 🐬个人主页:会敲键盘的肘子 🐰系列专栏:UiPath 🦀专栏简介:UiPath在传统的RPA(Robotic…

【soc】— spluboot校验方法

【soc】— spl/uboot校验方法 一.常规校验/外部有存储介质 针对外部有存储介质的如nandFlash,norFlash,emmc,Sd等,常用的校验方法为:headerspl/uboot header:可定义为结构体,内容包括&#x…

全国366个市县日度空气质量数据(2016-2020年)(AQI,SO2,NO2,PM2.5,PM10)

数据集名称:全国366个市县日度空气质量数据 时间范围:2016-2020年 相关说明:共收录366个市县全年全日数据,其中浓度为日均值,IAQI由浓度推算而来。IAQI为各空气质量指标对应的空气质量指数,用于对应AQI与…

多线程的初识

目录多线程线程的引入进程和线程的关系多线程可能存在的问题多线程程序的创建Thread创建第一个多线程程序线程的抢占式执行查看java进程中的所有线程用Thread的其他方法创建多线程实现Runnable接口使用匿名内部类,继承Thread使用匿名内部类实现Runnable使用Lambda表…

嵌入式Linux驱动开发笔记(未完待续。。。)

一、Git仓库用法 1、linu终端输入下面命令安装 git clone https://e.coding.net/weidongshan/linux_course/linux_basic_develop.git2、 进入到GIT仓库目录 cd /D/abc/doc_and_source_for_mcu_mpu在doc_and_source_for_mcu_mpu目录下,执行以下命令获得资料的最新…

【1752. 检查数组是否经排序和轮转得到】

来源:力扣(LeetCode) 描述: 给你一个数组 nums 。nums 的源数组中,所有元素与 nums 相同,但按非递减顺序排列。 如果 nums 能够由源数组轮转若干位置(包括 0 个位置)得到&#xf…

appnium环境搭建

一、安装JDK 官网下载对应版本直接安装 二、安装Android SDK 官网下载对应版本直接安装 https://www.androiddevtools.cn/ 三、安装安卓模拟器 我使用的是夜神模拟器,官网下载直接安装 夜神安卓模拟器-安卓模拟器电脑版下载_安卓手游模拟器_手机模拟器_官网 …

springboot整合SpringSecurity并实现简单权限控制

目录 一、SpringSecurity介绍 案例效果: 二、环境准备 2.1 数据库 2.2 项目准备 三、确保项目没问题后开始使用 3.1、Security的过滤链: 3.2、自定义用户名密码登录: 方式1:将用户名密码写在配置文件里 方式2:使…

刷题之莲子的软件工程学和机械动力学以及物理热力学

目录 1、莲子的软件工程学 1)题目 2)题目解析 3)代码 2、莲子的机械动力学 2)题目解析 3)代码 3、莲子的物理热力学 1)、题目 2)题目解析 1、莲子的软件工程学 1)题目 题目背景…

Linux下的进程控制-进程程序替换

这篇主要说一下Linux下的进程控制中最后一部分内容:进程程序替换。 文章目录1. 进程程序替换1.1 为什么要进程程序替换1.2 替换原理1.3 如何进行程序替换1.3.1 execl函数1.3.2 引入子进程的程序替换1.3.3 execv函数1.3.4 execlp函数和execvp函数1.3.5 如何执行其它…

Flutter自定义对话框返回相关问题汇总

Flutter自定义对话框&#xff0c;禁用系统返回按钮 - WillPopScope 使用WillPopScope即可&#xff0c;重点onWillPop方法: Future<bool> _onWillPop()>new Future.value(false); 由于要弹出dialog&#xff0c;我这里是禁掉返回按钮&#xff0c;当然也可以在这里做一下…

基于SpringBoot的二手商品交易平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#…

3.6.4、随机接入-CSMA/CA协议

无线局域网使用的协议 1、基本概念 对于上述无线局域网为什么 A 和 C 都检测不到对方的无线信号 因为 C 不在 A 的范围内&#xff0c;C 发送无线信号会导致 A 检测不到 C 在发送 对于上述使用广播信道的有线局域网就不会存在这样的问题 总线上某个主机发送的信号&#xff0…

JVM虚拟机字节码执行引擎——类文件和类加载之前必看

文章目录虚拟机字节码执行引擎运行时栈帧结构局部变量表&#xff08;Local Variables&#xff09;操作数栈动态链接&#xff08;Dynamic Linking&#xff09;方法返回地址附加信息方法调用解析分派虚方法和非虚方法普通调用指令&#xff1a;动态调用指令&#xff1a;动态类型语…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.7 开启yml 提示功能

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.7 开启yml 提示功能2.7.1 问题引入2.7.2 开启yml提示功能2.…

【矩阵论】正规方程——求解

5.2 正规方程 AHAxAHb为Axb的正规方程\begin{aligned} A^HAxA^Hb为Axb的正规方程 \end{aligned} AHAxAHb为Axb的正规方程​ 5.2.1 正规方程必有解 正规方程 AHAxAHbA^HAxA^HbAHAxAHb 必有解 &#xff0c;且特解为 x0Abx_0A^bx0​Ab &#xff0c;使 AHAx0AHbA^HAx_0A^HbAHAx0​…

一文熟悉 Go 的循环结构 —— for 循环

哈喽大家好&#xff0c;我是陈明勇&#xff0c;今天分享的知识是 Go 的循环结构。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨点个关注&#xff0c;一起成长一起进步&#xff0c;如果本文有错误的地方&#xff0c;欢迎指出&a…

【Spring】——10、@PostConstruct注解和@PreDestroy注解

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

OpenStack集群部署——Keystone部署(二)

三、Keyston-认证服务 3.1 Keyston介绍 Keyston介绍 补充 3.2 安装时间同步器 ----------------------------------------------------使用chrony安装------------------------------------------------- ####所有节点 #下载安装chrony yum -y install chrony #修改配置…

【心电信号】Simulink胎儿心电信号提取【含Matlab源码 1550期】

⛄一、心电信号简介 0 引言 心电信号是人类最早研究的生物信号之一, 相比其他生物信号更易于检测, 且具有直观的规律。心电图的准确分析对心脏病的及早治疗有重大的意义。人体是一个复杂精密的系统, 有许多不可抗的外界因素, 得到纯净的心电信号非常困难。可以采用神经网络算法…