【问题标题】:How do I check index building status on Oracle 11?如何检查 Oracle 11 上的索引构建状态?
【发布时间】:2012-09-04 14:59:27
【问题描述】:

我在创建 SQL 索引时犯了严重错误:

create index IDX_DATA_TABLE_CUSECO on DATA_TABLE (CUSTOMER_ID, SESSION_ID, CONTACT_ID)
  tablespace IDX_TABLESPACE LOCAL ;

如您所见,我错过了关键字“ONLINE”来创建索引,而不会阻塞具有 600m+ 记录的高使用率的 PRODUCTION 表。更正的 SQL 是:

create index IDX_DATA_TABLE_CUSECO on DATA_TABLE (CUSTOMER_ID, SESSION_ID, CONTACT_ID)
  tablespace IDX_TABLESPACE LOCAL ONLINE;

我是在 PL/SQL Developer 下完成的。当我试图停止它时,程序停止响应并崩溃。

生产系统现在 9 个小时都不能工作,我的老板想爆炸。 :D

是否有机会查看 Oracle 11g 剩余多少秒/分钟/小时来处理此索引创建?或者也许有机会看到 Oracle 是否仍在处理这个请求? (PL/SQL Developer 崩溃了)。

对于仇恨者: 我知道我应该像这里提到的那样做:(source)

CREATE INDEX cust_idx on customer(id) UNUSABLE LOCAL;
ALTER INDEX cust_idx REBUILD parallel 6 NOLOGGING ONLINE;

【问题讨论】:

  • 您的链接似乎无效。我希望您正在查看的任何文章至少在告诉您创建不可用的索引之前讨论skip_unusable_indexes 设置,并且它会告诉您在构建索引后更改索引的并行设置。
  • 文章没有,但 cmets 有,并解释了为什么该建议不像您想象的那么有用。不过我和贾斯汀在一起,你为什么不终止运行索引构建的会话?

标签: oracle plsql oracle11g indexing plsqldeveloper


【解决方案1】:

您应该可以在V$SESSION_LONGOPS查看操作进度

SELECT sid, 
       serial#, 
       target, 
       target_desc, 
       sofar, 
       totalwork, 
       start_time, 
       time_remaining, 
       elapsed_seconds
  FROM v$session_longops
 WHERE time_remaining > 0

当然,在生产系统中,我可能会在几小时前终止会话,而不是让 DDL 操作继续阻止用户访问应用程序。

【讨论】:

  • 我看不到我的会话,因为当 PL/SQL Developer 崩溃连接和会话时,但是当我试图计算统计数据时,我收到一个错误: 错误报告:ORA-20000 : 这个索引对象 "PRODSCHM"."IDX_DATA_TABLE_CUSECO" 正在在线构建或重建
  • @WBAR - 我不确定我是否明白你在说什么。客户端应用程序(PL/SQL Developer)崩溃的事实与数据库会话是否仍在运行无关。您在 v$session 中看到会话了吗?
  • @WBAR - 如果会话不存在(假设这不是 RAC 系统,在这种情况下您需要使用 gv$sessiongv$session_longops),它不可能拿着锁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多