广告
返回顶部
首页 > 资讯 > 数据库 >数据库中怎么清除创建失败的索引
  • 426
分享到

数据库中怎么清除创建失败的索引

2024-04-02 19:04:59 426人浏览 泡泡鱼
摘要

这篇文章主要介绍了数据库中怎么清除创建失败的索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在创建一张大表的索引时,因为没有加并行而导致创

这篇文章主要介绍了数据库中怎么清除创建失败的索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

在创建一张大表的索引时,因为没有加并行而导致创建时间很长,这时候如果终止操作,比如直接关闭终端,然后再次登录创建时就会报错ORA-00095提示对象名字已被用,而去删除对象时又报错ORA-08104索引正在被创建。

sql> drop index xxx.BM_IX;
drop index xxx.BM_IX
                *
ERROR at line 1:
ORA-08104: this index object 1443829 is being online built or rebuilt
SQL> select object_id from dba_objects where object_name='BM_IX';
 OBJECT_ID
----------
   1443829
$ oerr ora 08104
08104, 00000, "this index object %s is being online built or rebuilt"
// *Cause:  the index is being created or rebuild or waited for recovering 
//          from the online (re)build 
// *Action: wait the online index build or recovery to complete

从oerr工具看到的ORA-08104的解释是索引并没有创建失败,而是在终端关闭之后,创建的操作还在继续进行。创建或者重建索引时,系统会创建一个临时日志表,这张表被用于存放创建或者重建索引期间产生的日志信息,同时在基表IND$中这个索引的FLAG字段上会被设置为BUILD或者REBUILD标识,当索引信息变更时会把变更信息存入日志表。如果索引创建或者重建失败,这个日志表和数据字典中的状态位都需要后台进程smon进行清理。

因此这里的索引不能被删除是因为后台进程smon还没来得及清理相应的临时段和标志位,认为online rebuild操作还在进行。

那么现在如何终止rebuild index这一操作?查找metalink得到一篇文档:ORA-600 [12813] When Dropping A Table Partition After a Failed IndexRebuild (文档 ID 803008.1)。它给出了两种方法:

1)使用包dbms_repair包来清理

如果在出现问题的对象的数据库活动能停下来,则直接简单地执行如下语句即可:

connect / as sysdba
select dbms_repair.online_index_clean(<problem index object_id>) from dual; 
exit

2)使用PL/SQL block调用dbms_repair包来清理

如果在出现问题的对象的数据库活动不能停下来,则如下的PL/SQL block来处理

注:加上dbms_repair.lock_wait表示不是立刻清理,需要不断的寻找资源,直到抢到为止

declare
  isClean boolean;
begin
  isClean := FALSE;
  while isClean=FALSE loop
isClean := dbms_repair.online_index_clean(dbms_repair.all_index_id,
                                          dbms_repair.lock_wait);
dbms_lock.sleep(2);
  end loop;
  exception 
when others then 
  RAISE; 
end;
/

感谢你能够认真阅读完这篇文章,希望小编分享的“数据库中怎么清除创建失败的索引”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网数据库频道,更多相关知识等着你来学习!

您可能感兴趣的文档:

--结束END--

本文标题: 数据库中怎么清除创建失败的索引

本文链接: https://www.lsjlt.com/news/63705.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle中explain的用法
    oracle中的explain命令用于分析sql语句的执行计划,使用方法为在sql语句前添加explain关键字。explain结果包含id、操作符类型、行数估计、成本估计、输出行数估计...
    99+
    2024-05-05
    oracle access sql语句
  • oracle中tochar的用法
    oracle to_char 函数将数字、日期或时间值转换为字符串。格式化字符串指定输出格式,包括日期、时间和数字格式元素。常见日期格式元素包括“%y”(年)和“%m”(月),数字格式元...
    99+
    2024-05-05
    oracle 格式化输出
  • oracle中从右往左截取的函数是什么
    oracle 的 ltrim 函数用于从字符串右侧截取所有空白字符,包括空格、制表符、换行符和回车符。它返回修剪后的字符串,如果字符串不包含空白,则返回原始字符串。 LTRIM 函数 ...
    99+
    2024-05-05
    oracle
  • oracle中regexp_like的用法
    oracle 中的 regexp_like 函数用于比较字符串是否与正则表达式相匹配,返回布尔值:语法: regexp_like(string, regexp, [condition])...
    99+
    2024-05-05
    oracle
  • oracle中regexplike用法
    oracle regexp_like 运算符用于执行正则表达式匹配,检查字符串是否符合指定模式,返回布尔值。它支持各种元字符,如 .、*、+、、^、$、[]、{},允许复杂的匹配模式。此...
    99+
    2024-05-05
    oracle
  • oracle中null和空字符串是等价的嘛
    oracle 中,null 和空字符串不相等。null 代表未知值,与任何值都不相等;空字符串是一个长度为 0 的字符串,可以与其他空字符串相等。null 与空字符串的差异在于:null...
    99+
    2024-05-05
    oracle
  • oracle中listagg函数的用法
    listagg 函数将一组行的数据连接成一个字符串,使用指定的连接符分隔元素。用法包括:1. 连接一个列中的所有值;2. 使用连接符分隔值;3. 忽略 null 值;4. 按组分区;5....
    99+
    2024-05-05
    oracle
  • oracle中count函数与什么函数一样
    oracle 中 count 函数相当于 sql 中的 count() 函数。它用于计算指定列或表达式的非空值的个数,包括:count(*):计算表中所有非空值的个数。count(col...
    99+
    2024-05-05
    oracle
  • oracle中的rownum如何替代
    除 oracle 的 rownum 伪列外,您可以使用以下替代方案获取行的顺序号:1. 子查询(使用嵌套子查询);2. 分析函数(例如 row_number());3. 序列(对于新插入...
    99+
    2024-05-05
    oracle
  • oracle中declare用法
    oracle 中的 declare 语句声明变量、常量和游标等对象。其语法为:declare [修饰符] 标识符 数据类型 [default 默认值] [, ...], 用于存储临时数据...
    99+
    2024-05-05
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作