测试环境重建索引时遇到了ORA-08104,怎么办?
先看看这个报错:
等待是不可能等待的,那就修复一下,官方解释如下:
-
有时,索引的在线重建会报告 ORA-8104。
-
这可能有很多原因。
-
-
例如,在具有许多事务的高度活跃的数据库中,表上未提交事务的可能性很高。因此,如果这样的表需要重建索引,
-
由于未提交的事务,我们可能会看到此错误。在其他情况下,我们可能会看到一个死进程,其中一个未提交的事务持有表上的锁。这也阻止了我们重建索引。这完全是在线重建功能的设计。但是,我们不能让数据库永远处于这种状态,因此 SMON 旨在清除这些情况。
-
-
如果已使用命令 kill -9 从操作系统中杀死进程,则该进程最终可能会死亡。
-
-
如果进程在执行以下操作时被终止:
-
ALTER INDEX REBUILD ONLINE;
-
那么该可能最终处于需要清理的状态。
-
-
-
有人会认为指数下降就可以解决问题。但是,
-
这只会返回错误:ORA-8104“此索引对象 %s 正在联机构建或重建。”
-
解决方法是使用
-
DBMS_REPAIR 包中的 ONLINE_INDEX_CLEAN 过程
-
-
-
解决问题:
-
==============
-
-
SMON 最终会清除锁定的索引,因此实际上不需要任何操作。然而,让 SMON 进行清理可能会有点“碰巧”,因为 SMON 将尝试每 60 分钟清理一次,如果它无法使用 NOWAIT 锁定对象,它将稍后再试一次。在具有许多事务的高度活跃的数据库中,这可能导致重建需要很长时间,因为 SMON 不会通过 NOWAIT获得锁定。其他情况,如针对表的未提交事务也会导致 SMON 不重建索引。
-
-
-
只要不重建索引,对索引的所有访问都会导致 ORA-8104 或 ORA-8106。因此,为了解决这种情况,可以使用以下方法手动清理
-
-
sqlplus / as sysdba
-
-
DECLARE
-
isClean BOOLEAN;
-
BEGIN
-
isClean := DBMS_REPAIR.ONLINE_INDEX_CLEAN();
-
end;
-
/
DBMS_REPAIR.ONLINE_INDEX_CLEAN 介绍:
此功能对失败或中断的在线索引构建或重建执行手动清理。
无论用户启动的清理如何,SMON 也会定期执行此操作 (批:听起来很感动,可实际可能不干活)。
如果所有指定的索引都已清除则返回TRUE;如果一个或多个索引无法清除,则此函数返回FALSE。
关于这个clean,还要注意一下:
-
建议在生产库上如下使用:
-
select object_id from dba_objects where object_name='&idx_name';
-
假设得到的索引对象ID是76064,ORA-8104报错也会提示相关ID
-
-
set serveroutput on
-
DECLARE
-
isClean BOOLEAN;
-
BEGIN
-
isClean := DBMS_REPAIR.ONLINE_INDEX_CLEAN(76064);
-
dbms_output.PUT_LINE(sys.dbms_sqltcb_internal.i_convert_from_boolean(isClean));
-
end;
-
/
如果已经修复,再执行上面的语句则会报错:
在测试环境中可以不输入OBJECT_ID参数,就会把所有有问题的索引都修复一下。
阅读(2238) | 评论(0) | 转发(0) |