关系数据库是如何工作的(8)

本文介绍了数据库如何处理事务的持久性和原子性问题,重点讨论了预写式日志(WAL)和ARIES恢复算法。WAL确保数据在磁盘写入前先写入事务日志,而ARIES用于实现高效、可靠的事务恢复,包括分析、重做和撤销三个阶段。日志管理器在缓存和数据写入之间起关键作用,同时,日志缓冲和不同的写入策略如STEAL和FORCE影响着性能和恢复过程。

日志管理器

我们已经认识到,为了提高性能,数据库将数据存储在内存缓冲区中。但是,如果在事务提交时,服务器崩溃,你就会丢失所有内存中的数据,这将导致事务持久性问题。

你可以将所有数据写入磁盘,但是,如果服务器崩溃,你可能只写入一半数据,这会导致事务的原子性问题。

事务所做的任何修改写入必须要全部撤销或全部写入。

为解决这一问题,有两种解决方案:

  • 影子拷贝/页 :每一个事务创建自己的数据库拷贝(或者是数据库的一部分),在这个拷贝上面工作。如果发生了错误,移除该拷贝;如果成功,数据库立刻将数据通过文件系统技巧从拷贝切换,并移除“旧的”数据。
  • 事务日志 :事务日志是一段存储空间。在每个写入磁盘操作之前,数据库将信息写入事务日志,以便在事务崩溃/撤销时,数据库能够知道如何移除(或完成)未完成的事务。

WAL

当大型数据库需要很多事务时,影子拷贝/页会占用大量磁盘空间。这就是现代数据库使用 事务日志 的原因。事务日志必须存储在 稳定的存储 中。我不会深入介绍存储技术,只简单提一句,使用(至少)RAID 磁盘阵列能够有效防止磁盘失败。

很多数据库(包括 Oracle、 SQL Server 、 DB2 、 PostgreSQL 、MySQL 和  SQLite )使用 预写式日志(Write-Ahead Logging protocol,WAL) 。WAL 包括三个规则:

  • 1) 数据库每一条修改都要产生一条日志记录, 这个日志记录必须在数据写入磁盘之前先写入事务日志
  • 2) 日志记录必须按照顺序写入:如果日志记录 A 发生在日志记录 B 之前,那么 A 必须在 B 之前写入
  • 3) 当事务提交时,直到事务成功结束,提交顺序必须写入事务日志

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值