zoukankan      html  css  js  c++  java
  • online创建索引中途取消导致索引无法删除解决办法

    问题:有一个表ID栏位没有索引,但是在一个update语句的where中被使用,因此打算online创建索引,但是长时间没有成功,此时决定取消,取消后发现索引无法删除

    过程:

            数据库监控报警有行锁,进入之后发现是一个update的sql迟迟没有提交,分析后发现走的是全表扫描

            根据谓词条件创建索引

    /* Formatted on 2020/1/9 上午 11:01:28 (QP5 v5.163.1008.3004) */
    CREATE INDEX XXX.XXX
       ON XXX.XXX(ID)
       TABLESPACE XXX
       ONLINE;

           在创建的时候,一个200M的表执行了好久还是没有完成,此时查看发现被上边的updatg语句挡住了,此时查找资料后得知online可以在线加索引,但是如果表上面有DML语句一直不提交的话,

           就会挡着索引的创建,因此此时决定取消创建

           取消后,发现表上已经有索引了,个人感觉这个索引是不健康的,写了一个加hint的sql试了一下,这个索引果然没有起作用,因此决定删除重建

           删除索引时,有报错:ORA-00054: 資源正被使用中, 請設定 NOWAIT 來取得它, 否則逾時到期   

           查看资料后,决定使用包DBMS_REPAIR手动清理 

    --查找索引的object_id
    /* Formatted on 2020/1/9 上午 11:01:33 (QP5 v5.163.1008.3004) */
    SELECT i.obj#,
           i.flags,
           u.name,
           o.name,
           o.type#
      FROM sys.obj$ o, sys.user$ u, sys.ind_online$ i
     WHERE     (BITAND (i.flags, 256) = 256 OR BITAND (i.flags, 512) = 512)
           AND (NOT ( (i.type# = 9) AND BITAND (i.flags, 8) = 8))
           AND o.obj# = i.obj#
           AND o.owner# = u.user#;
    --或者使用dba_objects视图
    --使用如下sql以SYS用户进行清理
    DECLARE
       a   BOOLEAN;
    BEGIN
       a := DBMS_REPAIR.online_index_clean (200053,dbms_repair.lock_wait);
    END;
    /

         手动清理的过程中,发现sql一直迟迟执行不了,查找资料发现,这个语句会一直试图占用资源,但是如果一直无法占用资源,这个sql就会被挡

         到这里继续找表上的迟迟不提交DML,找到并杀掉进程后,顺利执行,执行后索引就没有了。

  • 相关阅读:
    DNS正向解析实现
    基于bind软件部署DNS服务器
    DNS解析工具使用案例
    DNS服务工作原理
    3
    .deb/.whl/.tgz/.tar/gz软件包安装方式(Ubuntu)
    博客系列目录
    Databricks 第3篇:pyspark.sql 通过JDBC连接数据库
    Databricks 第2篇:pyspark.sql 简介
    数据预处理 第4篇:数据预处理(sklearn 插补缺失值)
  • 原文地址:https://www.cnblogs.com/monkey6/p/12170507.html
Copyright © 2011-2022 走看看