测试环境重建索引时遇到了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参数,就会把所有有问题的索引都修复一下。
阅读(2067) | 评论(0) | 转发(0) |