【问题标题】:how does an oracle spatial index become corrupted?oracle 空间索引是如何损坏的?
【发布时间】:2021-10-24 10:57:13
【问题描述】:

所以我有一个带有 Oracle 空间索引的表。在一些 DML 之后,索引会中断。我不知道这到底是什么时候发生的。大多数时候 DELETE 和 UPDATE 语句是在表上执行的。有谁知道为什么索引会中断以及如何防止这种情况发生?

这是我用来检查和修复索引的脚本:

declare
  l_cnt number;
  l_msg varchar2(32000);
  l_err_msg varchar2(2000);
begin
  for rec in (select SDO_INDEX_OWNER,SDO_TABLE_NAME,SDO_INDEX_NAME,SDO_RTREE_HEIGHT
    from all_sdo_index_metadata
   where SDO_INDEX_OWNER = 'OWNER'
  ) loop
    begin
      execute immediate 'SELECT count(*) FROM table(mdsys.sdo_rtree_admin.sdo_rtree_descrids(:index_owner,:index_name,:rtree_height)) A
      WHERE a.column_value NOT IN (SELECT ROWID FROM '||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||')'
                into l_cnt using rec.SDO_INDEX_OWNER, rec.SDO_INDEX_NAME, rec.SDO_RTREE_HEIGHT;
      if l_cnt > 0 then
            execute immediate 'alter index '||rec.SDO_INDEX_OWNER||'.'||rec.SDO_INDEX_NAME||' rebuild online';
                :txt := :txt||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_cnt||' Index '||rec.SDO_INDEX_NAME||' neu aufgebaut'||chr(10);
                -- l_msg := l_msg||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_cnt||' Index '||rec.SDO_INDEX_NAME||' neu aufgebaut'||chr(10);
          else
            :txt := :txt||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_cnt||chr(10);
            -- l_msg := l_msg||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_cnt||chr(10);
          end if;
    exception
        when others then
          l_err_msg := sqlerrm;
          --l_msg := l_msg||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_err_msg;
          :txt := :txt||rec.SDO_INDEX_OWNER||'.'||rec.SDO_TABLE_NAME||': '||l_err_msg||chr(10);
        end;
  end loop;
end;

【问题讨论】:

  • 警报日志中是否有任何消息?转储目录中的跟踪文件如何?
  • 你能定义“休息”吗? USER_INDEXES.STATUS 是什么?
  • 我已经添加了用于检查和修复索引的脚本
  • 您在应用程序中遇到了哪些具体错误?
  • ORA-13199:空间索引提交失败。重建后错误消失了。

标签: oracle spatial-index oracle-spatial


【解决方案1】:

您的 Oracle 版本是多少?您的脚本无法在 11.2.0.4 中编译。
另外,After some DMLs the index breaks 的示例?我从未见过能够破坏索引的 DML。
这是我多年来一直在使用的脚本,HTH

    select di.TABLE_owner, di.TABLE_NAME, di.owner idx_owner, di.INDEX_NAME, dc.column_name, 
        di.PARAMETERS, 
        di.STATUS, di.DOMIDX_STATUS, di.DOMIDX_OPSTATUS, sit.SDO_INDEX_STATUS, di.FUNCIDX_STATUS, 
        sit.sdo_index_table, sit.SDO_TABLESPACE, sit.SDO_TSNAME, sit.SDO_RTREE_SEQ_NAME, di.LAST_ANALYZED, di.NUM_ROWS, di.PARTITIONED 
   from DBA_INDEXES di, DBA_IND_COLUMNS dc, mdsys.SDO_INDEX_METADATA_TABLE sit
  where index_type = 'DOMAIN' 
    and di.TABLE_owner in ('OWNER')     --a table has an (table_)owner
    and di.owner=dc.index_owner and di.owner=sit.sdo_index_owner   --its index maybe in another owner. the index owner= col.indx.owner+sdo.indx.owner
    and di.INDEX_NAME=dc.INDEX_NAME and di.index_name= sit.sdo_INDEX_NAME --same w ind.name
    and di.table_name=dc.TABLE_NAME 
    and (di.STATUS!='VALID' or sit.SDO_INDEX_STATUS!='VALID' or di.DOMIDX_STATUS!='VALID' or di.DOMIDX_OPSTATUS!='VALID' )     
  order by di.TABLE_owner, di.TABLE_NAME, di.INDEX_NAME, dc.column_position, dc.column_name ;

【讨论】:

  • Oracle 是 19c。 DML真的很像:插入表值geomrow或从id不在的表中删除(从tableB中选择geom_id_fk);这就是奇怪的部分
猜你喜欢
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多