MySQL Checkpoint机制

checkpoint干的事情:

将缓冲池中的脏页刷新回磁盘,不同之处在于每次从哪里取多少脏页刷新到磁盘,以及什么时候触发checkpoint。

checkpoint解决的问题:

1.缩短数据库的恢复时间(数据库宕机时,不需要重做所有的日志,因checkpoint之前的页都已经刷新回磁盘啦)

2.缓冲池不够用时,将脏页刷新到磁盘(缓冲池不够用时,根据LRU算会溢出最近最少使用的页,若此页为脏页,需要强制执行checkpoint将脏也刷回磁盘)

3.重做日志不可用时,刷新脏页(采用循环使用的,并不是无限增大。当重用时,此时的重做日志还需要使用,就必须强制执行checkpoint将脏页刷回磁盘)

checkpoint分类:

1.Sharp Checkpoint

发生在数据库关闭时将所有的脏页刷回磁盘,这是默认的。通过参数innodb_fast_shutdown=1来设置。

2.Fuzzy Checkpoint

在InnoDB存储引擎内部使用Fuzzy Checkpoint进行页的刷新,即只刷新一部分脏页,而不是全部刷新。大致分为以下几种情况:

a.Master Thread Checkpoint

差不多以每秒或者每十秒从缓冲池的脏页列表(Flush列表),这是异步操作,InnoDB存储引擎可以进行其他的操作部分不会发生堵塞。

b.FLUSH_LUR_LIST Checkpoint

InnoDB存储引擎需要保证LRU列表中有差不多100个空闲页可供使用。在InnoDB1.1.X版本之前,需要检查LRU列表中是否有足够的可用空间操作发生在用户查询线程中,显然这会阻塞用户的查询操作。倘若没有100个空闲页,那么InnoDB存储引擎会将LRU列表尾端的页移除,如果这些页中有脏页,那么需要进行Checkpoint,而这些来自于LRU列表的被称为FLUSH_LRU_LIST Checkpoint。但是在MySQL5.6版本后这个检查被放在了一个单独的Page Cleaner
Thread中进行,通过参数innodb_lru_scan_depth来设置可用页的数量。

c.Async/Sync Flush Checkpoint

在重做日志文件不可用的情况下,需要将一些也刷新回磁盘,而操作发生在Flush列表上。若将已经写入到重做日志的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_file_size。若每个重做日志的大小为1G且定义了两个重做日志共2G。那么async_water_mark=1.5G,sync_water_mark=1.8G。

当checkpoint_age<async_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的BULK INSRET操作。这个时候触发Sync Flush从Flush列表刷新足够的脏页会磁盘,使得刷新后满足checkpoint_age<async_water_mark;

Async Flush Checkpoint会阻塞发现问题的用户查询线程,Sync Flush Checkpoint会阻塞所有的用户查询线程,并且等待脏页刷新完成。但是从MySQL5.6版本开始这部分操作放入单独的Page Cleaner Thread中,不再会堵塞用户查询线程。

d.Dirty Page too much Checkpoint

脏页的数量太多导致InnoDB存储引擎强制进行Checkpoint,其目的是为了保证缓冲池中有足够的页可以用。可以通过参数innodb_max_dirty_pages_pct来设置。

注意:Checkpoint机制将脏页刷回磁盘并不是直接刷回磁盘的,而是通过doublewrite(两次写). 即通过memcpy函数将脏页先复制到内存中的doublewrite buffer,之后通过doublewrite分两次(每次1MB)顺序写入共享表空间的物理磁盘上,然后调用fsync函数同步磁盘。具体是怎么实现的会在以后的博客中分享。

时间: 2024-08-25 09:27:22

MySQL Checkpoint机制的相关文章

【mysql】关于checkpoint机制

一.简介 思考一下这个场景:如果重做日志可以无限地增大,同时缓冲池也足够大,那么是不需要将缓冲池中页的新版本刷新回磁盘.因为当发生宕机时,完全可以通过重做日志来恢复整个数据库系统中的数据到宕机发生的时刻. 但是这需要两个前提条件:1.缓冲池可以缓存数据库中所有的数据:2.重做日志可以无限增大 因此Checkpoint(检查点)技术就诞生了,目的是解决以下几个问题:1.缩短数据库的恢复时间:2.缓冲池不够用时,将脏页刷新到磁盘:3.重做日志不可用时,刷新脏页. 当数据库发生宕机时,数据库不需要重做

InnoDB存储引擎介绍-(4)Checkpoint机制二

原文链接 http://www.cnblogs.com/chenpingzhao/p/5107480.html 一.简介 思考一下这个场景:如果重做日志可以无限地增大,同时缓冲池也足够大,那么是不需要将缓冲池中页的新版本刷新回磁盘.因为当发生宕机时,完全可以通过重做日志来恢复整个数据库系统中的数据到宕机发生的时刻. 但是这需要两个前提条件:1.缓冲池可以缓存数据库中所有的数据:2.重做日志可以无限增大 因此Checkpoint(检查点)技术就诞生了,目的是解决以下几个问题:1.缩短数据库的恢复时

mysql锁机制(转载)

锁是计算机协调多个进程或线程并发访问某一资源的机制 .在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素. 从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. MySQL锁概述相对其他数据库而言,MySQL的锁机制比较简单,

对mysql锁机制的学习

1.对于mysql学习,经常翻看一些博客,论坛,好像或多或少有mysq锁机制的学习与总结,所以今天有必要 对mysql锁机制的一些个人的总结,以便以后深入的学习. 2.学习这件事,从来都是“深入浅出”的,今天留个痕迹,说不定以后“受益匪浅”. a.数据库锁是什么 数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制. MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. b.mysql锁机制的3中类型 表级锁,行级锁,页级锁 c.各级锁的特点

Mysql锁机制和事务控制

如何加锁 锁定表的语法:    LOCK TABLES    tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}    [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...解锁语法:    UNLOCK TABLES innodb的存储引擎提供行级锁,支持共享锁和排他锁两种锁定模式,以及四种不同的隔离级别. 死锁 InnoDB自动检测事务的死锁,并回滚一个

MySQL锁定机制简介

MySQL锁定机制简介 数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外.MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别. 总的来说,MySQL各存储引擎使用了三种类型(级别)的

mysql锁机制整理

Auth: jinDate: 20140506 主要参考整理资料MYSQL性能调优与架构设计-第七章 MYSQL锁定机制http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html理解MySQL--架构与概念http://www.cnblogs.com/yequan/archive/2009/12/24/1631703.html 一.mysql锁类型及应用介绍1.锁类型和应用类型相對其他數據庫而言,MySQL的鎖機制比較簡單,其

MySQL缓存机制

目录 1. MySQL缓存简介 1. MySQL缓存机制说明 2. MySQL缓存失效 3. 使用场景 2. 命中条件 3. 工作流程 4. 缓存失败 5. 缓存的内存管理 6. 缓存的使用时机 1. 通过缓存命中率判断 2. 通过缓存写入率判断 3. 通过命中-写入率判断 7. 缓存参数配置 1. 查看缓存相关配置 2. query_cache_type 3. query_cache_size 4. query_cache_min_res_unit 5. query_cache_limit 6

详解mysql复制机制--异步复制,半同步复制和并行复制

详解MySQL复制机制--异步复制,半同步复制和并行复制 **# 异步复制 异步复制是MySQL自带的最原始的复制方式,主库和备库成功建立复制关系后,在备库上会有一个IO线程去主库拉取binlog,并将binlogx到本地,就是下图中Relaylog,然后备库会开启另外一个SQL线程取回放Relay log,通过这种方式达到Master-Slave数据同步的目的. 通常情况下,slave是只读的,可以承担一部分读流量,而且可以根据实际需要,添加一个或者多个slave,这样在一定程度上可以缓解主库