在Oracle数据库实例中的无限循环SMON进程…帮助!

我和我的团队已经用Google(和Binged!)来试图find这个问题的答案,希望SF上的甲骨文大师能够知道答案。

一个星期前,我们在托pipe我们服务器的build筑物中发生停电事故。 整个服务器在数据库导出过程中closures。 当我们把服务器恢复到在线状态时,我们注意到一个新的进程SMON在数据库实例上疯狂的工作。 这里是OEM中的“顶级活动”的屏幕截图。

Oracle企业pipe理器http://www.myviewstate.net/images/oem.png

我们放了一会儿,但过了一天,我们开始担心了。 在检查日志之后,我们注意到它似乎处于一个无限循环。 以下是日志文件的一部分:

Fri Aug 14 14:43:58 2009 SMON: about to recover undo segment 12 SMON: mark undo segment 12 as available SMON: about to recover undo segment 12 SMON: mark undo segment 12 as available SMON: about to recover undo segment 12 SMON: mark undo segment 12 as available SMON: about to recover undo segment 12 SMON: mark undo segment 12 as available SMON: about to recover undo segment 12 SMON: mark undo segment 12 as available 

以下是我迄今为止所采取的步骤(其中大部分是由于我在网上find的东西而尝试的),其中没有一个能够奏效。

  1. 重新启动数据库实例
  2. 将用户表空间脱机,将其重新联机,然后重新启动数据库实例
  3. 创build一个新的REDO表空间,停止数据库实例,将spfile指向新的表空间,然后重新启动实例

请记住,我是一名开发人员,拥有很less的Oracle经验,更不用说作为DBA的经验。

有什么build议么?

您的数据库正在循环尝试进行恢复,并将还原段恢复到联机状态以恢复数据库。 既然你不是dba,我会马上得到oracle的支持,告诉他们你需要大的帮助,你不是dba。 他们很可能会启动数据库并禁用正在尝试清理还原段的smon循环的恢复pipe理器。 在过去不得不做回收段清理,最好用oracle支持帮助完成。 许多步骤将需要一些事件和下划线参数,禁用/启用隐藏的oracle mojo。 我不会build议尝试任何你自己find的东西,或者是发布时不理解其含义,以及如何恢复/退出你的尝试。 目的是恢复你的数据库,而不是让事情变得更糟。 在手机尽快获得oracle支持。

Oracle 9i及更高版本使用特殊的UNDO表空间和REDO日志来pipe理其事务。

REDO存储执行的语句的日志,UNDO存储这些语句所影响的数据库块的图像前后。

有更多的挖掘…如果您有权访问Oracle Metalink(他们的支持网站)查找错误ID 3418428这似乎是你的问题。 我不能在这里复制这些信息,因为我认为这违反了Oracles支持协议。

问题的一般要点是自动撤消pipe理在UNDO表空间中按需dynamic创buildROLLBACK段。 创build的段的数量和大小取决于数据库上的负载。

在数据库崩溃之前,它已经创build了并超过默认数量的ROLLBACK段。

在崩溃之后,数据库没有联机所有在崩溃之前的ROLLBACK分段。

如果你给它足够的时间,我认为10g或许能够从中恢复; 9i有更多的问题。 数据库是否连接并响应?

除此之外,你可能会陷入甲骨文复苏的黑暗世界。 我build议得到一些帮助,因为在尝试恢复时很容易完全取消Oracle。

你没有提到这是什么版本的Oracle …在这个症状(821743.1)的Metalink上有一个10.2.0.4的问题。 您的系统是否执行分布式事务? 可能有一个未被提交的两阶段提交事务被“卡住”。 查询视图dba_2pc_pending:

从dba_2pc_pending中selectlocal_tran_id,global_tran_id,state;

如果有logging没有消失,则需要对它们进行回滚。 在这个领域要非常小心……来自@Geoff的build议是很好的,应该在这里咨询一下Oracle的支持,那就是你付出的代价。 崩溃后的这种症状可能表示数据库中存在一些损坏。 这很less见,但有可能。 甲骨文应该是“腐败certificate”,但最好的计划和所有的….

我不是Oraclepipe理员或开发人员,但在“smon oracle”上的一个快速谷歌告诉我什么过程是什么,以及它在你的数据库拉动电力增加CPU使用率之后正在做什么。 它会像这样继续下去,直到它被固定的力量拉动造成的伤害。 如果有疑问,打开甲骨文票 – 毕竟你支付了很多支持。

这里解释了前滚/后移/后退

一般来说,重做日志被应用推回到数据库的变化。 最后,已经应用但未完成提交的任何更改必须回滚。 它通过UNDO读取撤消变化。

如果是撤消,那就意味着有一个没有提交的变化需要回滚。 这不会是一个出口(因为这应该是纯粹的select)。 查看v $ transaction中的USED_UREC。 应该有一行(也许更多)与一个非零值(希望)应该撤消作为撤消logging被用来删除未提交的变化。