一、undo(回退段)介绍
在Oracle数据库中,当某个事物对数据进行修改时,Oracle首先将数据的原始值保存到一个回退段中。一个事物只能将它的回退信息保存到一个回退段中,而多个并行事物可以使用同一个回退段。
(1)回退段的作用
回退段主要有4个作用,分别是:事物回滚、数据库恢复、读一致性、闪回查询。
--事物回滚:当事物执行失败或用户执行回滚操作(rollback)时,Oracle会利用保存在回退段中的信息将数据恢复到原来的值;
--数据库恢复:当数据库实例运行失败,在数据库重启恢复时,Oracle先利用重做日志文件的信息对数据库进行恢复(包括已提交和未提交的事务),再利用回滚段中的信息回滚未提交的事务;
--读一致性:当一个用户对数据进行修改时,会预先将其原始值保存到回退段中,这时,如果有其它用户访问该数据,则访问回退段中的信息,使当前用户未提交的修改其他用户无法看到,保证了数据的一致性;
--闪回查询:通过保留在回退段中的信息,用户可以查询某个数据在过去某个时刻的状态
二、redo(重做日志)介绍
REDO记录transaction logs,分为online和archived。记录提交了以及未提交的事务,以恢复为目的。
比如,机器停电,那么在重起之后需要online redo logs去恢复系统到失败点。
比如,磁盘坏了,需要用archived redo logs和online redo logs去恢复数据。
比如,truncate一个表或其他的操作,想恢复到之前的状态,同样也需要。
三、undo和redo详解
日志的缓存在这里叫做log buffer。磁盘上的日志文件称为log file。log file一般是追加内容,可以认为是顺序写,顺序写的磁盘IO开销要小于随机写。
Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback;
Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。

总结:
(1)当用户生成一个数据库事务时,undo log buffer会记录被修改的数据的原始值。
注:在很多系统中,undo日志并非存到日志文件中,而是存放在数据库内部的一个特殊段中。本文中就把这些存储行为都泛化为undo日志存储到undo log file中。
(2)redo日志将首先将事务T1顺序记录在log buffer中,然后再将操作结果才写入db buffer,(此时,内存中的数据和data file对应的数据不同,我们认为内存中的数据是脏数据)。因我们知道redo日志有三组,他们是轮流在记录。当一组log buffer满了,就会写入磁盘日志文件中。但注意,db buffer只会在commit后,再选择合适的时机将内容写入磁盘数据库文件之前,会先把log buffer的内容写入磁盘日志文件。这种顺序可以保证在需要故障恢复时恢复最后的修改操作。先持久化日志的策略叫做Write Ahead Log,即预写日志。
注:为什么在写入数据前,要先将redo log持久化到磁盘上(为了避免系统出错或者各种故障,导致数据在内存中更新了但还未保存到磁盘中,从而导致数据的错误)
(3)对于某事务T,在log file的记录中必须开始于事务开始标记(比如“start T”),结束于事务结束标记(比如“end T”、”commit T”)。在系统恢复时,如果在log file中某个事务没有事务结束标记,那么需要对这个事务进行undo操作,如果有事务结束标记,则redo。
(4)有一个问题,redo log buffer和undo log buffer存储的事务数量是多少,是按照什么规则将日志写入log file?如果存储的事务数量都是1个,也就意味着是将日志立即刷入磁盘,那么数据的一致性很好保证。在执行事T时,突然断电,如果未对磁盘上的redo log file发生追加操作,可以把这个事务T看做未成功。如果redo log file被修改,则认为事务是成功了,重启数据库使用redo log恢复数据到db buffer和 data file即可。
(5)如果存储多个的话,其实也挺好解释的。就是db buffer写入data file之前,先把日志写入log file。这种方式可以减少磁盘IO,增加吞吐量。不过,这种方式适用于一致性要求不高的场合。因为如果出现断电等系统故障,log buffer、db buffer中的完成的事务会丢失。以转账为例,如果用户的转账事务在这种情况下丢失了,这意味着在系统恢复后用户需要重新转账。
四、undo数据与redo数据的区别:
(1)undo记录数据修改之前的操作,redo记录磁盘数据将要进行的操作.
(2)undo用于数据的回滚操作,和实现一致性读,redo用于前滚数据库操作
(3)undo存储在回滚段里,redo存储在重做日志文件里
(4)undo用于在多用户并发的系统里保证一致性读,redo用于防止数据丢失
五.与undo有关的相关参数
undo_management = auto 自动的undo表空间管理
undo_tablespace = undotbs1 设置undo表空间的名称,可以存在多个undo表空间,但同时只能使用一个
undo_retention = 900(秒) 设置快照保存的最少时间,设置后在此时间段内仍有可能会被覆盖。undo_retention是Oracle的一个”软设置“,这个”软设置“如何理解呢?例如,当用户将UNDO_RETENTION参数设置为900s后,Oracle会尽量的将回退信息保存900s,但是,在这个过程中,如果回退表空间不够用了,新的回退信息依然会将未达到900s的回退信息覆盖。当然也有可能保存得比900s还长。
ALTER TABLESPACE UNDO_TS RETENTION GUARANTEE; 强制所有快照必须保存 undo_retention所规定的时间。
如果undo文件被占满,还是建议重建比较好。
浙公网安备 33010602011771号