数据库守护神-WAL机制

news2025/4/13 1:49:14

什么是WAL机制?

WAL(Write-Ahead Logging,预写日志)是一种保证数据库操作原子性持久性的核心机制。其核心原则可概括为:

任何数据修改操作,必须在对应的日志记录持久化到磁盘之后,才能将实际数据写入磁盘。

理论基石

  • 持久化顺序性:日志的写入必须早于数据修改的完成。

  • 操作可重放性:所有修改操作都能通过日志完整重建。

  • 故障可恢复性:系统崩溃后,通过日志可恢复到一致状态。

为什么需要WAL机制?

1. 传统数据写入的缺陷
假设直接修改数据页(无WAL):

  • 崩溃不一致:若在写入数据页过程中发生崩溃,数据可能处于“半完成”状态。

  • 无法回滚:已部分写入的数据难以追踪和撤销。

  • 随机写性能差:频繁修改分散的数据页会导致磁盘寻道开销。

2. WAL的理论优势

维度无WAL有WAL
原子性无法保证通过日志回滚保证
持久性依赖即时刷盘日志持久化即视为操作完成
性能随机写效率低顺序追加日志提升吞吐量
恢复能力数据可能损坏通过日志重建一致状态

WAL的核心理论组件 

1. 日志记录(Log Record)
每条日志记录需包含足够信息以支持恢复,通常包括:

  • 事务ID(XID):标识操作所属事务。

  • 操作类型:如插入(INSERT)、更新(UPDATE)、提交(COMMIT)等。

  • 修改内容

    • 逻辑日志:记录操作语义(如“账户A增加100元”)。

    • 物理日志:记录数据页的具体修改(如“页面P偏移量O处写入字节B”)。

  • LSN(Log Sequence Number):全局唯一的日志序列号,标识操作顺序。

2. 检查点(Checkpoint)

  • 作用:定期记录数据库的全局一致状态,限制恢复时需要处理的日志范围。

  • 类型

    • 模糊检查点:允许检查点期间存在未完成事务。

    • 精确检查点:冻结所有事务后记录一致状态。

WAL如何保证ACID特性?

1. 原子性(Atomicity)

  • 提交原子性:事务的所有操作日志持久化后,才标记为“已提交”。

  • 回滚机制:通过反向扫描日志,执行补偿操作(UNDO)回滚未提交事务。

2. 持久性(Durability)

  • 日志优先持久化:事务提交前,其所有日志记录必须强制刷盘(fsync)。

  • 数据页延迟写入:允许数据页在内存中缓存,通过后台线程异步刷盘。

3. 隔离性与一致性

  • 日志与锁的结合:通过锁机制保证事务隔离,日志记录锁操作。

  • 逻辑约束:在日志中记录完整性约束验证结果。

崩溃恢复 

  • 分析阶段(Analysis):
    确定崩溃时活跃的事务集合,以及需要重做(REDO)和回滚(UNDO)的日志范围。

  • 重做阶段(REDO):
    从最早的未完成操作开始,按顺序重新执行所有已提交事务的操作。

  • 回滚阶段(UNDO):
    逆序撤销所有未提交事务的操作。

 

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

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

相关文章

Git开发

目录 Linux下Git安装Git基本指令分支管理远程仓库与本地仓库标签管理多人协作同一分支下不同分支下 企业级开发模型 -- git flow 模型 在现实中,当我们完成一个文档的初稿后,后面可能还需要对初稿进行反复修改,从而形成不同版本的文档。显然&…

verilog有符号数的乘法

无符号整数的乘法 1、单周期乘法器( 无符号整数 ) 对于低速要求的乘法器,可以简单的使用 * 实现。 module Mult(input wire [7:0] multiplicand ,input wire [7:0] multipliter ,output wire [7:0] product);as…

DevDocs:抓取并整理技术文档的MCP服务

GitHub:https://github.com/cyberagiinc/DevDocs 更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI DevDocs 是一个完全免费的开源工具,由 CyberAGI 团队开发,托管在 GitHub 上。它专为程序员和软件开发…

第十四届蓝桥杯大赛软件赛国赛Python大学B组题解

文章目录 弹珠堆放划分偶串交易账本背包问题翻转最大阶梯最长回文前后缀贸易航线困局 弹珠堆放 递推式 a i a i − 1 i a_ia_{i-1}i ai​ai−1​i, n 20230610 n20230610 n20230610非常小,直接模拟 答案等于 494 494 494 划分 因为总和为 1 e 6 1e6…

折叠屏手机:技术进步了,柔性OLED面板测试技术需求跟上了吗?

全球智能手机市场陷入创新焦虑,折叠屏手机被寄予厚望,2023 年出货量同比增长 62%。但在供应链技术狂欢背后,存在诸多问题。消费端数据显示,用户使用频率低,定价策略反常。产业链重构虽让部分企业获利,却推高…

30天学Java第九天——线程

并行与并发的区别 并行是多核 CPU 上的多任务处理,多个任务在同一时间真正的同时执行并发是单核 CPU 上的多任务处理,多个任务在同一时间段内交替执行,通过时间片轮转实现交替执行,用于解决 IO 密集型任务的瓶颈 线程的创建方式…

自行搭建一个Git仓库托管平台

1.安装Git sudo apt install git 2.Git本地仓库创建(自己选择一个文件夹) git init 这里我在 /home/test 下面初始化了代码仓库 1. 首先在仓库中新建一个txt文件,并输入一些内容 2. 将文件添加到仓库 git add test.txt 执行之后没有任何输…

LeeCode 409.最长回文串

给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s "abccccdd" 输出:7 解释: 我们可以构造的…

【前端分享】JavaScript异步编程详解!

JavaScript 的异步编程是其核心特性之一,主要用于处理非阻塞操作(如网络请求、文件读写、定时任务等)。由于 JavaScript 是单线程的,异步机制可以避免代码阻塞,提高性能和用户体验。以下是 JavaScript 异步编程的核心概…

工厂模式(简单工厂,工厂方法,抽象工厂)

工厂模式 工厂模式是java中最常用的设计模式,主要是用来完成对象的创建,使得对象创建过程和对象使用过程分离。 简单来说是取消对象创建者和使用者的耦合,简化new 对象的创建。 优势 :对象的属性创建完整。 缺点: 创建…

Axure RP9教程 【数据传输】(页面值传递)| 作用域 :全局变量、局部变量

文章目录 引言作用域:全局变量作用域>局部变量作用域I 基于全局变量实现一个简单的登陆操作设置变量值的交互动作打开链接的交互动作接收并显示变量值注意点see also共享原型引言 全局变量在交互效果作用是页面值传递 作用域:全局变量作用域>局部变量作用域 全局变量…

IBM Rational Software Architect安装感受及使用初体验

1 安装感受 最近准备用UML 2.0绘制模型图。在读UML创始人之一Grady Booch写的书《Object-Oriented Analysis and Design with Applications》(第3版)1时,发现书中用的UML工具之一为IBM Rational Software Architect(RSA&#xff…

VRRP学习

虚拟路由器冗余技术【三层技术】:网关冗余VRRP设计了VRRP组的概念,在一个 VRRP 组中,多台路由器共同构成一个虚拟路由器。这个虚拟路由器拥有一个虚拟 IP 地址【VRRP-ID默认是8位二进制,范围是0~255,用以标识和区别不同…

GPT-5、o3和o4-mini即将到来

原计划有所变更: 关于我们应有何期待的一些零散想法。 深度研究(Deep Research)确实强大但成本高昂且速度较慢(当前使用o3模型)。即将推出的o4-mini在性能上可能与o3相近,但将突破这些限制,让全球用户——甚至免费用户(尽管会有速率限制)——都能用上世界顶级AI研究助…

C#MVC项目引用Swagger的详细步骤

目录 一、安装Swagger依赖包二、配置Swagger服务三、启用XML注释四、调整启动配置五、验证与访问常见问题解决 以下是基于ASP.NET Core项目集成Swagger的详细步骤(已适配当前项目结构): 一、安装Swagger依赖包 通过NuGet安装 右键点击项目…

golang 对象池sync.Pool

Golang中的sync.Pool是什么? sync.Pool 是 Go 标准库中提供的一个对象池(Object Pool)实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收(GC)的压力。它的主要特点是: 临时对…

聚焦AI与大模型创新,紫光云如何引领云计算行业快速演进?

【全球云观察 | 科技热点关注】 随着近年来AI与大模型的兴起,云计算行业正在发生着一场大变局。 “在2025年春节期间,DeepSeek两周火爆全球,如何进行私域部署成了企业关心的问题。”紫光云公司总裁王燕平强调指出,AI与…

解决前后端时区不一致问题

前后端时区不一致导致: 》数据不显示在前端 》页面显示时间有误 》一些对时间有要求的方法,无法正确执行,出现null值,加上我们对null值有判断/注解,程序就会报错中断,以为是业务逻辑问题,其实…

STL之序列式容器(Vector/Deque/List)

序列式容器 序列式容器包括:静态数组 array 、动态数组 vector 、双端队列 deque 、单链表 forward_ list 、双链表 list 。这五个容器中,我们需要讲解三个 vector 、 deque 、 list 的使 用,包括:初始化、遍历、尾部插入与删除、…

小试牛刀-抽奖程序

编写抽奖程序 需求:设计一个抽奖程序,点击抽奖按钮随机抽取一个名字作为中奖者 目标:了解项目结构,简单UI布局,属性方法、事件方法,程序运行及调试 界面原型 ​ 待抽奖: 点击抽奖按钮&#x…