天天看點

對象遷移空間對索引狀态的影響

上篇文章介紹了遷移表、索引對象的操作:

<a href="http://blog.csdn.net/bisal/article/details/50804714">http://blog.csdn.net/bisal/article/details/50804714</a>

發現漏了一個細節,就是表、LOB對象移動後索引的狀态。

1.建立測試表

該表有一個CLOB的大對象。

TBL_ABLE表存在于使用者預設表空間TEST_TBS中。

user_indexes中儲存兩條TBL_ABLE的記錄,一條是LOB類型的SYS_IL0000124396C00002$$,一條是主鍵索引SYS_C0055438,都存儲于TEST_TBS表空間。

2.将表移至USERS表空間

此時檢視user_indexes,LOB對象SYS_IL0000124401C00002$$的狀态仍是VALID,但主鍵索引SYS_C0055439的狀态變為了UNUSABLE,且兩者所處的表空間仍是TEST_TBS。

此時INSERT操作會提示:

ORA-01502:索引’SYS_C0055439’或這類索引的分區處于不可用狀态

3.移動索引對象

将主鍵索引移至USERS表空間,且此時狀态是VALID,LOB對象SYS_IL0000124401C00002$$沒有改變,狀态仍是VALID。

将LOB對象SYS_IL0000124401C00002$$移至USERS表空間,此時LOB對象狀态是VALID,但主鍵索引狀态現在卻是UNUSABLE了。

這裡我使用了11.2.0.1和11.2.0.4兩個庫版本測試,發現在11.2.0.4中執行alter table move或alter table move lob時将主鍵索引狀态置為UNUSABLE,alert日志中會有記錄:

Some indexes or index [sub]partitions of table XXX.TBL_ABLE have been marked unusable

标記了索引錯誤,這和INSERT操作報錯ORA-01502的描述不謀而合,但11.2.0.1版本的alert日志中沒有任何标記。

4.讓索引重新生效

重建索引,此時才能改為VALID狀态。

總結:

對于對象移動表空間的操作,要關注索引等附屬資訊的有效性,對于LOB對象的移動,也可能會導緻索引狀态的失效。