当前位置: 首页 > news >正文

【数据库】数据库中的检查点Checkpoint,数据落盘的重要时刻

检查点(checkpoint)

专栏内容

  • 手写数据库toadb
    本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。
    本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 检查点(checkpoint)
  • 前言
  • 概述
  • 问题
  • 解决方法
  • 静态检查点
  • 非静态检查点
  • 总结
  • 结尾

在这里插入图片描述

前言

随着信息技术的飞速发展,数据已经渗透到各个领域,成为现代社会最重要的资产之一。在这个大数据时代,数据库理论在数据管理、存储和处理中发挥着至关重要的作用。然而,很多读者可能对数据库理论感到困惑,不知道如何选择合适的数据库,如何设计有效的数据库结构,以及如何处理和管理大量的数据。因此,本专栏旨在为读者提供一套全面、深入的数据库理论指南,帮助他们更好地理解和应用数据库技术。

数据库理论是研究如何有效地管理、存储和检索数据的学科。在现代信息化社会中,数据量呈指数级增长,如何高效地处理和管理这些数据成为一个重要的问题。同时,随着云计算、物联网、大数据等新兴技术的不断发展,数据库理论的重要性日益凸显。

因此,本专栏的分享希望可以提高大家对数据库理论的认识和理解,对于感兴趣的朋友带来帮助。

概述

本文将通过一个问题,来分享什么是检查点,检查点可以带来那些好处。

问题

在本专栏的前一篇数据日志中,介绍了当系统故障时,缓冲区的脏数据就会丢失,可以通过redo、undo日志进行恢复,使数据达到一致性和完整性。

那么问题就来了:
redo和undo日志从数据库创建时,就开始记录这些日志,数据库一般都会运行很长时间,甚至数年,如果这么多日志,有可能都比数据本身还要大,在更新频繁的数据库上,日志很容易撑爆磁盘,那么如何解决这一问题呢?

解决方法

很长时间以前的日志,有些事务已经提交,而且数据已经都落盘了,其实这些日志已经没有用了,即使发生系统故障,这些日志对应的数据也不需要再恢复了,因为它们对应的数据已经持久化了。

所以我们需要找到一个时间点,在这个时间点前发生的脏页和所有日志都需要落盘,在这个时间点之后的可以不强制落盘,那么在这时间点以前的日志就可以清理掉了。

这个时间点就叫做检查点,也就是增加了一个分隔点,减少日志保存的周期和恢复的范围。

这个检查点如何来做呢? 有下面两种方式。

静态检查点

在做检查点的时候,需要保证当前的日志和脏页都要落盘,为了保证检查点落盘的过程中,不会再产生脏页和日志,需要在执行检查点动作时,数据库不能提供服务,做完检查点之后继续提供服务。

这样检查点时,对当前所有脏页和日志落盘即可,比较简单。

但是检查点在数据库业务繁忙时,也是一个相当频繁的动作,总不能频繁的中断业务吧,这还能不能行?

非静态检查点

哎,经过发展,现代数据库可以在业务运行时做检查点了,它的流程是这样的:

  • 开始检查点
  • 记录当前数据库的快照
  • 开始将比快照旧的脏页和日志落盘
  • 检查点结束

这里多了一步快照的记录,然后落盘时增加了与快照的比较,这样就保证了检查点前的都已经落盘。
当然原理这样,不同数据库的实现各不相同,比如postgresql,通过日志的lsn来记录快照,比此lsn旧的都需要落盘;

总结

检查点机制强制脏页定期落盘,缩小了日志保存的周期,同时也减少了恢复的周期。当然这个周期,需要根据业务产生日志的速率来配置,在性能和磁盘空间之间均衡,避够刷盘太快。

有菜也有肉的分享,下面插一段hello world的代码;
以下是一个简单的启动程序示例,可以在加电后从指定的加载地址开始执行,并输出 “Hello”:

ORG 0x7c00    ;指定加载地址为0x7c00start:mov ax, cs   ;将cs寄存器的值加载到ax寄存器中mov ds, ax   ;将ds寄存器的值设置为cs寄存器的值mov si, msg  ;将消息的地址存储在si寄存器中call print   ;调用print函数打印消息jmp end     ;跳转到程序结束处print:lodsb         ;将si指向的字符串中的下一个字符加载到al寄存器中or al, al   ;判断al寄存器中的值是否为0jz end      ;如果是0,跳转到程序结束处mov ah, 0x0e ;将0x0e存储在ah寄存器中,表示在屏幕上打印字符int 0x10     ;调用BIOS中断,将字符打印到屏幕上jmp print   ;继续打印下一个字符end:jmp $         ;无限循环,程序结束处msg db 'Hello', 0 ;消息以0结尾

该程序使用汇编语言编写,可以在Bochs、QEMU等模拟器上运行。程序加载后,将从地址0x7c00开始执行,输出 “Hello” 字符串,并进入无限循环。

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

相关文章:

【数据库】数据库中的检查点Checkpoint,数据落盘的重要时刻

检查点(checkpoint) ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定…...

关于 Docker

关于 Docker 1. 术语Docker Enginedockerd(Docker daemon)containerdOCI (Open Container Initiative)runcDocker shimCRI (Container Runtime Interface)CRI-O 2. 容器启动过程在 Linux 中的实现daemon 的作用 Docker 是个划时代的开源项目,…...

​LeetCode解法汇总2342. 数位和相等数对的最大和

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给你一个下…...

数据库的级联删除

级联删除是指在数据库中删除一个对象时,与该对象有关的其他对象也被自动删除。在 Django 中,级联删除通常通过在模型中定义外键时使用 on_delete 参数来实现。以下是一些常见的 on_delete 选项: 1.models.CASCADE: 当关联的对象被删除时&…...

【Python 千题 —— 基础篇】奇数列表

题目描述 题目描述 创建奇数列表。使用 for 循环创建一个包含 20 以内奇数的列表。 输入描述 无输入。 输出描述 输出创建的列表。 示例 示例 ① 输出: 创建的奇数列表为: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]代码讲解 下面是本题的代码: #…...

当npm下载库失败时可以用cnpm替代

下载cnpm npm install -g cnpm --registryhttp://registry.npmmirror.com 然后使用cnpm代替npm下载即可 cnpm install...

PyTorch多GPU训练时同步梯度是mean还是sum?

PyTorch 通过两种方式可以进行多GPU训练: DataParallel, DistributedDataParallel. 当使用DataParallel的时候, 梯度的计算结果和在单卡上跑是一样的, 对每个数据计算出来的梯度进行累加. 当使用DistributedDataParallel的时候, 每个卡单独计算梯度, 然后多卡的梯度再进行平均.…...

Spring Framework IoC依赖注入-按Bean类型注入

Spring Framework 作为一个领先的企业级开发框架,以其强大的依赖注入(Dependency Injection,DI)机制而闻名。DI使得开发者可以更加灵活地管理对象之间的关系,而不必过多关注对象的创建和组装。在Spring Framework中&am…...

IDEA运行thymeleaf的html文件打开端口为63342且连不上数据库

这边贴apple.html代码 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>User List</title> </head> <body> <h1>User List</h1> <table&…...

sql报错注入和联合注入

1.[NISACTF 2022]join-us 过滤&#xff1a; as IF rand() LEFT by updatesubstring handler union floor benchmark COLUMN UPDATE & sys.schema_auto_increment_columns && 11 database case AND right CAST FLOOR left updatexml DATABASES BENCHMARK BY sleep…...

028 - STM32学习笔记 - ADC结构体学习(二)

028 - STM32学习笔记 - 结构体学习&#xff08;二&#xff09; 上节对ADC基础知识进行了学习&#xff0c;这节在了解一下ADC相关的结构体。 一、ADC初始化结构体 在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef&#xff08;其中xx为外设名&#xff0c;例如…...

Pytest自动化测试框架:mark用法---测试用例分组执行

pytest中的mark&#xff1a; mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记名)&#xff0c;实现测试分组功能&#xff0c;并能和其它插件配合设置测试方法执行顺序等。 如下图&#xff0c;现在需要只执行红色部分的测试方法&#xff0c;其它方法不执行&am…...

【TCP连接的状态】

linux查看tcp的状态命令&#xff1a; 1&#xff09;、netstat -nat 查看TCP各个状态的数量 2&#xff09;、lsof -i:port 可以检测到打开套接字的状况 3)、 sar -n SOCK 查看tcp创建的连接数 4)、tcpdump -iany tcp port 9000 对tcp端口为9000的进行抓包 查看占用端口…...

Node.js入门指南(一)

目录 Node.js入门 什么是Node.js Node.js的作用 Node.js安装 Node.js编码注意事项 Buffer(缓冲器&#xff09; 定义 使用 fs模块 概念 文件写入 文件读取 文件移动与重命名 文件删除 文件夹操作 查看资源状态 路径问题 path模块 Node.js入门 什么是Node.js …...

使用Grpc实现高性能PHP RPC服务

文档&#xff1a;Quick start | PHP | gRPC 下面将介绍使用 Grpc 和 Protobuf 实现高性能 RPC 服务的具体步骤&#xff1a; 1. 安装 Grpc 和 Protobuf 首先需要安装 Grpc 和 Protobuf。可以从官网下载相应的安装包&#xff08;Supported languages | gRPC&#xff09;或通过…...

二、爬虫-爬取肯德基在北京的店铺地址

1、算法框架解释 针对这个案例&#xff0c;现在对爬虫的基础使用做总结如下&#xff1a; 1、算法框架 (1)设定传入参数 ~url: 当前整个页面的url:当前页面的网址 当前页面某个局部的url:打开检查 ~data:需要爬取数据的关键字&…...

linux驱动开发.之spi测试工具spidev_test源码(一)

同i2c-tools工具类似&#xff0c;spidev_test是用来测试SPI BUS的用户态程序&#xff0c;其源码存在kernel目录下的tools下&#xff0c;具体为tools\spi\spidev_test.c。buildroot同样也提供名为spidev_test的package&#xff0c;可以直接进行编译&#xff0c;方便用户调试spi总…...

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于材料生成优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…...

Go——二、变量和数据类型

Go 一、Go语言中的变量和常量1、Go语言中变量的声明2、如何定义变量方式1&#xff1a;方式2&#xff1a;带类型方式3&#xff1a;类型推导方式定义变量方式4&#xff1a;声明多个变量总结 3、如何定义常量4、Const常量结合iota的使用 二、Golang的数据类型1、概述2、整型2.1 类…...

合并区间问题

以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;intervals [[1,…...

【AISMM评估通关速成手册】:基于2026奇点大会127个真实案例提炼的8步标准化流程,72小时内完成合规性预检

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AISMM评估的底层逻辑与奇点大会实践共识 AISMM&#xff08;AI System Maturity Model&#xff09;并非静态评级框架&#xff0c;而是一套基于系统演化阶段、治理闭环能力与人机协同深度的动态评估范式。…...

STM32G0B1 FDCAN实战:从CubeMX配置到代码调试,手把手搞定CANFD通信

STM32G0B1 FDCAN实战指南&#xff1a;从零搭建高效CANFD通信系统 开篇&#xff1a;为什么选择STM32G0B1的FDCAN模块&#xff1f; 在工业控制、汽车电子和物联网领域&#xff0c;CAN总线因其高可靠性和实时性成为不可替代的通信协议。而CANFD作为CAN的升级版本&#xff0c;在保…...

Qt程序在银河麒麟上字体报错?别慌,手把手教你两种字体部署方案(附DejaVu字体下载)

Qt程序在银河麒麟系统上的字体问题解决方案 第一次在银河麒麟上运行Qt程序时&#xff0c;看到满屏的"QFontDatabase: Cannot find font directory"错误提示&#xff0c;确实让人有点懵。这种问题在国产化操作系统迁移过程中很常见&#xff0c;尤其是从Windows开发环境…...

程序员转AI的正确姿势:不是追风口,是换赛道

先说结论2026年转AI&#xff0c;拼的不是谁更会调模型&#xff0c;而是谁能把AI塞进真实业务里。那些只会跑个transformers demo的人&#xff0c;简历已经石沉大海了。这东西是什么AI大模型就像个超级实习生&#xff1a;懂很多&#xff0c;但需要你告诉他具体干什么能做PPT、能…...

终极免费微信聊天记录导出完整指南:永久保存你的数字记忆

终极免费微信聊天记录导出完整指南&#xff1a;永久保存你的数字记忆 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机丢失、系统升级或误操作而丢失珍贵的…...

告别卡顿!手把手教你用SuperMap iDesktop优化BIM模型(附厂房/楼宇实战参数)

工业级BIM模型性能优化实战&#xff1a;从Revit到SuperMap的高效处理指南 当你在深夜加班时&#xff0c;突然发现导入SuperMap的厂房BIM模型在场景中卡成幻灯片——这种崩溃感我太熟悉了。去年处理某汽车工厂项目时&#xff0c;一个包含20万构件的Revit模型让顶配显卡的帧率直接…...

用LF347运放DIY一个三合一信号发生器:从仿真到实测的完整避坑记录

用LF347运放打造三合一信号发生器&#xff1a;从仿真到实测的实战全记录 作为一名电子爱好者&#xff0c;你是否曾经被实验室里笨重的函数信号发生器困扰过&#xff1f;那些昂贵的商用设备往往功能过剩&#xff0c;而简单的555定时器方案又难以满足多波形需求。本文将带你用一片…...

Mac本地运行多模态大模型:mlx-vlm环境搭建与性能优化指南

1. 项目概述&#xff1a;在Mac上本地运行多模态大模型的利器如果你是一名Mac用户&#xff0c;同时又对当前火热的视觉语言大模型&#xff08;VLM&#xff09;感兴趣&#xff0c;那么你很可能面临一个尴尬的局面&#xff1a;网上那些炫酷的图片理解、视频分析、多轮对话演示&…...

终极指南:如何在Photoshop中无缝集成AI绘图能力

终极指南&#xff1a;如何在Photoshop中无缝集成AI绘图能力 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 在数字创意设计领域&#xff0c;Photoshop一直是行业标杆&#xff0c;但面对AI绘图技术的迅猛发展&#…...

告别网盘限速!3分钟掌握LinkSwift直链下载终极攻略

告别网盘限速&#xff01;3分钟掌握LinkSwift直链下载终极攻略 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...