Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL关于数据字典的一个疑问

MySQL关于数据字典的一个疑问

作者头像
jeanron100
发布于 2018-03-22 07:28:24
发布于 2018-03-22 07:28:24
93000
代码可运行
举报
运行总次数:0
代码可运行

今天看着MySQL的数据字典,突然想到一个问题:为什么MySQL数据字典 information_schema中的表名是大写,而performance_schema和其他库中的是小写?

带着这个问题,我开始了一些猜测和自我论证。

首先大小写的这个情况是相对不兼容的。

比如在performance_schema中,根据关键字user可以找到两个相关的表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> show tables  like 'user%';
+--------------------------------------+
| Tables_in_performance_schema (user%) |
+--------------------------------------+
| user_variables_by_thread             |
| users                                |
+--------------------------------------+
2 rows in set (0.00 sec)

但是如果我改做大写,是不能识别的,这在其他的数据库里也是类似的处理方式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> desc USERS;
ERROR 1146 (42S02): Table 'performance_schema.USERS' doesn't exist
mysql> select database();
+--------------------+
| database()         |
+--------------------+
| performance_schema |
+--------------------+
1 row in set (0.00 sec)

而在information_schema中,则是相对兼容的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select count(*)from tables; select count(*)from TABLES;
+----------+
| count(*) |
+----------+
|      383 |
+----------+
1 row in set (0.01 sec)
+----------+
| count(*) |
+----------+
|      383 |
+----------+
1 row in set (0.00 sec)

如果从物理文件的角度来看,你会发现在MySQL中information_schema这个数据库和其他数据库不同,没有一个指定的目录存在。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@dev01 mysql]# ll
total 188796
-rw-r----- 1 mysql mysql       56 Jan  2 12:37 auto.cnf
-rw-r----- 1 mysql mysql        5 Mar 13 14:26 dev01.pid
drwxr-x--- 2 mysql mysql    12288 Mar  9 10:44 devopsdb
drwxr-x--- 2 mysql mysql     4096 Jan  2 12:38 dms_metadata
-rw-r----- 1 mysql mysql     1292 Jan 26 19:44 ib_buffer_pool
-rw-r----- 1 mysql mysql 79691776 Mar 13 23:27 ibdata1
-rw-r----- 1 mysql mysql 50331648 Mar 13 23:27 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Mar 13 23:27 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Mar 13 23:36 ibtmp1
drwxr-x--- 2 mysql mysql     4096 Jan 24 19:04 kmp
drwxr-x--- 2 mysql mysql     4096 Jan  2 12:37 mysql
-rw-r----- 1 mysql mysql   324407 Mar 13 21:54 mysqld.log
drwxr-x--- 2 mysql mysql     4096 Jan  2 12:37 performance_schema
drwxr-x--- 2 mysql mysql    12288 Jan  2 12:37 sys
drwxr-x--- 2 mysql mysql     4096 Mar 13 23:27 test

这个数据的存储就好比Oracle里面的系统表空间,所以information_schema是名副其实的数据字典库。

而performance_schema则是一个内存库,它的存储引擎是特别的一种,不是InnoDB也不是MyISAM,Memory,而是performance_schema

带着疑问我继续切换到了information_schema中,可以很明显的发现information_schema中的数据字典大多是Memory存储引擎。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> show create table tables \G
*************************** 1. row ***************************
       Table: TABLES
Create Table: CREATE TEMPORARY TABLE `TABLES` (
  `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
 。。。
  `TABLE_COMMENT` varchar(2048) NOT NULL DEFAULT ''
) ENGINE=MEMORY DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

还要一些是InnoDB的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql>  show create table PLUGINS\G
*************************** 1. row ***************************
       Table: PLUGINS
Create Table: CREATE TEMPORARY TABLE `PLUGINS` (
  `PLUGIN_NAME` varchar(64) NOT NULL DEFAULT '',
  `PLUGIN_VERSION` varchar(20) NOT NULL DEFAULT '',
  `PLUGIN_STATUS` varchar(10) NOT NULL DEFAULT '',
。。。
  `LOAD_OPTION` varchar(64) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

所以数据字典的结构其实还算是比价繁杂,涉及多个存储引擎,涉及多中规则和处理方式。

如果我们仔细查看上面的语句,就会发现,这些数据字典都是temporary table.

明白了这些,对我们分析问题的方向就很有利了。

所以我的初步设想就是通过这种命名方式能够标识出来它就是临时表,避免混淆。

怎么理解呢。

如果一个数据库中存在一个临时表,一个普通表,名字都是test,可不可行?

不要猜行不行,而是快速验证一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> create table tmp (id int,name varchar(30));
Query OK, 0 rows affected (0.09 sec)
mysql> create temporary table tmp(id int,name varchar(30));

Query OK, 0 rows affected (0.00 sec)

这个时候插入一条记录,显示成功,但是我们却没有办法判断到底是插入到了哪个表里。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> insert into tmp values(1,'aa');
Query OK, 1 row affected (0.00 sec)

所以我们可以用排除的方式来验证,我们删掉tmp,然后查看剩下的数据到底在哪里?

删除成功,但是这个时候我们还需要其他的信息来佐证。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> drop table tmp ;
Query OK, 0 rows affected (0.00 sec)

查看tmp的定义信息,很明显drop的tmp是临时表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> show create table tmp ;
+-------+---------------------------------------------+
| Table | Create Table                                                                                           
+-------+--------------------------------------------+
| tmp   | CREATE TABLE `tmp` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------+
1 row in set (0.00 sec)

那么插入的数据到了哪里呢,一查便知,显示为0,则很显然数据是插入到了临时表tmp中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select count(*)from tmp ;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

而如果我们继续换个思路,定义两个表,一个是大写的TABLES,一个是小写的tables

则默认的情况下也是不会冲突的,尽管tables是在数据字典层面的一个表,但是在其他数据库中依旧可以正常处理,命名还是不会冲突。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> create table TABLES  (id INT );
Query OK, 0 rows affected (0.12 sec)
mysql> create table tables  (id INT );
Query OK, 0 rows affected (0.11 sec)

所以这个问题的初步理解就是为了在数据字典层面作为一种清晰的标识,而如果想得到更多的信息,还是得翻翻代码的实现了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
4种备份MySQL数据库(基本备份方面问题不大了)
我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?这可能是最恐怖的事情了吧, 我感觉在生产环境中应该没有什么比数据跟更为重要. 那么我们该如何保证数据不丢失、或者丢失后可以快速恢复呢?只要看完这篇, 大家应该就能对MySQL中实现数据备份和恢复能有一定的了解。 为什么需要备份数据? 其实在前言中也大概说明了为什么要备份数据, 但是我们还是应该具体了解一下为什么要备份数据 在生产环境中我们数据库可能会遭遇各种各样的不测从而
老七Linux
2018/05/31
3.7K0
Mysql主从同步架构配置
一、mysql主从介绍: MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的。也就是说,当你在A机器写入一个表,再次查看B机器也会同步一个表。 1.1 MySQL主从是基于binlog的,主上须开启binlog才能进行主从。 主从过程大致有3个步骤: 主将更改操作记录到binlog里。 从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog里。 从根据relaylog里面的sql语句按顺序执
老七Linux
2018/05/09
3.8K0
MySQL(十四)之数据备份与还原
前言   上一篇分享了关于MySQL事务的知识,在我们数据库中最重要的就是数据了,所以数据的备份就显的特别的重要!   为什么要备份数据?   在生产环境中我们数据库可能会遭遇各种各样的不测从而导致数据丢失, 大概分为以下几种:     硬件故障、软件故障、自然灾害、黑客攻击、误操作(占比例大)   所以, 为了在数据丢失之后能够恢复数据, 我们就需要定期的备份数据, 备份数据的策略要根据不同的应用场景进行定制, 大致有几个参考数值, 我们可以根据这些数值从而定制符合特定环境中的数据备份策略:     能够
用户1195962
2018/01/18
3.3K0
MySQL(十四)之数据备份与还原
MySQL 数据库简单操作
    对于想要从事或爱好mysql相关工作的童鞋们,有必要掌握在命令行下对mysql实现一些简单的操作。本文从描述了如何登录到mysql数据库服务器,如何在mysql提示符下发布命令,创建数据库,以及执行一些简单的DML操作。
Leshami
2018/08/13
1.7K0
MySQL-8.0 | 数据字典最强解读
数据字典(Data Dictionary)中存储了诸多数据库的元数据信息如图1所示,包括基本Database, table, index, column, function, trigger, procedure,privilege等;以及与存储引擎相关的元数据,如InnoDB的tablespace, table_id, index_id等。MySQL-8.0在数据字典上进行了诸多优化,本文将对其进行逐一介绍。
数据和云
2019/05/13
4K0
mysql常用命令
这几天学习了一下mysql,对于mysql的命令总结如下,发现很多方面和oracle还是差别挺大的。 # mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.14-enterprise-commercial-advanced Copyright (c) 2000, 2013, Or
jeanron100
2018/03/13
1.2K0
MySQL 管理
-e选项可以在Mysql客户端执行SQL语句,而不用连接到MySQL数据库再执行,对于一些批处理脚本,这种方式尤其方便。
用户9615083
2022/12/25
1.3K0
MySQL 管理
Python数据库操作 初识mysql和mysql基本操作#学习猿地
Welcome to the MySQL monitor.  Commands end with ; or \g.
学习猿地
2020/03/20
3820
MySQL备份与恢复 Xtrabackup
MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobakupe。
jwangkun
2021/12/23
1.6K0
MySQL备份与恢复 Xtrabackup
MySQL 8.0新特性 — 事务性数据字典与原子DDL
事务性数据字典与原子DDL,是MySQL 8.0推出的两个非常重要的新特性,之所以将这两个新特性放在一起,是因为两者密切相关,事务性数据字典是前提,原子DDL是一个重要应用场景。
brightdeng@DBA
2020/08/17
1.8K0
MySQL 8.0新特性 — 事务性数据字典与原子DDL
MySQL InnoDB表空间加密
  从 MySQL5.7.11开始,MySQL对InnoDB支持存储在单独表空间中的表的数据加密 。此功能为物理表空间数据文件提供静态加密。该加密是在引擎内部数据页级别的加密手段,在数据页写入文件系统时加密,加密用的是AES算法,而其解密是在从文件读到内存中时进行。
俊才
2020/08/18
3.6K0
MySQL InnoDB表空间加密
MySQL数据字典提示1146不存在的问题解决
最近某套MySQL因为磁盘挂载问题,异常宕机,拉起后,数据库能正常访问了,但是在error.log一直提示这个错误,
bisal
2021/09/18
1.1K0
MySQL数据字典提示1146不存在的问题解决
information_schema和performance_schema的一点知识
information_schema和performance_schema的一点知识
AsiaYe
2020/02/17
2.4K0
MySQL 有效利用 profile 分析 SQL 语句的执行过程
在日常的工作中,我们通常要分析 SQL 语句的性能,通过会使用到执行计划,利用执行计划来分析 SQL 语句的性能,并进行相应的优化;本文将利用 profile 分析 SQL 语句的执行过程来辅助的分析 SQL 语句,做好优化;
JiekeXu之路
2019/06/20
4.9K0
MySQL 有效利用 profile 分析 SQL 语句的执行过程
关于MySQL库表名大小写问题
一般在数据库使用规范中,我们都会看到这么一条:库名及表名一律使用小写英文。你有没有思考过,为什么推荐使用小写呢?库表名是否应该区分大小写呢?带着这些疑问,我们一起来看下本篇文章。
MySQL技术
2021/07/05
8K0
MySQL 8.0新特性: 数据字典
目前MySQL 8.0最新版本为8.0.23版本,针对8.0的新特性,从春节前开始做了一些相关学习和测试,后续会不阶段的分享一些8.0的新特性,供大家一起参考和学习;
SEian.G
2021/03/03
2.3K0
MySQL 8.0 information_schema.tables表和之前版本的差异
在做自动化运维开发过程中,需要从information_schema.tables获取MySQL表相关的元信息,发现MySQL8.0和5.7存在的差异还是比较大的;在MySQL8.0以前,通常会通过infomation_schema的表来获取一些元数据,例如从tables表中获取表的下一个auto_increment值,从indexes表获取索引的相关信息等。
SEian.G
2021/12/13
1.8K0
MySQL备份与恢复
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql_bin.000003 > /opt/mysql_bin003.txt
Alone-林
2022/08/23
4.2K0
Docker下MySQL主从三部曲之三:binlog日志参数实战
本章是《Docker下MySQL主从三部曲》的终篇,前面的章节我们能够制作镜像来搭建主从同步环境,本章我们来观察binlog参数MASTER_LOG_POS;
程序员欣宸
2022/05/06
4740
xtrabackup使用
转自:https://www.cnblogs.com/waynechou/p/xtrabackup_backup.html 阅读目录 xtrabackup 选项 xtrabackup 全量备份恢复 xtrabackup 增量备份恢复 前一篇文章我们讲到了PXB的原理以及安装方法,接下来将详细介绍 XtraBackup 备份和恢复的具体过程。 回到顶部 xtrabackup 选项 xtrabackup 工具有许多参数,具体可去官网查询(xtrabackup 参数选项 | innobackupex 参数选项),
用户1173509
2018/03/28
2.2K0
相关推荐
4种备份MySQL数据库(基本备份方面问题不大了)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验