Oracle数据库中为什么会产生回滚与前退

如题所述

  在一个transaction发生的过程中,online redo log首先记录transaction中修改的数据块相关信息,修改的数据块会被缓存在database buffer cache中。由于database buffer cache写满或者checkpoint等等条件触发dbwn进程,会导致这些缓存的数据块写入数据文件,但此时可能该transaction仍然还没有提交。所以在数据文件中,可能会有commited 和 uncommited 的数据块。而原有的数据块镜像会存放在undo segment。  IXDBA.NET社区论坛  然而,dbwn写脏数据时不管这个要写的transaction是否提交,  也没有必要去管。  这样就发生了所谓的已经提交的数据,但是还没有写入数据文件的现象。  还有一种情况,数据没有提交,但是已经被写入数据文件,此时发生回退,撤销没有提交的数据。  根本原因是commit后写redo buffer和触发lgwr写 redo buffer的区别。  事务在执行完毕后,随即会被写入redo buffer和undo中,同时在redo buffer和undo中对该事务都有一个是否提交的标记。两者的默认状态都是active的,即没有提交时刻处于激活状态。  commit操作执行时刻把此前的所有事务操作全部写入redo log file,commit成功后,redo buffer信息全部写入redo file,同时修改两者中的事务提交标识为inactive,表示此前事务已经递交。  oracle的前滚和回退根据就是依据事务是否提交而进行的。  在触发lgwr进程后,oracle同样把此前的redo buffer信息写入redo file,但是与commit触发写日志不同的是,redo file本身对lgwr写日志操作不记录任何信息标识,lgwr写到那里就是那里,就算此时掉电也无妨,redo file就记录到掉电时刻的信息。  lgwr是一个Oracle后台执行的进程,具体的日志写操作都有oracle去控制,这对于oracle来说是透明的,因此不用在redo file中写入任何标记信息,这也是正常的。  于是,Oracle崩溃恢复步骤如下:  首先rolling forward 前滚:由于oracle failure,sga中的内存信息丢失了,但是online redo log中还是存储了transaction信息,包括commited or uncommited data。可能这些修改信息并没有被oracle正确的来处理,包含两种情况:已经提交的还没有写入数据文件,或者没有提交的却被写入了数据文件。针对已经提交的还没有写入数据文件就要发生前滚,在前滚过程中,smon会根据online redo log中的记录来完成对datafile的修改。保证已经提交的数据已经写入数据文件。  接下来,前滚结束后,数据库正常open,此时用户可以正常连接,可以访问已经recover的commited data,但是对于那些属于unrecoverable transaction的uncommited data,会被oracle 加锁,是不可以访问的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-03-28
Oracle DBA神器:PRM-DUL灾难恢复工具,Schema级别数据恢复。PRM-DULFor Oracle Database – schema级别oracle数据库数据恢复特性 ,PRM-DUL即ParnassusData Recovery Manager是企业级别Oracle数据库灾难恢复工具。PRM可以在无备份的情况下恢复被truncated掉的表,也可以恢复无法打开的Oracle数据库(Alter Database Open失败)中的数据。

oracle中数据是怎样前滚和回滚的
“前滚和回滚”是Oracle数据库实例发生意外崩溃,重新启动的时候,由SMON进行的自动恢复过程。下面通过模拟实例和讲解介绍这个过程。 失败前场景说明 日志中记录过程如下: 1、事务A进行之后,结束commit。之后系统进行了一次checkpointA;2、Checkpoint之后,进行事务B,结束commit;3、进行事务C,C事务量较大,其中进行了一定量...

“前滚”和“回滚”的区别
回滚: 未提交的事务,即该事务未被执行commit命令。但是此时,该事务修改的脏块中也有可能一部分脏块写入到数据文件中了。如果此时数据库实例崩溃了,则当数据库实例恢复时,就需要用回滚(这个机制)来将先前那部分已经写入到数据文件的脏块从数据文件上撤销掉。简介 实例恢复,就是Oracle软件系统根据数...

oracle数据库引起自动回滚的原因
比如说你的事务未提交进程意外终止(掉线啊,点击叉叉退出连接啊)未提交的数据全部回滚。或者在你的事务提交过程中,数据违反约束条件,事务内部出现错误被终止,则该事务中所有操作也被自动回滚。还有其他一些情况,这两个是主要的。

Oracle数据库 回滚的问题
与撤销不太一样,撤销实在是无完成后回到之前的状态 而oracle的回滚即是rollback,多是提交的事物进行commit失败,即事物未完成,数据库会滚到提交事务之前的状态。另外oracle有一种功能叫做闪回 即使commit成功,数据库也可以根据需要,闪回到之前时间点的状态(要提前设定好闪回支持的时间范围,如果你的硬...

oracle中的commit和rollback
,而select则不需要。为了防止你的操作有误,执行完以上三种语句后,数据库没有直接把结果保存,如果确认无误 则可以commit(提交),如果有误(或反悔)可以rollback(回滚)2、在pl\/sql developement 工具中如果你有insert、update、delete操作,会在工具栏上有提交、回滚的图标,亮色显示,如图 ...

ORACLE中,数据库的redo与undo分别是什么呀,两者是什么关系呢?_百度...
1、当你发出一条update语句后,oracle先将更改前后信息写进redo(当满足一定条件后由日志写进程写入日志文件)2、然后将更新前得数据镜像copy到undo中。3、用户rollback后,oracle 将undo中的数据覆盖回去 用户commit后,oracle可以根据redo 的信息进行数据恢复。(当然也可以利用undo进行flashback)简单的讲...

oracle redo undo 闪回区三者是什么,什么关系?
因为这么做会影响其他用户的操作。所以,ROLLBACK是逻辑上回滚,比如对INSERT来说,那么ROLLBACK就是DELETE了。闪回恢复区是一个默认放置所有和备份恢复操作相关文件的地方。Oracle DBA可以使用Automatic Disk-Based Backup and Recovery,让数据库来管理备份存储的区域。

Oracle 的段(segment)管理
(3)回滚段:开启事务时,系统会自动为其分配回滚段。在数据修改前,系统将修改前的数据存放在回滚段中,回滚事务时,Oracle会利用回滚段中的数据恢复到原始状态。提交事务后,系统会自动释放回滚段的数据。(4)临时段:由Oracle在运行过程中创建,用于提供SQL语句的临时工作区。语句执行完毕后,临时段...

oracle表update中断,自动回滚吗
会自动回滚。如果Oracle数据库在执行UPDATE语句时发生故障或中断(比如断电、网络故障、服务器崩溃等),则数据库会自动回滚到UPDATE语句执行之前的状态,以确保数据的一致性和完整性。

oracle每秒回滚的事物太多如何分析
查看数据库的回滚段配置,检查事务的并发量。1、查看数据库的回滚段配置:检查数据库的回滚段配置,包括回滚段的大小、数量以及使用情况,回滚段配置不当,会导致事务回滚频繁。2、检查事务的并发量:并发量过高导致事务冲突,进而引发回滚,可以通过查看数据库的并发连接数、活动事务数等指标来分析并发量...

相似回答