《InnoDB引擎五》Checkpoint技术

news2024/11/28 16:48:15

在这里插入图片描述

Checkpoint技术

  缓冲池的设计目的是为了协调CPU速度与磁盘速度的鸿沟。因此页的操作首先都是在缓冲池中完成的。如果一条DML语句,比如Update或Delete改变了页中的记录,那么此时页是脏的,即缓冲池中的页要比磁盘的新,那么数据库就需要将新版本的页从缓冲池刷新到磁盘。

  倘若每次一个页发生变化,都要将新页刷新到磁盘,那么这个开销是非常大的。如热点数据集在某几个页中,那么数据库的性能将变得非常差。同时,如果在从缓冲池往磁盘刷新页的时候发生的宕机,那么数据就不能恢复了。为了避免发生数据丢失的问题,当事务数据库系统普遍都采用Write Ahead log策略, 即当事务提交时,先写重做日志,再修改页。当因为宕机而导致数据丢失时,通过重做日志来完成数据的恢复。这也是事务ACID中持久性(Durability)的要求。

  如下场景需要思考:如果重做日志可以无限的增大,同时缓冲池也足够大,能够缓冲所有数据库的数据,那么是不需要将缓冲池中页的新版本刷新到磁盘。因为当发生宕机时,完全可以通过重做日志来恢复整个数据库系统的数据到宕机发生的时刻。但是这样做是有前提的:

  • 1.缓冲池可以缓存数据库中所有的数据
  • 2.重做日志可以无限增大

  对于第一个前提条件,有经验的用户都知道,当数据库刚开始创建时,表中没有任何数据。缓冲池的确可以缓存所有的数据库文件。然后随着市场的推广,用户的增加,产品越来越受到关注,使用量也越来越大。这时负责后台存储的数据库容量必定会不断增大。当前3TB的MySQL数据库已不少见,但是3TB的内存却非常少见。

  再看第二个前提条件,重做日志可以无限增大。也许是可以的,但是这对成本的要求太高了,同时不便于运维。DBA或SA不能知道什么时候重做日志是否已经接近于磁盘可使用空间的阈值,并且要让存储设备支持可动态扩展也是需要一定的技巧和设备支持的。

  当前即使以上两个条件都满足,那么还需要考虑的是,当数据库运行几个月甚至几年,如果发生宕机,那么通过重做日志恢复的话,需要多久呢?

  因此CheckPoint(检查点)技术的目的是解决以下几个问题:

  • 缩短数据库的恢复时间
  • 缓冲池不够用时,将脏页刷新到磁盘
  • 重做日志不可用时,刷新脏页

  当数据库发生宕机时,数据库不需要重做所有的日志,因为checkpoint之前的页都已经刷新回磁盘。故数据库只需对checkpoint后的的重做日志进行恢复。这样就大大缩短了恢复时间。

  此外,当缓冲池不够用时,根据LRU算法会溢出最近最少使用的页,如此页为脏页,那么需要强制执行checkpoint,将脏页也就是页的最新版本刷回磁盘。

  重做日志出现不可用的情况是因为当前事务数据库系统对重做日志的设计是循环使用的,并不是让其无线增大,这从成本及管理上都是比较困难的。重做日志可以被重用的部分是指这些重做日志已经不再需要了,即当数据库发生宕机时,数据库恢复操作不需要这部分的重做日志,因此这部分就可以被覆盖重用。若此时重做日志还需要使用,那么必须强制产生checkpoint,将缓冲池中的页至少刷新到当前重做日志的位置。

  对于InnoDB存储引擎而言,其是通过LSN(Log Sequenc Number)来标记版本的。而LSN是8字节的数字,其单位是字节。每个页有LSN,重做日志也有LSN,checkpoint也有LSN。可以通过命令show engine innodb status来观察:

mysql> show engine innodb status\G;
*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
=====================================
2022-11-21 10:02:07 0x7f573806e700 INNODB MONITOR OUTPUT
=====================================
......
---
LOG
---
Log sequence number 105133652
Log flushed up to   105133652
Pages flushed up to 105133652
Last checkpoint at  105133643
0 pending log flushes, 0 pending chkp writes
10 log i/o's done, 0.00 log i/o's/second
----------------------
......

  在InnoDB存储引擎中,checkpoint发生的时间、条件及脏页的选择等都非常复杂。而checkpoint所做的事情无外乎是将缓冲池中的脏页刷回到磁盘。不同之处在于每个刷新多少页到磁盘,每次从哪里取脏页,以及什么时间触发checkpoint。在InnoDB存储引擎内部,有两种checkpoint,分别位:

  • Sharp Checkpoint
  • Fuzzy Checkpoint

  Sharp CheckPoint发生在数据库关闭时将所有的脏页都刷新回磁盘,这是默认的工作,即参数innodb_fast_shutdown=1

mysql> show variables like '%innodb_fast_shutdown%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 1     |
+----------------------+-------+
1 row in set (0.00 sec)

  但是如果数据库在运行的时候也使用Sharp Checkpoint,那么数据库的可能性就会受到很大的影响。故在InnoDB存储引擎内部使用Fuzzy Checkpoint进行页的刷新,即只刷新一部分脏页,而部署刷新所有的脏页回磁盘。

  在InnoDB存储引擎中可能发生如下几种情况的Fuzzy Checkpoint:

  • Master Thread Checkpoint
  • FLUSH_LRU_LIST Checkpoint
  • Aysnc/Sync Flush Checkpoint
  • Dirty Page too much Checkpoint

Master Thread Checkpoint

  Master Thread中发生的Checkpoint,差不多以每秒或没十秒的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘。这个过程是异步的,即此时InnoDB存储引擎可以进行其他的操作,用户查询线程不会阻塞。

FLUSH_LRU_LIST Checkpoint

  FLUSH_LRU_LIST Checkpoint是因为InnoDB存储引擎需要保证LRU列表中需要有差不多100个空闲页可供使用。在InnoDB1.1.x版本之前,需要检查LRU列表中是否有足够的可用空间操作发生在用户查询线程中,显然这会阻塞用户的查询操作。倘若没有100个可用空闲页,那么InnoDB存储引擎会将LRU列表尾端的页移除。如果这些页中有脏页,那么需要进行Checkpoint,而这些页来自LRU列表的,因此称为FLUSH_LRU_LIST Checkpoint。

  从MySQL 5.6版本,也就是InnoDB1.2.x版本开始,这个检查被放在一个单独的Page Cleaner线程中进行,并且用户可以通过参数innodb_lru_scan_depth控制LRU列表中可用页的数量,该值默认位1024,如:

mysql> show variables like 'innodb_lru_scan_depth'\G;
*************************** 1. row ***************************
Variable_name: innodb_lru_scan_depth
        Value: 1024
1 row in set (0.00 sec)

Aysnc/Sync Flush Checkpoint

  Aysnc/Sync Flush Checkpoint指的是重做日志文件不可用的情况,这时需要强制将一些页刷新回磁盘,而此时是脏页是从脏页列表选取的。若将已经写入到重做日志的LSN几位redo_lsn,将已经刷新回磁盘最新页的LSN记为checkpoint_lsn,则可定义:

  checkpoint_age = redo_lsn - checkpoint_lsn

再定义以下的变量:

async_water_mark = 75% * total_redo_log_file_size
sync_water_mark = 90% * total_redo_log_file_size

  若每个重做日志文件的大小为1GB,并且定义了两个重做日志文件,则重做日志文件的总大小为2GB。那么asynx_water_mark=1.5GB,sync_water_mark=1.8GB。则:

  • 当checkpoint_age < aync_water_mark时,不需要刷新任何脏页到磁盘;
  • 当async_water_mark < checkpoint_age < sync_water_mark时触发Async Flush,从Flush列表中刷新足够的脏页回磁盘,使得刷新后满足checkpoint_age<async_water_mark;
  • checkpoint_age > sync_water_mark 这种情况一般很少发生,除非设置的重做日志文件太小,并且在进行类型LOAD DATA的BUCK INSERT操作。此时触发Sync Flush操作,从Flush列表中刷新足够的脏页回磁盘,使得刷新后满足checkpoint_age < sync_water_mark。

  可见,Async/Sync Flush Checkpoint是为了保证重做日志的循环使用的可能性在InnoDB 1.2.x版本之前,Async Flush Checkpoint会阻塞发现问题的用户查询线程,而Sync Flush Checkpoint会阻塞所有用户查询线程,并且等待脏页刷新完成。从InnoDB 1.2.x版本开始-也就是MySQL 5.6版本,这部分的刷新操作同时放入到了单独Page Cleaner Thread中,故不会阻塞用户查询线程

Dirty Page too much Checkpoint

  Dirty Page too much Checkpoint指的是脏页的数量太多,导致InnoDB存储引擎强制进行CheckPoint。其目的总的来说还是为了保证缓冲池中有足够可用的页。其可由innodb_max_dirty_pages_pct控制:

mysql> show variables like 'innodb_max_dirty_pages_pct'\G;
*************************** 1. row ***************************
Variable_name: innodb_max_dirty_pages_pct
        Value: 75.000000
1 row in set (0.01 sec)

  innodb_max_dirty_pages_pct值为75表示,当缓冲池中脏页的数量占据75%时,强制进行CheckPoint,刷新一部分的脏页到磁盘。在InnoDB 1.0.x版本之前,该参数默认值为90,之后的版本都为75。

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

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

相关文章

网络编程简单学习

目录 一、 概述 1. 什么是计算机网络&#xff1f; 2. 网络编程的目的 3. 需要达到什么样的效果&#xff1f; 二、 网络通信的两个要素 1. 通信双方地址 2. 规则&#xff1a;网络通信协议 三、IP地址 1. IP地址概述 2. IP地址分类 3. 域名 四、端口 五、通信协议 …

Python破解WIFI密码完整源代码,实测可成功破解

目录 # 修正记录&#xff1a;2022-12-01 1&#xff0c;先安装Python环境(这个不用多说了吧) 2&#xff0c;安装PyWifi 3,自己手工整理高频弱口令&#xff0c;不建议程序生成的字典&#xff0c;生成的字典成功率实在太低。 4&#xff0c;自己生成字典的算法&#xff1a; 5…

九联UNT413A_S905L3A__AI语音_默认打开ADB_完美线刷固件包【可救砖】

UNT413A_S905L3A__AI语音_默认打开ADB_完美线刷固件包【可救砖】_基于云南原机制作_端口5555 固件特点&#xff1a; 1、修改dns&#xff0c;三网通用&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、无开机广告&#xff0c;无系统更新&#xff0c;…

PyQt5 设置窗口背景

PyQt5 设置窗口背景使用setStyleSheet设置窗口背景图片使用setStyleSheet设置窗口背景颜色使用QPalette设置窗口背景颜色使用QPalette设置窗口背景图片使用paintEvent设置窗口背景颜色使用paintEvent设置窗口背景图片窗口背景主要包括&#xff1a;背景色和背景图片。设置窗口背…

跨境电商必知的交叉销售和追加销售:2022终极指南

关键词&#xff1a;跨境电商、交叉销售、追加销售 跨境电商可以从客户那里获得的潜在收入不会在销售点结束。 交叉销售和追加销售通过吸引客户增加支出来增加您的收入。这是一个双赢的局面&#xff0c;消费者获得了卓越的体验&#xff0c;而你赚到了更多的钱。 但是&#xff0c…

【Pandas数据处理100例】(九十七):Pandas中的eval()函数使用方法

前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPandas版本:1.3.5N…

axure到底好不好学,有哪些技巧

Axure学习难吗&#xff1f;这个问题一直引起很多朋友的讨论&#xff0c;有的觉得难&#xff0c;有的觉得不难。当然&#xff0c;人不一样&#xff0c;每个人的学习方式也不一样&#xff0c;对学习难度的理解自然也不一样&#xff0c;这个问题自然没有定论。 ​在学习的时候&…

数据库------E-R图和关系模型

1、请输出下面E-R图,并转换成关系模型 有实体 A B C A属性有a1(主键),a2,a3 B属性有b1(主键),b2,b3 C属性有c1(主键),c2,c3 A和B之间有X关系,B和C之间有Y关系,A和C之间有Z关系 一个A对应多个B,一个B对应多个A 一个A对应一个C,一个C对应一个A 一个B对应一个C,一个C对应多…

Js逆向教程19-websocket介绍

Js逆向教程19-websocket介绍 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、websocket介绍 Ws和Wss的区别相当于http和https的区别&#xff0c; 如果你想写一个聊天页面&#x…

Android Studio实现课程表应用,美观又实用(Kotlin版本)

项目目录一、应用概述二、主要技术三、开发环境四、主要功能1、设置课程表2、导入导出3、上下课提醒五、运行演示一、应用概述 本次课程表应用功能非常丰富&#xff0c;而且非常实用&#xff0c;可以添加学期的课程信息&#xff0c;设置展示的课程页面&#xff0c;设置上下课时…

李沐《动手学深度学习》第二版 pytorch笔记1 环境搭建

李沐《动手学深度学习》第二版pytorch笔记1 搭建环境 文章目录李沐《动手学深度学习》第二版pytorch笔记1 搭建环境此时尚有耐心虚拟环境搭建创建虚拟环境查看已有的虚拟环境激活虚拟环境安装深度学习框架和d2l软件包安装d2l安装pytorch连接到虚拟环境测试一下再试试...好难搞下…

[附源码]Python计算机毕业设计Django的剧本杀管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

《Mission Red in Slience》——这本“连环画”值得一看

生命离不开血液。 血液对人的意义是不言而喻的&#xff0c;当失血到总量的30%时&#xff0c;人就会有生命危险。这也就意味着献血有时是看似渺小&#xff0c;实际拯救生命的壮举。同时适度的献血对献血人也有助的。 但很多人对献血缺乏认识&#xff0c;认为其可能具有危险性&…

[附源码]Python计算机毕业设计SSM乐跑(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

3.每天进步一点点-Python爬虫需要了解HTTP 请求报文

14天学习训练营导师课程&#xff1a; 杨鑫《Python 自学编程基础》 杨鑫《 Python 网络爬虫基础》 杨鑫《 Scrapy 爬虫框架实战和项目管理》 文章目录1.HTTP 请求报文1.1 请求行1.2 请求头1.3 空行1.4 请求正文1.HTTP 请求报文 ​ HTTP&#xff08;Hyper Text Transfer Protoc…

基于51单片机锂电池电压电量检测(原理图+PCB+程序)

资料编号&#xff1a;198 下面是该资料仿真演示视频&#xff1a; 198-基于51单片机锂电池电压电量检测&#xff08;原理图PCB程序全套资料&#xff09;功能介绍&#xff1a; 采用51系列自带AD的单片机stc12c5a60s2型号单片机&#xff08;也是51单片机&#xff0c;外观引脚大小…

20uec++多人游戏【小球与玩家互动】

为小球添加生命值组件和伤害处理函数 //生命值组件UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category "Components")class USHealthComponent * HealthComp;//伤害处理函数UFUNCTION()void HandleTakeAnyDamage(USHealthComponent * OwnerHealthComp, float…

【蓝桥杯十四届第二期模拟赛】第四题——递归求解(python)(耗时仅不到1s出答案)(lru_cache)

前言 这次的第二期蓝桥杯模拟赛为登录官网考试&#xff0c;并没有使用我们那个机房的破电脑&#xff0c;你都让我使用我自己的电脑了&#xff0c;那我不得皮一下【doge】 第四题是填空题&#xff0c;虽然我报名的是c语言赛道&#xff0c;但是还是默默打开了我的pycharm&#…

Bandizip去除广告,注册图标,状态栏文本

Bandizip7.0版本之后&#xff0c;免费版就加入了广告。 安装完成后&#xff0c;Bandizip界面如下&#xff0c;很遗憾&#xff0c;我的没有出现广告&#xff0c;没法展示。 目标&#xff1a;去除界面左上角的注册图标&#xff0c;以及下方底部的状态栏“固实压缩”字样那里&am…

安全多方学习开源框架调研

原创 复旦DSG研究组 开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”…