MySQL-脏页的刷新机制
MySQL内存结构-缓冲区
MySQL的缓冲区中有数据页,索引页,插入缓冲等等,这个角度是从页的功能来分类的。本小节从另一个视角关注这些页,如果从 是否被修改过(和磁盘不一致) 这个角度来区分这些页,那么页可以被分为干净的页和脏页。
- 干净页:内存中的数据和磁盘一致
- 脏页:内存中的数据和磁盘不一致
本小节主要关注脏页刷新到磁盘的机制,首先需要了解缓冲区的内存管理细节。
内存管理机制简述
缓冲区中包含这三大类列表。分别为:LRUList、FreeList、FlushList。
在数据库刚启动时,LRUlist中并没有数据页,空闲页都存放在FreeList中,当需要读取某个页时,会从free列表中获取一个空闲页,读入数据后,放入LRU列表中;如果free中没有空闲页了,那么根据LRU算法淘汰Lru列表中末位的页。
- LRU列表:管理已经被读取的页
- Free列表:管理空闲的页
当LRU中的页被修改后,页就变成了脏页,这个页也会被加入Flush列表中。注意:这时这个页既在LRU列表中,又在Flush列表中。
- Flush列表:管理脏页
总结:LRUList和FreeList用来管理页的可用性;Flush列表用来管理脏页的刷新
脏页的刷新机制-checkpoint机制
数据修改和读取只依赖缓冲区行不行?
如果数据修改和读取只依赖内存的缓冲区,那么一旦数据库宕机,内存中的数据都会丢失。所以MySQL使用之前讲过的redo log来实现异常重启的数据恢复,redolog相关介绍可以看篇文章:MySQL-redo log 和 binlog
简单来说,就是在更新缓冲区之前,先写入redo log,保证异常重启之后可以正常恢复缓冲区中的数据。
脏页为什么一定要刷新?
考虑这种情况
- 缓冲区可以无限大
- redo log可以无限大或者无限拆分为多个文件
如果缓冲区无限大,可以装下所有的磁盘数据,redo log也可以无限大,那么就算异常重启,依靠redo log也可以恢复所有的更新。但现实中,首先,缓冲区依赖的内存空间不可能无限大,现实中有许多TB级别的数据库,但是目前还没有TB级别的内存;并且 redo log如果无限大或者有许多个文件,对运维和管理也是一个考验;最后,如果系统中有大量的修改操作,一旦宕机,恢复的时间也会非常长。
所以自然而然,我们就一定需要把内存中的脏页按照某种规则刷新到磁盘中,有了刷新这个操作,缓冲区的大小问题和redo log的大小问题都可以解决。
- 缓冲区不需要无限大了,因为可以持久化到磁盘
- redo log也不需要无限大了,因为一旦持久化到磁盘,redo log中对应的那部分数据就可以释放。
如何刷新呢?
上部分讨论的是脏页刷新到磁盘的必要性。那具体应该如何刷新呢?MySQL中,刷新的规则叫checkpoint机制。
在InnoDB存储引擎中,有两种checkpoint:
- sharp checkpoint:在数据库关闭时,刷新所有的脏页到磁盘,这里有参数控制,默认是开启的
- fuzzy checkpoint:刷新一部分脏页到磁盘中。
关于Fuzzy checkpoint,InnoDB存储引擎中可能包括如下几种:
- 定时刷新 - master thread做
- Flush LRUlist checkpoint -page cleaner thread做
- async/sync checkpoint -page cleaner thread做
- dirty too much checkpoint -?谁做?
刷新机制用更通俗易懂的角度来分析,上面的四种类型可以对应下面的
- 无论如何,定时刷新
- 当LRU中列表中空闲页不足时,强制LRU删除一些末尾的页,如果存在脏页,那么需要checkpoint刷新
- 使用innodb_lru_scan_depth来控制最少空闲页的数量
- 当重做日志不够用时,从flush 列表中选择一些页,强制checkpoint刷新
- 重做日志有两个水位:async水位 75% * innodb的总大小;sync水位:90* innodb大小。
- 当未刷新的数据大小 小于 低水位,不需要刷新
- 当未刷新的数据大小 大于 低水位,小于高水位,异步刷新,保证刷新后小于 低水位
- 当未刷新的数据大小 大于 高水位,同步阻塞刷新,保证刷新后小于 低水位。
- 关注系统中的整体脏页比例,如果达到一定比例,强制刷新
- 使用 innodb_dirty_page_pct来控制这个比例数值,默认时75%
master thread中的定时刷新机制
1)InndoDB1.0.x版本之前的master thread。
每秒,会进行一次 dirty too much checkpoint。
每10秒
- 判断过去10秒的IO操作是否小于200次,如果是,刷100个脏页;
- 判断系统当前脏页比例,如果超过70%,刷新100个;如果小于70%,刷新脏页的10%
2)InndoDB1.2.x版本之前的master thread。
在1.0.x存在硬编码,每秒最多只会刷新100个脏页到磁盘中,这种规定其实限制了性能更高的SSD磁盘。
在1.0.x版本,可以使用innodb_io_capacity来表示磁盘io的吞吐量。刷新脏页的数量由innodb_io_capacity来控制,默认是200。
总结
了解脏页刷新机制以及相应的参数是很有必要的,当数据库系统某些性能问题时,要考虑是否是脏页刷新相关的配置参数不合理导致的。
根据实际业务,考虑缓冲区的大小,redo log的大小,最少空闲页,脏页比例,io吞吐量相关参数是否配置合理,根据优化相关参数,解决系统问题。
MySQL-脏页的刷新机制的更多相关文章
- MySQL中InnoDB脏页刷新机制Checkpoint
我们知道InnoDB采用Write Ahead Log策略来防止宕机数据丢失,即事务提交时,先写重做日志,再修改内存数据页,这样就产生了脏页.既然有重做日志保证数据持久性,查询时也可以直接从缓冲池页中 ...
- InnoDB Redo Flush及脏页刷新机制深入分析
概要: 我们知道InnoDB采用Write Ahead Log策略来防止宕机数据丢失,即事务提交时,先写重做日志,再修改内存数据页,这样就产生了脏页.既然有重做日志保证数据持久性,查询时也可以直接从缓 ...
- 面试题:了解MySQL的Flush-List吗?顺便说一下脏页的落盘机制!(文末送书)
Hi,大家好!我是白日梦! 今天我要跟你分享的MySQL话题是:"了解Flush-List吗?顺便说一下脏页的落盘机制!(文末送书)" 本文是MySQL专题的第 8 篇,共110篇 ...
- Mysql的刷脏页问题
平时的工作中,不知道你有没有遇到过这样的场景,一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短. 当内存数据 ...
- Mysql怎么判断繁忙 checkpoint机制 innodb的主要参数
Mysql怎么判断繁忙,innodb的主要参数,checkpoint机制,show engine innodb status 2018年07月13日 15:45:36 anzhen0429 阅读数 ...
- MySQL:刷脏页
1. 脏页,干净页 当内存数据页和磁盘数据页上的内容不一致时,我们称这个内存页为脏页: 内存数据写入磁盘后,内存页上的数据和磁盘页上的数据就一致了,我们称这个内存页为干净页. 2. 刷脏页的时机 2. ...
- 【MySQL 读书笔记】SQL 刷脏页可能造成数据库抖动
开始今天读书笔记之前我觉得需要回顾一下当我们在更新一条数据的时候做了什么. 因为 WAL 技术的存在,所以当我们执行一条更新语句的时候是先写日志,后写磁盘的.当我们在内存中写入了 redolog 之后 ...
- mysql-5.7 innodb_buffer_pool刷新机制详解
一.innodb的脏页刷新机制说明: 1.当innodb中的脏页比例超过innodb_max_dirty_pages_pct_lwm的值时,这个时候innodb就会开始刷新脏页到磁盘. 2.当inno ...
- InnoDB引擎之flush脏页
利用 WAL 技术,数据库将随机写转换成了顺序写,大大提升了数据库的性能,由此也带来了内存脏页的问题. 脏页会被后台线程自动 flush,也会由于数据页淘汰而触发 flush,而刷脏页的过程由于会占用 ...
- Innodb刷脏页技术深度挖掘
DBA某数据库集群每日17:00左右会出现一个性能陡降的现象,在10~20秒内主库出现大量慢查询.这些查询本身没有性能问题,也没有任何关联,可以认为是由于数据库系统负载较重,由于并发导致的慢查询.通过 ...
随机推荐
- Redis 源码简洁剖析 01 - 环境配置
fork Redis 源码 在 GitHub 上找到并 fork Redis 源码 https://github.com/redis/redis,然后在本地 clone 自己 fork 出来的源码项目 ...
- 第七章 (Nginx+Lua)Web开发实战商品详情页
本章以京东商品详情页为例,京东商品详情页虽然仅是单个页面,但是其数据聚合源是非常多的,除了一些实时性要求比较高的如价格.库存.服务支持等通过AJAX异步加载加载之外,其他的数据都是在后端做数据聚合然后 ...
- biancheng-NumPy教程
目录http://c.biancheng.net/numpy/ 1NumPy是什么2NumPy下载与安装3NumPy ndarray对象4NumPy数据类型5NumPy数组属性6Numpy创建数组7N ...
- 项目PMP之六项目进度管理
项目PMP之六--项目进度管理 一.定义:用于沟通和管理相关方期望的工具,可作为报告绩效的基础,说明项目的交付时间和方式 迭代型进度计划(敏捷模式):接受存在未完成项,滚动式规划管理 按需进度计划 ...
- JS获取字符串长度的常用方法,汉字算两个字节
JS获取字符串实际长度(双字节字符.汉字算两个字符) //第一种 GetLength = function(str) { var realLength = 0; for (var i = 0; i & ...
- shell脚本中的函数
如果你学过开发,肯定知道函数的作用.如果你是刚刚接触到这个概念的话,也没有关系,其实很好理解的.函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名 ...
- react生命周期-渲染阶段
import React, { Component } from "react"; export default class Shengming extends Component ...
- 在SOUI中使用GetAttribute获取XML中配置的属性
SOUI的界面布局使用XML来布局,在XML配置的属性值会通过SObject::SetAttribute(name, value)的方式交给SObject处理. SWindow是SOUI的界面元素对象 ...
- 用DeepSeek写程序之一:编写在linux终端窗口右上角动态显示时间的c++程序
一. 简单需求 早前有个需求当SSH进入linux时,希望在终端窗口动太显示当前的时间,原来是用脚本解决的 while sleep 1;do tput sc;tput cup 0 $(($(tput ...
- shell学习之保存数据库
自动备份 Mysql 数据库脚本 #!/bin/bash #author by wxp #used to backup mysql practise USER=root PASSWD=1234 HOS ...