InnoDB架构:磁盘篇

InnoDB架构:磁盘篇

InnoDB是MySQL数据库中默认的存储引擎,它为数据库提供了事务安全型(ACID兼容)、行级锁定和外键支持等功能。InnoDB的架构设计优化了对于读取密集和写入密集型应用的性能表现,是一个高度优化的存储系统。

该架构主要分为两部分,内存部分和磁盘部分。

表空间(Tablespaces)

表空间是InnoDB存储数据和索引的物理部分。InnoDB支持单一表空间和多表空间配置。在单一表空间模式下,所有的表和索引数据存储在一个名为ibdata1的文件中。多表空间模式允许每个表有自己的文件,这样可以更好地管理磁盘空间,提高I/O分离性,从而提升性能。表空间还支持设置不同的大小和自动扩展属性。

表空间的类型

InnoDB支持两种类型的表空间:

  1. 系统表空间:这是默认的表空间,名为 ibdata1,它通常位于数据库的数据目录中。系统表空间可以包含多个表的数据和索引,也包括InnoDB的内部数据,如撤销日志(undo logs)和系统事务信息。系统表空间的主要优点是简化了管理,但它的缺点是随着数据的增加,文件大小会持续增长,且不容易缩减。

  2. 文件-每表表空间(File-per-table tablespace):从MySQL 5.6版本开始,默认启用的是文件-每表模式。在这种模式下,每个InnoDB表都有自己的表空间文件,这些文件通常以 .ibd 为扩展名。使用文件-每表表空间的好处包括更好的I/O性能,因为表之间的I/O操作是分离的,以及更灵活的数据管理,如表的迁移和备份。

表空间的管理

表空间的管理涉及几个关键操作,包括创建、删除、扩展和压缩。例如,管理员可以指定表空间的初始大小和是否自动扩展。通过SQL命令如 CREATE TABLESPACEALTER TABLESPACE 可以实现这些管理操作。

表空间的优点

使用表空间有多种优点:

  • 性能优化:通过将表数据分散到不同的物理设备上,可以优化数据库的读写性能。
  • 灵活的数据管理:独立的表空间文件使得数据迁移、备份和恢复操作更加灵活和简单。
  • 大小管理:文件-每表表空间允许独立管理每个表的大小,便于进行空间优化和管理。

使用场景

表空间的使用场景非常广泛,适用于需要高性能、高可扩展性和灵活数据管理的大型数据库环境。例如,在一个大规模的在线交易处理系统(OLTP)中,使用文件-每表表空间可以显著提高系统的响应速度和数据处理能力。

双写缓冲区(Doublewrite Buffer)

双写缓冲区是InnoDB用于保护数据完整性的一种机制。它在将数据页写入磁盘之前,先将它们写入到一个内部的缓冲区。这样做的目的是在发生系统崩溃时防止数据页部分写入,也就是说,双写缓冲区提供了对数据页损坏的保护。这是因为每个数据页被写入两次,一次到双写缓冲区,一次到最终位置。

工作原理

双写缓冲区的工作原理基于以下步骤:

  1. 预写:当InnoDB准备更新或写入一个数据页到磁盘时,它首先将这个页的副本写入到双写缓冲区。这个缓冲区位于系统表空间中,具体位置是在ibdata文件中。

  2. 实际写入:数据页从双写缓冲区被写入其预定的位置后,InnoDB将再次对这些页面进行写入,确保数据正确存放在表空间的文件中。

  3. 验证与恢复:在系统启动时,如果检测到上次关闭不正常,InnoDB会检查双写缓冲区。由于缓冲区中的数据页是已知良好的副本,所以可以用它来覆盖任何可能损坏的页,从而恢复数据的一致性。

优点

双写缓冲区的主要优点包括:

  • 数据完整性:即使在数据页写入过程中发生崩溃,双写缓冲区也确保有一个完整无损的数据页副本可用于恢复,从而减少数据损坏的风险。
  • 恢复速度:在系统恢复期间,使用双写缓冲区可以加快数据恢复的速度,因为它提供了即刻可用的数据页副本。

性能考虑

虽然双写缓冲区提供了显著的数据保护优势,但它也可能引入一定的性能开销,因为每个数据页需要被写入两次。然而,对于大多数系统来说,这种额外的写入操作是值得的,因为它大大减少了数据不一致的风险。

配置

在MySQL配置文件中(通常是my.cnfmy.ini),可以通过设置innodb_doublewrite选项来启用或禁用双写缓冲区。默认情况下,这一选项是启用的,以保证数据的安全性。

Redo Log

重做日志是InnoDB执行事务时确保数据完整性和持久性的关键组成部分。每当对数据库进行更改时,InnoDB都会先将更改记录到重做日志中,这些日志记录了如何重做在数据库上执行的操作。在系统崩溃后,InnoDB可以使用重做日志来恢复数据到最后一致的状态。重做日志是循环使用的,由一组固定大小的文件组成。

工作原理

重做日志的工作原理基于以下几个步骤:

  1. 日志写入:当一个事务对数据库中的数据进行修改时,InnoDB首先将这些修改操作(如INSERT、UPDATE或DELETE)记录到重做日志缓冲区(Redo Log Buffer)中。
  2. 日志刷新:重做日志缓冲区中的内容会定期被刷新并写入到物理的重做日志文件中。这个过程是异步进行的,不会阻塞主数据库操作。
  3. 日志应用:在数据库启动过程中,如果检测到上一次关闭是非正常的,InnoDB会根据重做日志中的记录重新执行(重做)这些操作,以确保所有事务的修改都能恢复到数据库中。

日志的组成

重做日志由一组固定大小的文件组成,通常称为日志文件组(Log Group)。在MySQL的配置文件(如my.cnfmy.ini)中可以设置这些文件的数量和大小。例如,可以通过innodb_log_files_in_groupinnodb_log_file_size这两个参数来配置。

重要性和优势

重做日志的主要重要性和优势包括:

  • 数据持久性:通过记录每个事务的所有修改,重做日志确保在发生故障后可以恢复这些修改,从而提供事务的持久性保证。
  • 性能优化:重做日志允许事务先写日志,后更新数据页。这种“写前日志”(Write-Ahead Logging, WAL)策略可以减少磁盘I/O操作,提高数据库的整体性能。
  • 快速恢复:使用重做日志可以加速数据库的恢复过程,因为仅需应用日志中的修改即可,而无需重新执行整个事务。

配置和管理

管理重做日志包括合理配置日志大小和监控日志的使用情况。日志文件过大或过小都可能影响性能。过小的日志文件可能导致频繁的日志回绕,增加系统负担;而过大的日志文件可能延长数据库的恢复时间。

实践建议

  • 适当配置:根据系统的负载和事务的特点调整重做日志的大小和数量。
  • 监控:定期监控重做日志的使用情况和系统性能,以优化配置。
  • 数据安全:确保重做日志文件的数据安全和备份,以防止数据丢失。

Undo Logs

回滚日志是InnoDB支持事务的另一关键机制。当事务进行更改时,InnoDB不仅记录重做日志,也记录撤销日志。如果需要回滚事务(如事务失败或显式回滚),InnoDB可以使用撤销日志来撤销之前的操作。此外,撤销日志也用于支持MVCC(多版本并发控制),允许事务看到数据的一致视图,而不受其他并发事务的影响。

工作原理

回滚日志的工作原理基于以下步骤:

  1. 记录变更:当一个事务对数据库进行修改时,除了将修改写入重做日志,InnoDB还会在回滚日志中记录每个修改的逆操作。例如,如果事务中的操作是增加一个值,回滚日志会记录一个减少该值的操作。

  2. 事务回滚:如果事务需要被回滚(无论是由于错误还是用户请求),InnoDB会利用回滚日志中的记录来撤销事务中的所有操作,确保数据库状态回到事务开始前的状态。

  3. 维护一致性视图:在多版本并发控制(MVCC)中,回滚日志也被用来提供未提交事务的旧数据版本,允许其他事务查询到一致性的历史数据,而不受当前正在进行的修改操作的影响。

组件和结构

回滚日志通常不是独立的文件,而是存储在系统表空间中,或者在配置了文件-每表表空间时存储在每个表的表空间文件中。它们是动态管理的,InnoDB会根据需要自动扩展和收缩回滚日志的空间。

重要性和优势

回滚日志的主要优点包括:

  • 事务的原子性保证:确保事务要么完全执行,要么在出错时完全撤销,对外界不可见。
  • 并发控制:支持数据库的并发操作,允许多个事务同时进行,而互不干扰。
  • 数据完整性:在系统崩溃后,回滚日志可以用来恢复未完成事务的数据状态,维护数据库的完整性。

性能影响

虽然回滚日志是事务安全的重要保障,但它们也可能对系统性能产生一定影响,尤其是在处理大量或复杂的事务时。管理回滚日志的大小和行为对优化数据库性能至关重要。

管理和配置

  • 监控:管理员应监控回滚段的大小和性能,确保它们不会成为性能瓶颈。
  • 配置:通过配置参数(如 innodb_undo_log_truncate)来管理回滚日志的行为,例如启用日志的自动截断可以帮助控制日志大小。

参考链接

InnoDB架构(Log Buffer):官方文档

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

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

相关文章

近屿智能全新推出AI培训产品:AIGC大模型工程师与产品经理学习路径图

如今,人工智能和自然语言处理技术的发展,使得AI生成的内容(AIGC,AI Generated Content)领域开发出了巨大的潜力。就像业内巨头OpenAI公司,开发出了一系列自然语言处理模型ChatGPT,不仅带动了全世…

C语言单向链表的经典算法

1.分割链表 2.移除链表元素 3.反转链表 4.合并两个有序链表 5.链表的中间结点 6.环形链表的约瑟夫问题 1.分割链表: 1.思路:创建新链表,小链表和大链表。如图 代码如下 /*** Definition for singly-linked list.* struct ListNode {* int val…

Unity类银河恶魔城学习记录12-18,19 p140 Options UI-p141 Finalising ToolTip源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_ToolTip.cs using TMPro; using UnityEngine;public class UI_ToolTip :…

IBM SPSS Statistics for Mac中文激活版:强大的数据分析工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析工具,为Mac用户提供了高效、精准的数据分析体验。 IBM SPSS Statistics for Mac中文激活版下载 该软件拥有丰富的统计分析功能,无论是描述性统计、推论性统计,还是高级的多元统计分析&am…

【面试经典 150 | 链表】K 个一组翻转链表

文章目录 写在前面Tag题目来源解题思路方法一:迭代 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾…

【从零开始手搓12306项目】第一阶段遇到的问题及解决方案

IDEA中datebase连接mysql失败 读取外包函数报错 注意区分private和public 找不到数据库? 一定要注意数据库的url链接,在datebase的url复制过来 xml和java对应不上? 最好复制一遍到xml文件 git忽略条件文件目录 定义Git全局的 .gitigno…

人工智能与IP代理池:解析网络数据采集的未来

前言 随着互联网的快速发展,数据成为了当今社会最宝贵的资源之一。然而,要获取大量的网络数据并进行有效的分析,往往需要面对诸多挑战,其中之一就是网络封锁与反爬虫机制。在这个背景下,人工智能(AI&#x…

Python 物联网入门指南(七)

原文:zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者:飞龙 协议:CC BY-NC-SA 4.0 第二十四章:基本开关 到目前为止一定是一段史诗般的旅程!回想一下你开始阅读这本书的时候,你是否曾想象…

IP协议如何进行地址管理?

如今,IP协议有两个版本,分别是IPv4和IPv6,IPv4是目前主要应用的版本。IPv4的IP地址是以4个字节的数字来表示的,比如 127.0.0.1。因此,IPv4所能表示IP地址的个数是2^32次方,也就是42亿多个,看起来…

OpenStack 入门体验

目录 一、云计算概述 1.1、什么是云计算 1.2、云计算的服务模型 1)IaaS 2)PaaS 3)SaaS 1.3、OpenStack 概述 1)OpenStack 起源 2)什么是 OpenStack 3)OpenStack 优势 二、OpenStack 一…

RabbitMQ进阶学习

在之前的练习作业中,我们改造了余额支付功能,在支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。 但是大家思考一下,如果这里MQ通知失败,支付服务中支付流水显示支付成功,而交易服务中的订…

IAM 统一身份认证与访问管理服务

即统一身份认证与访问管理服务,是云服务商提供的一套云上身份管理解决方案,可帮助企业安全地管理云上资源的访问权限。 在当今云计算时代,企业越来越依赖云服务来存储和处理敏感数据。然而,这也带来了新的安全挑战,即…

CentOS:执行make命令时报错g++: Command not found

报错截图: 其实很简单只需要安装一下 yum -y install gcc automake autoconf libtool make yum install gcc gcc-c

RabbitMQ交换机的类型

交换机类型 可以看到,在订阅模型中,多了一个exchange角色,而且过程略有变化: Publisher:生产者,不再发送消息到队列中,而是发给交换机 Exchange:交换机,一方面&#xff…

OSPF大型实验

OSPF大型实验 实验拓扑图 实验思路 1、R4为ISP,其上只配置IP地址;R4与其他所直连设备间均使用公有IP; 2、R3-R5、R6、R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分;除了R12有两…

初识数据库与数据库管理系统

实体的概念与数据库 实体(对象): 客观存在的事物都是实体实体数据的存储要求: 必须按照一定的分类和规律存储数据库: 专门用于存储这些实体的信息的数据集合数据库的特点: 海量存储数据/数据检索非常方便保持数据信息的一致/完整/并实现数据…

通过 Ollama、Langchain 实现 RAG

RAG 是什么 RAG 在 Langchain 上的定义是,作为大语言模型最常用的场景就是问答系统,可以针对特别来源数据做问题回答,就是私有数据,这就是 RAG,英文全称是Retrieval Augmented Generation。就是对现有模型数据的增广&…

强化学习(二)马尔科夫决策过程 MDP

文章目录 1. 什么是马尔科夫过程2. 强化学习与MDP的关系3. 价值函数的贝尔曼方程3.1 状态价值函数的贝尔曼方程3.2 动作价值函数的贝尔曼方程3.3 价值函数递推关系的转换 4. 最优价值函数5. MDP计算最优值函数实例 1. 什么是马尔科夫过程 马尔科夫过程(Markov Deci…

【网络编程】UDP实现回显服务器

一.网络编程的基本术语. 客户端 客户端是为用户提供本地服务的程序,通常位于用户设备上。也称为用户端,是相对于服务器而言的。它主要指安装在用户设备上的程序,这些程序能够与服务器进行通信,从而获取服务或者执行特定功能。在…

Spark安装教程

Spark安装教程 文章目录 Spark安装教程1. 检查jdk版本2. 获取Spark版本安装资源3.环境变量4.配置文件5. 重启Hadoop集群(使配置生效)6. 启动Spark集群6.1 查看Spark服务6.2 访问Spark WEB UI 7. 启动 Spark-Shell 测试 Scala 交互式环境8. 测试Spark On Yarn9.关闭Spark集群 1.…