上篇文章介紹了遷移表、索引對象的操作:
<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對象的移動,也可能會導緻索引狀态的失效。