通过 ONLINE 参数创建索引(或者重建索引), 如果进程被突然终止,或者是手工 CTRL+C 取消该操作, 在非常个别的时候,麻烦来了。重新创建索引,会告诉你该索引已经存在,drop index ,会告诉你该索引被锁,或者是 ORA-08104(this index object xxxxx is being online built or rebuilt) 错误。该过程失败之前创建的一些临时对象由 SMON 负责清除,糟糕的是, SMON 可能会不作为–我在 9i 上观察是 2 个小时(周期?)才清除掉。
如果是一个比较繁忙的 OLTP 系统, 并且是要维护单列索引,那么风险真的是很大的。在 SMON 清除这些临时对象之前,没有办法在该列上建立新的索引。服务器能撑住么?
在 10g 版本, Oracle 的 DBMS_REPARE 包新增了: online_index_clean ,能够手工进行清除:
dbms_repair.online_index_clean( object_id IN BINARY_INTEGER DEFAULT ALL_INDEX_ID, wait_for_lock IN BINARY_INTEGER DEFAULT LOCK_WAIT) RETURN BOOLEAN;
谢中辉说这是一个 Bug,经过仔细查看 Metalink ,发现很多文档都说的不够准确–10g 的功能,Oracle 还让 9i 的用户去用呢,很不幸,我也上当了。
非常繁忙的一天.
–EOF–