深入解析MySQL 8:事务数据字典的变革
随着数据库技术的不断发展和完善,元数据的管理成为了一个日益重要的议题。在MySQL 8中,一项引人注目的新特性是引入了事务数据字典(Transaction Data Dictionary,简称TDD),它改变了元数据的管理方式,为数据库的性能、稳定性和扩展性带来了显著的提升。
一、事务数据字典的引入背景
在MySQL 8之前的版本中,元数据分散地存储在多个地方,包括元数据文件、非事务性表和特定于存储引擎的数据字典中。这种分散的存储方式不仅增加了管理的复杂性,还可能导致数据的不一致性。为了解决这些问题,MySQL 8引入了事务数据字典,将元数据集中存储在具有事务功能的InnoDB表中,从而提供了一致性和可靠性的保证。
MySQL 8.0及更高版本中,事务性数据字典(Transactional Data Dictionary,简称数据字典)它完全基于InnoDB存储引擎,并且取代了早期版本中使用的各种非事务性元数据存储方式(如FRM、TRG、PAR等文件)。这意味着所有的系统元数据,包括表结构、列信息、索引、触发器、存储过程和函数等,现在都存储在InnoDB表中,从而确保了元数据操作(如创建表、修改列等)的原子性、一致性和隔离性。
这种变化带来了几个显著的好处:
-
原子性:对元数据的所有更改都是原子的,要么全部成功,要么在失败时全部回滚,从而避免了元数据的不一致状态。
-
一致性:由于InnoDB支持事务,因此数据字典中的信息始终保持一致,即使在并发修改的情况下也是如此。
-
崩溃恢复:在发生故障后,InnoDB的恢复机制可以确保数据字典的完整性。
-
性能:InnoDB的缓存和事务管理特性有助于提高元数据操作的性能。
-
简化管理:不再需要维护多种不同类型的元数据文件和表,所有数据字典信息都集中存储在InnoDB表中,简化了数据库的管理和备份。
-
向后兼容性:尽管内部实现发生了重大变化,但MySQL努力保持了与早期版本的兼容性,以便现有的应用程序和脚本能够继续无缝工作。
information_schema
数据库现在提供了一组视图,这些视图作为访问事务性数据字典的接口。这些视图提供了关于数据库对象的详细信息,如表、列、索引、触发器、存储过程和函数等。通过查询这些视图,管理员和开发人员可以获取关于数据库结构和属性的实时信息,而无需直接访问底层的InnoDB表。
总的来说,事务性数据字典的引入是MySQL 8.0及更高版本中的一个重大改进,它提高了数据库的可靠性、性能和易用性。
二、事务数据字典的内容
在MySQL 8中,事务数据字典(Data Dictionary)是一个集中的元数据存储系统,它包含了关于数据库对象的各种信息。这些信息被组织成一系列的“字典表”,但实际上这些字典表并不直接暴露给用户。相反,用户通过information_schema
数据库中的视图来访问这些字典表的内容。
以下是一些主要的information_schema
视图,它们对应于事务数据字典中的不同部分,并提供了关于数据库对象的详细信息:
-
TABLES (
information_schema.TABLES
)- 提供数据库中所有表的信息。
- 包括表名、表类型(BASE TABLE, VIEW等)、创建时间、最后修改时间等。
-
COLUMNS (
information_schema.COLUMNS
)- 提供表中所有列的信息。
- 包括列名、数据类型、字符集、列默认值、是否可为NULL等。
-
STATISTICS (
information_schema.STATISTICS
)- 提供关于表索引的信息。
- 在MySQL中,索引和键是同一个概念,因此这个视图也包含了主键、外键和唯一键的信息。
- 包括索引名、列名、索引类型(BTREE, HASH等)、是否唯一等。
-
KEY_COLUMN_USAGE (
information_schema.KEY_COLUMN_USAGE
)- 描述哪些列被用作表的键(主键、外键等)。
- 提供列名、约束名、引用的表等信息。
-
ROUTINES (
information_schema.ROUTINES
)- 提供关于存储过程和函数的信息。
- 包括例程名、例程类型(PROCEDURE, FUNCTION)、创建时间、SQL模式等。
-
TRIGGERS (
information_schema.TRIGGERS
)- 提供关于触发器的信息。
- 包括触发器名、关联的表、触发时间(BEFORE, AFTER)、触发事件(INSERT, UPDATE, DELETE)等。
-
REFERENTIAL_CONSTRAINTS (
information_schema.REFERENTIAL_CONSTRAINTS
)- 描述外键约束。
- 提供约束名、约束类型(通常是FOREIGN KEY)、涉及的表等。
-
TABLE_CONSTRAINTS (
information_schema.TABLE_CONSTRAINTS
)- 提供关于表约束的信息,如主键、唯一键、检查约束等。
- 包括约束名、约束类型、约束状态等。
-
SCHEMATA (
information_schema.SCHEMATA
)- 提供关于数据库中所有模式(数据库)的信息。
- 包括模式名、字符集、排序规则等。
-
VIEWS (
information_schema.VIEWS
)- 提供关于数据库中所有视图的信息。
- 包括视图名、视图定义、安全类型(DEFINER, INVOKER)等。
-
PARTITIONS (
information_schema.PARTITIONS
)- 如果表被分区,这个视图提供关于每个分区的详细信息。
- 包括分区名、分区方法(RANGE, LIST, HASH等)、分区表达式等。
使用这些视图,你可以执行SQL查询来获取关于数据库对象的详细信息。例如,要获取某个表中所有列的信息,你可以执行以下查询:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'your_table_name';
这个查询会返回指定数据库中指定表的所有列的名称、数据类型、是否可为NULL以及默认值。
总的来说,事务数据字典通过information_schema
提供了一组丰富的视图,使得数据库管理员和开发人员能够方便地查询和理解数据库中各种对象的结构和属性。
三、事务数据字典的优势
-
集中式存储:事务数据字典将元数据集中存储在InnoDB表中,使得元数据的管理变得更加简单和高效。数据库管理员不再需要分散地管理多个元数据源,而是可以通过统一的方式访问和修改元数据。
-
事务性支持:由于元数据存储在InnoDB表中,它们可以利用InnoDB的ACID事务特性。这意味着对元数据的更改可以在事务的上下文中执行,确保更改的原子性、一致性、隔离性和持久性。这大大提高了数据库的稳定性和可靠性。
-
减少锁争用:事务数据字典的设计减少了系统表锁的争用。在之前的版本中,对元数据的更改可能需要获取全局锁,从而限制了并发性能。而在事务数据字典中,多个事务可以同时访问和修改数据字典的不同部分,从而提高了整体性能和可扩展性。
-
崩溃恢复和数据一致性:事务数据字典改进了崩溃恢复和数据一致性的能力。由于元数据更改记录在事务日志中,MySQL可以在崩溃期间重播这些更改,确保数据的完整性。这意味着即使在发生故障的情况下,数据库也能够恢复到一致的状态。
四、事务数据字典的影响
事务数据字典的引入对MySQL 8的性能和稳定性产生了积极的影响。首先,通过减少锁争用和最大限度地减少磁盘I/O操作,事务数据字典提高了数据库的整体性能。其次,由于元数据更改的原子性和一致性保证,数据库管理员可以更加放心地进行模式更改和数据库维护操作。最后,事务数据字典的引入为MySQL的未来发展奠定了基础,为更多的新特性和功能提供了可能性。
五、数据字典的特性
-
元数据的原子性更改:
在MySQL 8之前,对元数据的更改(如添加列、删除表等)可能会导致元数据的不一致状态,特别是在发生故障时。事务数据字典确保了这些更改的原子性,要么完全应用,要么完全不应用,从而消除了不一致的风险。 -
性能优化:
由于元数据现在存储在InnoDB表中,因此可以利用InnoDB的缓存和事务特性来优化性能。此外,减少了对全局锁的依赖,这有助于减少锁争用,提高了并发性。 -
崩溃恢复:
事务数据字典增强了MySQL的崩溃恢复能力。由于所有的元数据更改都记录在事务日志中,因此在系统重启后,MySQL可以检查事务日志并回滚任何未完成的更改,确保数据库的一致性。 -
简化了复制和集群管理:
在复制和集群环境中,事务数据字典提供了一个单一的、一致的元数据视图,这简化了复制和集群的管理。所有节点都共享相同的元数据视图,这有助于减少配置错误和不一致。 -
升级过程改进:
在升级到MySQL 8时,服务器会自动将旧的元数据迁移到新的数据字典中。这个过程是自动化的,减少了升级过程中的手动步骤和潜在错误。 -
数据定义语句(DDL)的改进:
由于元数据存储在事务性表中,某些数据定义语句(如ALTER TABLE
)的执行方式得到了改进。这些语句现在可以更高效地执行,并且在执行过程中提供了更好的并发性。 -
信息模式(
information_schema
)的增强:
虽然information_schema
本身不是事务数据字典的全部,但它提供了访问数据字典内容的接口。在MySQL 8中,information_schema
得到了增强,以提供更详细、更准确的元数据信息。 -
安全性和权限管理:
事务数据字典还改进了安全性和权限管理。由于所有元数据都存储在InnoDB表中,因此可以利用InnoDB的访问控制机制来限制对元数据的访问。此外,MySQL 8还引入了基于角色的访问控制(RBAC),这进一步简化了权限管理。 -
兼容性:
尽管事务数据字典是MySQL 8中的一个重大改变,但MySQL团队在引入这一特性时非常注重向后兼容性。这意味着大多数现有的SQL查询和应用程序在升级到MySQL 8后应该能够继续正常工作,而无需进行大量修改。
总的来说,MySQL 8中的事务数据字典不仅改进了元数据的存储和管理方式,还提高了数据库的性能、稳定性和安全性。这些改进对于数据库管理员和开发人员来说都是非常有价值的,它们使得数据库更易于管理、维护和扩展。
六、总结
MySQL 8中新增的事务数据字典是一项重要的特性,它改变了元数据的管理方式,提供了集中式、事务性的存储机制。通过减少锁争用、提高并发性能和保证数据的一致性,事务数据字典为MySQL的整体性能和稳定性带来了显著的提升。对于数据库管理员和开发人员来说,这是一个值得关注和学习的新特性,它将为数据库的应用和开发带来更好的体验和效果。
相关文章:
深入解析MySQL 8:事务数据字典的变革
随着数据库技术的不断发展和完善,元数据的管理成为了一个日益重要的议题。在MySQL 8中,一项引人注目的新特性是引入了事务数据字典(Transaction Data Dictionary,简称TDD),它改变了元数据的管理方式&#x…...

jquery写表格,通过后端传值,并合并单元格
<!DOCTYPE html> <html> <head><title>Table Using jQuery</title><style>#tableWrapper {width: 100%;height: 200px; /* 设置表格容器的高度 */overflow: auto; /* 添加滚动条 */margin-top: -10px; /* 负的外边距值,根据实际…...

百家cms代审
参考博客: PHP代码审计之旅之百家CMS-腾讯云开发者社区-腾讯云 环境搭建 源码链接如下所示 https://gitee.com/openbaijia/baijiacms 安装至本地后 直接解压到phpstudy的www目录下即可 接下来去创建一个数据库用于存储CMS信息。(在Mysql命令行中执行…...

算法学习——LeetCode力扣二叉树篇3
算法学习——LeetCode力扣二叉树篇3 116. 填充每个节点的下一个右侧节点指针 116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode) 描述 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树…...
强制卸载挂载目录
当遇到磁盘卸载失败提示 device is busy fuser -a 显示所有命令行中指定的文件,默认情况下被访问的文件才会被显示。 -c 和-m一样,用于POSIX兼容。 -k 杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。结合 –signal -signal 使用指定的信…...

HiveSQL——sum(if()) 条件累加
注:参考文章: HiveSql面试题10--sum(if)统计问题_hive sum if-CSDN博客文章浏览阅读5.8k次,点赞6次,收藏19次。0 需求分析t_order表结构字段名含义oid订单编号uid用户idotime订单时间(yyyy-MM-dd)oamount订…...

Linux命令行工具使用HTTP代理的方法详解
亲爱的Linux用户们,有没有想过在命令行世界里,你的每一个指令都能悄无声息地穿越千山万水,而不被外界窥探?哈哈,没错,就是通过HTTP代理!今天,我们就来一起探索如何在Linux命令行工具…...
idea mavn 中途新建gitignore文件如何生效
两种情况下项目代码中新建gitignore文件如何生效。 第一种情况项目代码下没有模块的情况 直接在该项目代码的根目录下进入git命令行执行: git rm -r --cached . git add . 注意上面两个命令后面都有一个点 第二种情况是有模块的情况 需要进入模块目录执行上…...

Hadoop:认识MapReduce
MapReduce是一个用于处理大数据集的编程模型和算法框架。其优势在于能够处理大量的数据,通过并行化来加速计算过程。它适用于那些可以分解为多个独立子任务的计算密集型作业,如文本处理、数据分析和大规模数据集的聚合等。然而,MapReduce也有…...
9.4 OpenGL帧缓冲:纹理和帧缓冲之间的反馈循环
纹理和帧缓冲之间的反馈循环 Feedback Loops Between Textures and the Framebuffer 当在图形编程中,特别是OpenGL这样的图形API中处理纹理(Texture)和帧缓冲区(Framebuffer)时,可能会出现一种称为“反馈循…...

相机图像质量研究(6)常见问题总结:光学结构对成像的影响--对焦距离
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...

fast.ai 机器学习笔记(二)
机器学习 1:第 5 课 原文:medium.com/hiromi_suenaga/machine-learning-1-lesson-5-df45f0c99618 译者:飞龙 协议:CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更…...

vue3 elementplus DateTimePicker 日期时间设置默认时间为当天
DateTimePicker里面有个自带属性 可以实现这个需求,如图: // 设置当前当天时间范围 00: 00: 00 - 23:59:59 const currentDate [setDefaultDate(0), setDefaultDate(1)]const setDefaultDate (type:number ): string > {let t ;let date new Da…...
2024年笔记--centos docker离线安装启动失败
Failed to start Docker Application Container Engine 错误如下: [rootel70 docker]# systemctl start docker.service Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" …...

2024.2.10 DMS(数据库管理系统)初体验
数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管…...
zk集群--集群同步
1.概述 前面一章分析了集群下启动阶段选举过程,一旦完成选举,通过执行QuorumPeer的setPeerState将设置好选举结束后自身的状态。然后,将再次执行QuorumPeer的run的新的一轮循环, QuorumPeer的run的每一轮循环,先判断…...
复习面经哦
1.函数可以变量提升 JavaScript 中的函数存在变量提升的概念,这意味着在执行代码之前,函数声明会被提升到其作用域的顶部。这使得你可以在函数声明之前调用函数。然而,这种行为只适用于函数声明,而不是函数表达式。 下面是一些关…...
c++ STL系列——(二)vector
引言 在现代C编程中,std::vector是最常用的动态数组实现之一,它是C标准模板库(STL)的一部分。vector提供了一种方式,以单一数据结构来存储元素集合,并且可以动态地调整大小以适应新元素。本文将深入探讨ve…...

STM32能够做到数据采集和发送同时进行吗?
STM32能够做到数据采集和发送同时进行吗? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「STM32的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!&am…...
5.Swift常量
Swift 常量 在 Swift 中,除了可以声明变量(使用 var 关键字),还可以声明常量(使用 let 关键字)。常量在赋值后就不能再修改其值,适合用于存储不会改变的数据。以下是关于 Swift 常量的一些重要…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...

uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...

PydanticAI快速入门示例
参考链接:https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...