我在提交事务之前更新了表中的数据,当再次启动数据库时,我通过关闭中止关闭数据库,数据消失了
如何在oracle 11g中恢复未提交的事务?
有两种可能的方法(除了一些解决方法之外):
缓存恢复 为了解决这个困境,Oracle 数据库通常使用两个单独的步骤来成功恢复系统故障:使用重做日志前滚(缓存恢复)和使用回滚或撤消段回滚(事务恢复)。
联机重做日志是一组操作系统文件,记录对任何数据库块(包括数据、索引和回滚段)所做的所有更改,无论更改是否已提交。对 Oracle 数据库块的所有更改都记录在联机重做日志中。
从实例或介质故障中恢复的第一步称为缓存恢复或前滚,涉及将重做日志中记录的所有更改重新应用到数据文件。因为回滚数据也记录在重做日志中,所以前滚也会重新生成相应的回滚段。
前滚会根据需要继续处理尽可能多的重做日志文件,以使数据库及时前移。前滚通常包括联机重做日志文件(实例恢复或介质恢复),也可能包括归档重做日志文件(仅限介质恢复)。
前滚后,数据块包含所有已提交的更改。它们还可能包含未提交的更改,这些更改要么在失败之前保存到数据文件中,要么记录在重做日志中并在缓存恢复期间引入。
交易恢复 前滚后,必须撤消任何未提交的更改。 Oracle 数据库应用撤消块来回滚数据块中未提交的更改,这些更改是在故障之前写入的或由重做应用程序在缓存恢复期间引入的。这个过程称为回滚或事务恢复。 图 12-2 说明了前滚和回滚,这是从任何类型的系统故障中恢复所需的两个步骤。
Oracle数据库可以根据需要同时回滚多个事务。发生故障时所有处于活动状态的事务都被标记为已终止。新事务可以恢复阻塞事务本身以获得所需的行锁,而不是等待 SMON 回滚终止的事务。
来源链接这里。
补充一点,以阐明案例:
Oracle 在实例故障后自动执行崩溃恢复和实例恢复。如果发生介质故障,数据库管理员 (DBA) 必须启动恢复操作。恢复备份涉及两个不同的操作:通过应用重做数据将备份前滚到更新的时间,以及将未提交事务中所做的所有更改回滚到其原始状态。 一般来说,恢复是指恢复、前滚、和回滚备份所涉及的各种操作。备份和恢复是指保护数据库免遭数据丢失以及在发生丢失时重建数据库所涉及的各种策略和操作。
简而言之,您无法恢复更新的数据,因为应该回滚它,以保持数据库的一致性。请记住,事务是原子的,因此它们应该是“COMMITTED”或“ROLLED BACK”。由于启动它的会话现在已被终止(停止),因此没有人可以 COMMIT
它 - 因此 SMON
会执行
ROLLBACK
。未提交的事务将在实例崩溃后启动时回滚。
以下 5 点仅在 Oracle RAC 中进行实例恢复时使用。
所有节点可用。
一个或多个 RAC 实例失败。
剩余实例中的任何一个检测到节点故障。
全局资源目录(GRD)被重新配置并分布在 幸存的节点。
最先检测到失败实例的实例读取失败实例 实例重做日志以确定需要恢复的日志。 上述任务是由检测到故障的实例的SMON进程完成的。
直到此时数据库活动被冻结,SMON 才会发出恢复请求 对于恢复所需的所有块。一旦所有块都可用, 恢复不需要的其他块可用于正常处理。