mysql运维机制_《MySQL运维内参》节选 | InnoDB日志管理机制(一)

引 子

InnoDB 存储引擎是支持事务ACID特性的,它是以二十多年前IBM的一篇著名文章《ARIES:A Transaction Recovery Method Supporting Fine-Granularity Locking and PartialRollbacks Using Write-Ahead Logging》为理论基础,大多数关系型数据库的实现都是基于这个理论的,包括Oracle、DM等。

这个理论基本就是一个关系型数据库相关的数据库恢复原型设计,包括日志、回滚、REDO、并发控制、BufferPool管理等方面,内容非常全面。同时,这些内容是一个不可分割的整体,它们的共同目标之一就是保证数据库数据的一致性,保证数据库事务的ACID特性,所以这一节要讲的东西都是互相迁连的,它们之间相互作用,相互配合,相互驱动,才能保证数据库的数据完整性。下面就先从Buffer Pool的背景和实现开始讲起。

b777bee66d4a3a93170700182820ecbc.png

仔细说说InnoDB Buffer Pool

Buffer Pool的背景

InnoDB的Buffer Pool主要用来存储访问过的数据页面,它就是一块连续的内存,通过一定的算法可以使这块内存得到有效的管理。它是数据库系统中拥有最大块内存的系统模块。

InnoDB存储引擎中数据的访问是按照页(有的也叫块,默认为16K)的方式从数据库文件读取到Buffer Pool中的,然后在内存中用同样大小的内存空间来做一个映射。为了提高数据访问效率,数据库系统预先就分配了很多这样的空间,用来与文件中的数据进行交换。访问时按照最近最少使用(LRU)算法来实现Buffer Pool页面的管理,经常访问的页面在最前面,最不经常的页面在最后面。如果Buffer Pool中没有空闲的页面来做文件数据的映射,就找到Buffer Pool中最后面且不使用的位置,将其淘汰,然后用来映射新数据文件页面,同时将它移到LRU链表中的最前面。这样就能保证经常访问的页面在没有刷盘的情况下始终在Buffer Pool中,从而保证了数据库的访问效率。

Buffer Pool的大小可以在配置文件中配置,由参数innodb_buffer_pool_size的大小来决定,默认大小为128M。在MySQL 5.7.4之前,一旦MySQL已经启动,这个值便不能再做修改,如果需要修改,只能退出MySQL进程,然后修改对应的配置文件来设置新的Buffer Pool大小,重新启动后才能生效。这在运维上非常不方便,因为很多时候,需要去调整Buffer Pool的大小,特别是在单机多实例,或者提供云数据库服务的情况下,我们需要根据用户及实际业务的需要,不断地去动态增加或减少Buffer Pool size,从而合理地利用内存及优化数据库。

让人庆幸的是,MySQL官方也发现了这种不便。在MySQL 5.7.5之后,MySQL在源码上改变了对Buffer Pool的管理,可以在MySQL进程运行的情况下,动态地配置innodb_buffer_pool_size。另外,需要强调的是,如果Buffer Pool的大小超过了1GB,应该通过调整 innodb_buffer_pool_instances=N,把它分成若干个instance的做法,来提升MySQL处理请求的并发能力,因为Buffer Pool是通过链表的方式来管理页面的,同时为了保护页面,需要在存取的时候对链表加锁,在多线程的情况下,并发去读写Buffer Pool里面缓存的页面需要锁的竞争和等待。所以,修改为多个instance,每个instance各自管理自己的内存和链表,可以提升效率。

f83981b851703ab7f51163d3b41d4660.png

Buffer Pool实现原理

在启动MySQL服务时,会将所有的内嵌存储引擎启动,包括InnoDB。InnoDB会通过函数buf_pool_init初始化所有的子系统,其中就包括了InnoDB Buffer Pool子系统。Buffer Pool可以有多个实例,可以通过配置文件中的参数innodb_buffer_pool_instances来设置,默认值为1,实现多实例的Buffer

Pool主要是为了提高数据页访问时的并发度。每个实例的空间大小都是相同的,也就是说系统会将整个配置的Buffer Pool大小按实例个数平分,然后每个实例各自进行初始化操作。

在代码中,一个Buffer Pool实例用buf_pool_t结构体来描述,这个结构体是用来管理Buffer Pool实例的一个核心工具,它包括了很多信息,主要有如下几个部分。

1. FREE链表,用来存储这个实例中所有空闲的页面。

2. flush_list链表,用来存储所有被修改过且需要刷到文件中的页面。

3. mutex,主要用来保护这个Buffer Pool实例,因为一个实例只能由一个线程访问。

4. chunks,指向这个Buffer  Pool实例中第一个真正内存页面的首地址,页面都是连续存储,所以通过这个指针就可以直接访问所有的其他页面。

上面的两个链表,管理的对象是结构体buf_page_t,这是一个物理页面在内存中的管理结构,是一个页面状态信息的结合体,其中包括所属表空间、Page

ID、最新及最早被修改的LSN值(最早LSN信息会在做检查点时使用,后面将会讲到),以及形成Page链表的指针等逻辑信息。实际上,这个结构是被另一个结构管理的,它是buf_block_t,buf_block_t与buf_page_t是一一对应的,都对应BufferPool中的一个Page,只是buf_page_t是逻辑的,而buf_block_t包含一部分物理的概念,比如这个页面的首地址指针frame等。关于buf_block_t,后面还会继续介绍。

初始化一个Buffer Pool实例内存空间的函数是buf_chunk_init。一个Buffer

Pool实例的内存分布是一块连续的内存空间,这块内存空间中存储了两部分内容,前面是这些数据缓存页面的控制头结构信息(buf_block_t结构),每一个控制头信息管理一个物理页面,这些控制头信息的存储,占用了部分Buffer

Pool空间,所以在运维过程中,看到状态参数innodb_buffer_pool_bytes_data总是比innoDB_buffer_pool_size小,就是因为控制头信息占用了部分空间。实际的分配方式是,Buffer Pool页面从整个实例池中从后向前分配,每次分配一个页面,而控制结构是从前向后分配,每次分配一个buf_block_t结构的大小,直到相遇为止,这样就将一个实例初始化好了。但一般情况下,中间都会剩余一部分没有被使用,因为剩余的空间不能再放得下一个控制结构与一个页面了。相应的分配代码如下。

81e52b6f2cfad4c98a6bf422adf392b3.png

其中,`chunk->size`是在前面提前根据Buffer Pool实例内存大小计算出来的,可以存储的最多的Page及Page对应控制结构的个数。

限于篇幅,本文第一部分结束。

文章来自微信公众号:DBAce

本文链接:http://www.yunweipai.com/15532.html

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

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

相关文章

数mysql据分析优化_从零开始学习数据分析-mysql架构与优化理论

mysql的逻辑分层:连接层 服务层 引擎层 存储层引擎层主要分为两类:InnoDB、MyIsam(使用show engines;查看)InnoDB是事务优先的,会进行行锁,适合高并发操作MyIsam是性能优先的,进行表锁sql优化点:等待时间长…

检验int值在list中是否存在_R语言统计与绘图:卡方检验

卡方检验在计数资料中的应用,包括推断两个总体率或构成比之间有无差别、多个总体率或构成比之间有无差别、多个样本率间的多重比较、两个分类变量之间有无关联性、多维列联表的分析和频数分布拟合优度的卡方检验。选自:周支瑞老师下面分别介绍计数资料怎…

mysql in 多个字段_MySQL如何同时自增自减多个字段

“本文将带大家聊一下如何同时自增自减多个字段”前言最近小Q同学去面试了,然后就问了题目的问题,如何同时自增自减多个字段。小Q一时回答不出来,最终的结果就是回家等通知....关于这个问题咔咔来给小Q简单的进行解答一下。一、ThinkPHP框架实…

wxpython 调用子窗口_wxpython入门第一步(简单例子)

在这部分wxPython教程中,我们将创建一些简单的例子。简单的例子​ 我们从一个非常简单的例子开始。我们的第一个脚本将只显示一个小窗口。它不会做太多事情。我们将逐行分析这个脚本。# simple.pyimport wxapp wx.App()frame wx.Frame(None, )frame.Show()app.Mai…

orderd mysql_Oracle入门教程:leading vs ordered hint

odered hint 可以指示oracle 使用from 关键字后面的表的顺序进行join连接!cbo会优先按照from 后面的表的顺序来进行join,当统计leading hint 可以指示Oracle使用leading 中指定的表作为驱动表,比如 正常的访问计划如下SCOTT> select e.ename, hiredat…

mysql标识列从一开始_mysql中标识列是什么意思有什么用

标识列是什么?标识列又称为自增长列。含义:可以不用手动的插入值,系统提供默认的序列值特点:1、标识列必须和主键搭配吗?不一定,但要求是一个key2、一个表可以有几个标识列?至多一个&#xff01…

mysql 及时点还原_mysqlbinglog基于即时点还原

mysqlbinlog介绍要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini,取决于你的系统)中找到路径。(mysql5.7开启binglog 时需要同时设置server-id否则无法启动)要想确定当前的二进制日志文件…

python mysql查表_python进阶(十、mysql:单表查询)

3.mysql数据库3.10 单表查询3.10.1. 简单查询查询在数据库中使用的频率是最高的:十次查询,一次增删改。1)建表2)插入数据3.10.1.1. 选择字段:selectselect 字段名1,字段名2…… from 表名 where 条件;3.10.1.2. 字段重命名(别名):…

python常见的数值运算符_第18 p,Python中各种常用的运算符,特别是增量运算符...

原标题:第18 p,Python中各种常用的运算符,特别是增量运算符大家好,我是杨数Tos,这是《从零基础到大神》系列课程的第18篇文章,第二阶段的课程:Python基础知识:Python中各种常用的运算…

python画害羞的表情_用Python把你的朋友变成表情包

一、项目说明在日常生活中,我们经常会存取一些朋友们的丑照,在这个项目中,我们以萌萌哒的熊猫头作为背景,然后试着在背景图上加入朋友们的照片。效果如下图所示:二、实现步骤导入朋友的照片(前景照片);处理…

.net md5 java 偏移量_C# java MD5加密方不一致问题

说来惭愧,做开发几年了,一直在吸取,今天也写写自已关于技术的一点点理解,不正之处,请大家多多指点。由于之前开发的项目使用的是C#,用户信息使用的C#的MD5加密码方式,而现在需要切换到Java平台下&#xff0…

java dijkstra算法代码_[转载]Java实现dijkstra算法: 地图中任意起点寻找最佳路径...

最近在复习java,下学期要用,写这个练手. 技术较粗糙,见谅.代码里用的是这幅地图,根据实际情况更改,在addNode方法中这个是运行结果,起点和终点在 运行wrap(String qidian, String zhongdian) 时定义代码&a…

java xml opencv_Java中使用opencv

零、前言作为图像处理出身,不仅仅要会C图像处理、matlab图像处理、python图像处理、最起码也得会java图像处理,当然我最终还都用的是opencv这个机器视觉库了。今天简单介绍一下java中如何使用opencv。一、配置库(1)官网下载opencv,在opencv\b…

java实现table可编辑_动态渲染可编辑单元格的Table

一、问题描述问题是这样的,后台传了xArr [x1, x2,...,xn]和yArr [y1, y2, ..yn]两个数组,前端要渲染出表格并且可以填写每个单元格的值,然后按照一定数据结构保存并传给后台,并且再次获取这个数据结构和数组xArr、yArr可以自己渲…

java包裹邮费计算_GitHub - honghailiang/FreightSystem: 基于Java Swing编写的简易运费计算工具...

FreightSystem基于java Swing编写的运费计算系统初始化数据从excel中读取数据,转化为对象(只保存基础数据:序列号、始发站、目的站、省份、100kg以下(元/kg)、100kg以上(元/kg)、到货(元/kg)、自提(元/kg)、补贴里程、公路里程、单价(元/吨公里))并保存到…

java需求设计_JavaWeb期末设计---需求分析文档. stage1

影院活动管理系统—需求分析文档目录第2章 需求分析2.1 用户需求2.1.1 业务需求2.1.2 商业需求2.1.3 特殊需求2.2 可行性分析2.2.1 技术可行性2.2.2 经济可行性2.3 系统功能2.3.1 功能概述2.3.2 E-R图2.3.4 Domian logic2.3.5 系统框架图-------------------------------------…

selenium java po模式_selenium + java po模式

po模式大概介绍,大家也可以自己百度看看Page Object模式主要是将每个页面设计为一个类class,这个类包含页面中需要测试的元素(按钮、输入框、URL、标题等)和实际操作方法,这样在写测试用例时可以通过调用页面类的方法和属性来获取页面元素和操…

java基础语法实例教程_Java 基础语法

一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作面向对象中的一些概念下表列出了 面向对象 编程中的一些概念名词说明对象对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有…

python3软件怎么使用_python3怎么使用pip

pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具。Python 2.7.9 或 Python 3.4 以上版本都自带 pip 工具。pip 官网:https://pypi.o…

深度学习图像融合_基于深度学习的图像超分辨率最新进展与趋势【附PDF】

因PDF资源在微信公众号关注公众号:人工智能前沿讲习回复“超分辨”获取文章PDF1、主题简介图像超分辨率是计算机视觉和图像处理领域一个非常重要的研究问题,在医疗图像分析、生物特征识别、视频监控与安全等实际场景中有着广泛的应用。随着深度学习技术的…