您的位置:首页 > 数据库 > Oracle

Oracle中的Redo和Undo简单介绍

2009-06-23 17:48 323 查看
Redo(重做)

除了用于保存数据的数据文件外,每个oracle数据库都会有一组(两个或多个)重做日志文件。重做日志用于保存对数据的所有修改,包括提交的和未提交的修改。在把对数据的修改写到数据文件之前,所有的修改都被写到重做日志中。

重做日志的主要目的是在实例失败或者介质损坏时,帮助把数据库恢复到一个合理的状态。例如:当进行实例恢复时,重做日志可以重做那些已经提交但是还没有把修改写入到数据文件中的事务。

重做日志由两部分组成:在线重做日志和归档重做日志。为了避免发生单点故障,Oracle会创建多组在线重做日志文件。如果数据库工作在ARCHIVELOG模式,Oracle将在每个检查点创建归档日志,他们可以用于磁盘损坏时的数据库恢复。所以对于生产系统来说,归档重做日志是很重要的,应该把生产系统设置为ARCHIVELOG模式。归档重做日志应该定期的备份和删除。

Oracle会重用重做日志文件,当一个日志文件写满时就会切换到另一个日志文件,因此在进行日志切换之前,需要确保前一个日志可以被重写,这是通过建立检查点来实现的,这时DBWn进程将把该日志文件保护的所有脏块写入到磁盘。因此,重做日志文件的大小直接影响建立检查点的频率和性能,建立检查点的频率会根据系统活动发生很大的变化,但是通常情况下是2到3个小时建立一次。

Undo(撤消)

Oracle把所有即将被修改(即执行update,delete等)的数据记录到undo段中,即在数据被修改之前,Oracle把他们记录到undo段中。

Undo信息有两个用途:1.实现Oracle中的多版本机制,从而使读不阻塞写,写也不阻塞读。2.当回滚一个事务时用于把数据库恢复到该事务执行前的状态。

回滚段也会被重用,因此应该把回滚段设置成足够大。否则,有可能发生ORA-01555:snapshot too old错误,发生这种错误的一般是因为回滚段设置的太小。例如:你在读取一个数据表中的记录,另一个用户更新该表中你正要读取的记录并且提交了更新,这时你读取那个时点的数据就会被写入到回滚段中,你将从回滚段中读取这些记录,如果这些数据所在的回滚段被覆盖了,就会发生snapshot too old错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: