数据库 redo undo log

undo log

数据库使用undo log保证事务的原子性。
数据库在一个事务中的增删改,为了保证可回滚,会先记录undo log,undo log在数据库当中会有独立的undo log表空间,数据库的mvcc也是基于undo log实现。数据库在增删改数据前会先加写锁,确保多个事务对同一个数据的修改是互斥的。数据格式形如<T,X,V>(事务标识,数据标识,原值)。如滚事务回滚,则从undo log中逆向回滚执行该事务进行的数据更改,当事务提交后会标识对应的undo log失效,有专门回收的线程定时回收过期的undo log。

redo log

数据库使用redo log保证事务的持久性。如果数据库在运行过程中宕机,保证已提交的事务相关数据修改的不丢失是数据库实现持久性的保障。如果想要保证已提交的事务修改不丢失,需要每次提交事务都把数据持久化到磁盘当中,并且为保障数据持久化到磁盘的过程中数据库宕机造成的数据不一致,需要先持久化undo log到磁盘当中,如果在持久化数据过程中数据库宕机,则表示该事务未成功提交,需要进行回滚。此时可以根据undo log回滚未完成提交的事务更新。这样数据库些磁盘io会非常高,会严重影响数据库的性能。为了解决性能问题,数据库引入了redo log,redo log是数据库每次更新数据后会在redo log中写入一条逻辑记录,数据格式形如<T,X,V>(事务标识,数据标识,新值),在提交事务前先将redo log持久化到磁盘当中,数据就不需要马上更新到磁盘中,可以先缓存起来,通过另外的定时同步线程或缓存区满后触发更新已提交事务的数据到磁盘中,由于redo log是采用顺序追加的方式记录,持久化花费时间远低于数据格式化持久化到磁盘所花的时间,数据库些磁盘的性能得到了很大的提升。redo log也是先缓存在一个缓存区当中,当事务提交或缓存到达一行比例后再持久化到磁盘当中,为减少长时间事务提交是持久化redo log的数量,redo log也存在定时持久化的线程定时将redo log持久化到磁盘中,降低了事务提交所需时间。

redo log与undo log的关系

undo log与redo log同时存在,他们之间的记录关系需要严格控制,不然在数据库宕机后进行数据恢复重放就会出现问题。正常事务回滚的操作也需要记录,这样会让redo log,undo log的关系变得复杂,为了简化操作,数据库在进行事务回滚时也会记录redo log,相当于对数据的两次更新,回滚操作是undo记录逆向更新还原数据。同时redo log中也会记录undo log,这样可以简化两者间的持久化关系。数据格式形如<T,X,V_old,V_new>(事务标识,数据标识,旧值,新值),undo log也会被当逻辑数据可以缓存起来,降低了undo log些磁盘的io,每次commit所需要做的事情变少,所花时间减少。

checkpoint检查点

数据库宕机后需要回放redo log与undo log进行数据恢复,如果数据量很大的话数据恢复时间会很长,为减少数据恢复的时间,数据库使用了checkpoint,checkpoint是另外定时线程来执行,checkpoit事件触发时会触发未持久化到磁盘的缓冲区数据都持久化到磁盘中,并记录已持久化到磁盘的数据与对应的最大事务编号并记录到数据文件一个区域当中。检查点保证之前的事务数据更新都已持久化到磁盘当中,数据库宕机进行数据恢复时不需要对检查点之前的数据进行回房重做,只需要对最后一个检查点之后的数据进行回访重做即可,减少了数据库宕机后数据恢复的时间。

数据库宕机数据恢复回放策略。

A.只重做已提交的事务。回滚未提交的事务。
B.先重做所有redo操作,再回滚未提交的事务的undo.
数据库一般选择B方案,操作简单,数据恢复线程在扫描检查点后的redo log时只需要记录未提交的redo log,顺序执行完redo log后在逆向执行未提交事务的undo log即可。

### Redo LogUndo Log数据库事务管理中的区别 #### 定义与功能 Redo logUndo log数据库管理系统 (DBMS) 中两种重要的日志机制,它们分别承担不同的职责来维护数据的一致性和持久性。 - **Redo Log**: 主要用于记录所有已提交事务操作细节。当数据库发生崩溃或其他异常情况时,可以通过重放 redo 日志将数据库恢复到最近一次正常状态下的全部已提交事务的结果[^3]。 - **Undo Log**: 则主要用于保存事务执行过程中的旧版本数据。它允许系统在必要时撤销未完成或失败的事务,从而保持数据库内部数据的一致性。 #### 存储位置 - **Redo Log** 的信息通常被写入独立的物理文件或者特定区域中,并且这些文件可以配置为循环使用的模式以便节省磁盘空间。此外,在某些实现里还会有在线redo logs以及归档redo logs之分用来满足不同场景下对于高可用性的需求[^1]。 - 对于 **Undo Log**, 大多数情况下它是存放在专门分配给它的表空间之内(即所谓的undo tablespace),不过也有例外比如Oracle早期版本可能会将其嵌套进datafile之中。 #### 使用时机 - 当某个事务成功结束并标记为 COMMIT 后, 数据库引擎会立即将此事件连同相关变更描述一起追加至当前活跃的 REDO LOG BUFFER 并最终刷盘形成永久记录; 这样做的好处在于即便之后遭遇意外停机也能依靠这部分历史资料重建丢失的信息[^2]. - 而 UNDO RECORDS 则是在每次修改之前先复制原始副本出来再加以处理, 整个流程贯穿整个交易周期直至最后确认完毕才会释放关联资源[ ^3 ]. #### 性能影响因素分析 由于两者工作原理上的差异决定了各自对整体性能表现会产生不一样的效果: - 频繁的小规模更新操作会使REDO GENERATION速率加快进而加大I/O负担; - 如果存在长时间运行的大批量DML语句则可能导致TEMPORARY SEGMENTS膨胀甚至引发SPACE CONTENTION现象同时也增加了UNDO RETENTION压力使得清理变得困难起来. ```sql -- Example SQL demonstrating how to check undo and redo settings in Oracle. SELECT value AS undo_retention_seconds FROM v$parameter WHERE name='undo_retention'; SELECT GROUP#, STATUS, BYTES/1024/1024 MB_SIZE FROM V$LOG ORDER BY 1; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值