【问题标题】:Can i recover transaction after instance crash in oracle 11g我可以在 oracle 11g 中的实例崩溃后恢复事务吗
【发布时间】:2017-12-15 12:47:51
【问题描述】:

我在提交事务之前更新了我的表中的数据,当再次启动数据库时,我用关闭中止关闭了数据库,数据消失了

如何在 oracle 11g 中恢复未提交的事务?

【问题讨论】:

  • 所以你开始了一个事务并在它提交之前中止了?
  • 这些数据不会被恢复,因为它们从未提交到数据库。
  • yanman1234 是的,我在提交事务之前中止了数据库

标签: sql oracle oracle11g recovery


【解决方案1】:

有两种可能的方法(除了一些变通方法):

缓存恢复 为了解决这个难题,Oracle 数据库通常使用两个单独的步骤来成功恢复系统故障:使用重做日志前滚(缓存恢复)和使用回滚或撤消段回滚(事务恢复)。

在线重做日志是一组操作系统文件,它记录对任何数据库块所做的所有更改,包括数据、索引和回滚段,无论更改是否已提交。对 Oracle 数据库块的所有更改都记录在在线重做日志中。

从实例或介质故障恢复的第一步称为缓存恢复或前滚,包括将重做日志中记录的所有更改重新应用到数据文件。因为回滚数据也记录在重做日志中,所以前滚也会重新生成相应的回滚段。

前滚通过尽可能多的重做日志文件进行,以便及时将数据库向前移动。前滚通常包括在线重做日志文件(实例恢复或介质恢复),并且可能包括归档重做日志文件(仅限介质恢复)。

前滚后,数据块包含所有已提交的更改。它们还可能包含未提交的更改,这些更改要么在故障之前保存到数据文件中,要么记录在重做日志中并在缓存恢复期间引入。

事务恢复 前滚之后,必须撤消任何未提交的更改。 Oracle 数据库应用撤消块来回滚数据块中未提交的更改,这些更改要么在故障之前写入,要么在缓存恢复期间由重做应用程序引入。这个过程称为回滚或事务恢复。 图 12-2 说明了前滚和回滚,这是从任何类型的系统故障中恢复所必需的两个步骤。

图 12-2 基本恢复步骤:前滚和后滚

Oracle 数据库可以根据需要同时回滚多个事务。在失败时处于活动状态的所有事务都被标记为已终止。新事务无需等待 SMON 回滚终止的事务,而是可以自己恢复阻塞事务以获得所需的行锁。

来源链接here

一个小补充,以阐明这个案例:

Oracle 在实例故障后自动执行崩溃恢复实例恢复。如果发生介质故障,数据库管理员 (DBA) 必须启动恢复操作。恢复备份涉及两个不同的操作通过应用重做数据将备份前滚到最近的时间,以及将未提交事务中所做的所有更改回滚到它们的原始状态。 一般来说,恢复是指恢复、前滚、和回滚备份所涉及的各种操作。备份和恢复是指保护数据库免受数据丢失以及在发生丢失时重建数据库所涉及的各种策略和操作。

简而言之,您无法恢复更新的数据,因为它应该被回滚,以保持数据库的一致性。请记住,事务是原子的,因此它们应该是COMMITTEDROLLED BACK。由于启动它的会话现在被杀死(停止),没有人可以COMMIT 它 - 因此SMON 执行ROLLBACK

【讨论】:

  • Wholesale cut'n'paste from the documentation不是一个好的答案,即使您链接到原始网站。特别是在这种情况下,文档文本并不能完全回答 OP 的问题。他们想要恢复他们未提交的事务,而这里描述的过程表明事务恢复过程会将它们回滚。
  • @APC - 据我了解,问题是它是否可能,而不是如何精确。如果这里的请求者问怎么做,他/她会被否决,并且会被要求重新措辞或提及他/她已经尝试过的一些事情。我认为 SO 不是在没有线程创建者任何努力的情况下提供开箱即用的完整解决方案的地方。至少这是我理解的,如果我错了,请纠正我。谢谢
  • 提问者问“如何恢复oracle 11g中未提交的事务?”对这个问题最直接的解释是,他们想知道如何恢复未提交的事务,而不是是否可能。
  • 我编辑了我的答案。但是,如果有人发现任何可以真正“恢复”数据的方法 - 该线程应移至 dba.stackexchange.com。
【解决方案2】:

当实例在崩溃后启动时,未提交的事务将被回滚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多