首页 > 其他分享 >21. CheckPoint

21. CheckPoint

时间:2024-04-24 23:11:28浏览次数:20  
标签:21 NO LSN unsigned up CheckPoint bigint 日志

CheckPoint的作用

  • 缩短数据库的恢复时间
    • 数据库宕机恢复依赖redo log。当恢复时不需要重做所有日志,因为CheckPoint之前的页都已经刷盘,只需要对CheckPoint之后的日志进行恢复,从而缩短恢复时间
  • 缓冲池不够用时,将脏页刷新到磁盘
    • 当缓冲池不够时,LRU算法会溢出最近最少使用的页,若此页为脏页,会强制CheckPoint,将该脏页刷回到磁盘
  • 重做日志不可用时,刷新脏页
    • 不可用是因为对重做日志的设计是循环使用。重做日志可以被重用的部分,是指当数据库恢复时不需要的部分。若此时这部分重做日志还有用,则强制执行CheckPoint,将缓冲池的页刷新至少刷新到磁盘
  1. 数据页首先被读入BP中,当数据页中的某几条记录被更新或者插入新的记录时,所有的操作都是在Buffer Pool 先完成的;
  2. Buffer Pool中的某个页和磁盘中的某个页在(Space, Page_Number)上是相同的,但是其内容可能是不同的(Buffer Pool中的被更新过了),形成了脏页;
  3. 要定期将缓冲池中的脏页刷回磁盘(Flush),达到最终一致,即通过CheckPoint机制来刷脏页;

 

LSN

root@mysqldb 14:46:  [(none)]> show engine innodb status\G
-- 省略其他
---
LOG
---
Log sequence number          5552603620    -- 当前内存中最新的LSN
Log buffer assigned up to    5552603620
Log buffer completed up to   5552603620
Log written up to            5552603620
Log flushed up to            5552603620    -- redo刷新到磁盘的LSN
Added dirty pages up to      5552603620
Pages flushed up to          5552603620    -- 最后一个刷新到磁盘上的页的最新的LSN(NEWEST_MODIFICATION)
Last checkpoint at           5552603620    -- 最后一个刷新到磁盘上的页的第一次被修改的LSN(OLDEST_MODIFICATION)
Log minimum file id is       41
Log maximum file id is       41
32 log i/o's done, 0.00 log i/o's/second
  • LSN(Log Sequence Number) 是一个字节数。
    • Log sequence number 和 Log flushed up 这两个LSN可能会不同,运行过程中后者可能会小于前者,因为redo日志也是先在内存中更新,再刷到磁盘的。
  • Pages flushed up 与 Last checkpoint 其实都指向了最后一个刷新到磁盘的页,只是 Pages flushed up 代表了页中的 NEWEST_MODIFICATION,而 Last checkpoint 代表了页中的 OLDEST_MODIFICATION。
    • FLUSH LIST 使用 OLDEST_MODIFICATION 进行记录并排序,那在刷新脏页时, CheckPoint 的 LSN 值就对应的是 当前刷新到某个页 的 OLDEST_MODIFICATION ;
    • 当某个页只被修改过一次,则 Pages flushed up 与 Last checkpoint 会相等,反之多次修改,则 Pages flushed up 大于 Last checkpoint;
    • 在恢复时,从 CheckPoint 开始恢复,如果当前页的LSN大于CheckPoint的LSN,则表示不需要恢复了;(https://www.cnblogs.com/DataArt/p/10236642.html)

 

日志(redo)中的LSN

  • 假设当前的LSN为 C ,此时对某个页做修改,则会产生 M 个字节的日志(需要写入M个字节的日志),那此时的 LSN 则为 C+M 。依次类推,LSN是一个 单调递增 的值(字节数)。
  • 日志中的LSN代表了日志一共写入了多少个字节。

 

页中的LSN

页中也存在LSN,表示该页被修改的时候,对应的日志的LSN是多少;

root@mysqldb 15:05:  [(none)]> desc information_schema.INNODB_BUFFER_PAGE_LRU;
+---------------------+-----------------+------+-----+---------+-------+
| Field               | Type            | Null | Key | Default | Extra |
+---------------------+-----------------+------+-----+---------+-------+
| POOL_ID             | bigint unsigned | NO   |     |         |       |
| LRU_POSITION        | bigint unsigned | NO   |     |         |       |
| SPACE               | bigint unsigned | NO   |     |         |       |
| PAGE_NUMBER         | bigint unsigned | NO   |     |         |       |
| PAGE_TYPE           | varchar(64)     | YES  |     |         |       |
| FLUSH_TYPE          | bigint unsigned | NO   |     |         |       |
| FIX_COUNT           | bigint unsigned | NO   |     |         |       |
| IS_HASHED           | varchar(3)      | YES  |     |         |       |
| NEWEST_MODIFICATION | bigint unsigned | NO   |     |         |       |     -- 该页最近一次(最新)被修改的LSN值
| OLDEST_MODIFICATION | bigint unsigned | NO   |     |         |       |
| ACCESS_TIME         | bigint unsigned | NO   |     |         |       |     -- 该页在Buffer Pool中第一次被修改的LSN值
| TABLE_NAME          | varchar(1024)   | YES  |     |         |       |
| INDEX_NAME          | varchar(1024)   | YES  |     |         |       |
| NUMBER_RECORDS      | bigint unsigned | NO   |     |         |       |
| DATA_SIZE           | bigint unsigned | NO   |     |         |       |
| COMPRESSED_SIZE     | bigint unsigned | NO   |     |         |       |
| COMPRESSED          | varchar(3)      | YES  |     |         |       |
| IO_FIX              | varchar(64)     | YES  |     |         |       |
| IS_OLD              | varchar(3)      | YES  |     |         |       |
| FREE_PAGE_CLOCK     | bigint unsigned | NO   |     |         |       |
+---------------------+-----------------+------+-----+---------+-------+
20 rows in set (0.01 sec)

 

标签:21,NO,LSN,unsigned,up,CheckPoint,bigint,日志
From: https://www.cnblogs.com/gavin-zheng/p/18156577

相关文章

  • .NET周刊【4月第2期 2024-04-21】
    国内文章他来了他来了,.net开源智能家居之苹果HomeKit的c#原生sdk【Homekit.Net】1.0.0发布,快来打造你的私人智能家居吧https://www.cnblogs.com/hezp/p/18142099三合是一位不喜欢动态编程语言的开发者,对集成米家智能家居到苹果HomeKit的现有开源解决方案不满意。因为遇到了稳定......
  • P7914 [CSP-S 2021] 括号序列
    P7914[CSP-S2021]括号序列看起来非常复杂的括号题,看到数据范围,大概确定是区间dp,所以我们考虑怎么定义状态。条件非常多,所以二维的状态肯定表示不了,考虑多加一维来定义不同的状态。\(dp_{i,j,0}\):区间形式是***...***的方案数。\(dp_{i,j,1}\):区间形式是(...)的方案数......
  • P7961 [NOIP2021] 数列
    P7961[NOIP2021]数列这题想了一半,后面有点不敢想结果直接看题解了。思考后发现,对于\(a_i\lex\),也就是二进制中第\(x\)位前的部分,它们都可能会影响到二进制中第\(x\)位后的进位,而\(a_i>x\)的部分是不会影响到\(x\)位前的进位的。所以为了满足无后效性,我们从低位向高......
  • 2024.4.21 模拟赛
    Aperm首先若\((i+j)\)为奇数则需要满足其中一个是奇数,另一个必须是偶数。若\(k=0\),那么要求\(A_i\)和\(A_j\)同号,也就是所有数必须都是同一奇偶性。若满足则答案为\(n!\),否则为\(0\)。若\(k=1\),那么要求\(A_i\)和\(A_j\)异号。奇下标位置为\(\lceil\frac{n......
  • 「洛谷」题解:P1217 回文质数
    题目传送门看着题目好像很简单的样子,实际上做起来才会发现,这么多函数他奶奶的是普及-难度?在这道题目当中,我们最少需要写两个函数,如果需要优化可以再多写一个,待会儿的代码我们就直接放最简单版本的了。有人说这道题可以暴力对拍之后再输出,这完全可以,但是这么简单的题目不至于使用......
  • Win10_x64 21h2调试体系分析
    参考https://www.52pojie.cn/thread-1728894-1-1.html记的笔记,发出来参考下,抛砖引玉,有错误多纠正。还望各位大佬别嘲笑。平台如下:版本      Windows10专业版版本号      21H2安装日期      ‎2021-‎08-‎23操作系统内部版本  ......
  • AP5121是一款外围电路简单的多功能平均电流型LED 恒流驱动器
    AP5121是一款外围电路简单的多功能平均电流型LED恒流驱动器,适用于宽电压范围的非隔离式大功率恒流LED驱动领域。芯片PWM端口支持超小占空比的PWM调光,可响应最小60ns脉宽。芯片采用我司专利算法,为客户提供最佳解决方案,最大限度地发挥灯具优势,以实现景观舞台灯高辉的调......
  • JTCR-网络-21
    InetAddressInetAddress类用于封装IP地址或者域名,支持IPv4和IPv6。创建InetAddress对象需要使用工厂方法,因为没有提供显式构造器。工厂方法如下staticInetAddressgetLocalhost();staticInetAddressgetByName(StringhostName);//一个域名对应多个IP地址时,返回......
  • 第21章 控制器和视图(一)
    1准备工作添加包:dotnetaddpackageMicrosoft.AspNetCore.Mvc.Razor.RuntimeCompilation--version3.1.12开始使用视图2.1配置应用程序HTML响应是使用视图创建的,视图则是混合了HTML元素和C#表达式的文件。配置Startup来启用HTML响应。services.AddControllersWithVie......
  • CVE-2021-34371 Neo4j-Shell 漏洞复现
    前言偶然的一次机会遇到了这个漏洞,决定在vulhub复现下,重要提醒:本次复现所需要的环境为java8kali更换java环境戳这里漏洞描述Neo4j到3.4.18(启用shell服务器)公开了一个RMI服务,该服务可以任意反序列化Java对象,例如通过setSessionVariable。攻击者可滥用此漏洞进行远程......