ddl 導致分割槽表全域性索引unusable
上週五意外發現一個分割槽表的全域性索引失效變為unusable,在監控SQL效能時有幾個SQL因為這個索引而掛掉。
忽然想起是前一天進行測試時,對該表一個分割槽做了exchange交換分割槽操作。下面還原下場景:
create table test(id number,name varchar2(10))
partition by list(id)
(
partition p1 values(1),
partition p2 values(2),
partition p3 values(3)
);
create index idx_test_id on test(id);--全域性索引
create index idx_test_name on test(name) local;--本地索引
SQL> select table_name,index_name,status from user_indexes where table_name='TEST';
TABLE_NAME INDEX_NAME STATUS
------------------------------ ------------------------------ --------
TEST IDX_TEST_NAME N/A
TEST IDX_TEST_ID VALID
N/A表示是本地索引狀態,VALID是全域性索引狀態。
1.交換分割槽(此時表中無資料)
SQL> create table t as select * from test;
表已建立。
SQL> alter table test exchange partition p1 with table t;
表已更改。
SQL> select table_name,index_name,status from user_indexes where table_name='TEST';
TABLE_NAME INDEX_NAME STATUS
------------------------------ ------------------------------ --------
TEST IDX_TEST_NAME N/A
TEST IDX_TEST_ID UNUSABLE
可以看到此時全域性索引由valid變為unusable,本地索引狀態沒有變。
2.truncate分割槽
首先將全域性索引重建:
alter index idx_test_id rebuild;
此時檢視
SQL> select table_name,index_name,status from user_indexes where table_name='TEST';
TABLE_NAME INDEX_NAME STATUS
------------------------------ ------------------------------ --------
TEST IDX_TEST_NAME N/A
TEST IDX_TEST_ID VALID
直接truncate分割槽看看,
SQL> alter table test truncate partition p1;
表被截斷。
SQL> select table_name,index_name,status from user_indexes where table_name='TEST';
TABLE_NAME INDEX_NAME STATUS
------------------------------ ------------------------------ --------
TEST IDX_TEST_NAME N/A
TEST IDX_TEST_ID VALID
直接truncate沒有資料的分割槽p1,全域性分割槽和本地分割槽索引狀態都不變。
SQL> insert into test values(1,'a');
已建立 1 行。
SQL> alter table test truncate partition p1;
表被截斷。
SQL> select table_name,index_name,status from user_indexes where table_name='TEST';
TABLE_NAME INDEX_NAME STATUS
------------------------------ ------------------------------ --------
TEST IDX_TEST_NAME N/A
TEST IDX_TEST_ID UNUSABLE
在p1分割槽插入資料後,再執行truncate分割槽,這時發現本地分割槽狀態沒有變,但是全域性分割槽狀態由valid變為unusable。
3.drop分割槽
首先將全域性索引重建:alter index idx_test_id rebuild;
SQL> select table_name,index_name,status from user_indexes where table_name='TEST';
TABLE_NAME INDEX_NAME STATUS
------------------------------ ------------------------------ --------
TEST IDX_TEST_NAME N/A
TEST IDX_TEST_ID VALID
SQL> alter table test drop partition p1;
表已更改。
SQL> select table_name,index_name,status from user_indexes where table_name='TEST';
TABLE_NAME INDEX_NAME STATUS
------------------------------ ------------------------------ --------
TEST IDX_TEST_NAME N/A
TEST IDX_TEST_ID VALID
分割槽中沒有資料時,執行drop分割槽不會影響全域性索引狀態。
SQL> insert into test values(2,'a');
已建立 1 行。
SQL> alter table test drop partition p2;
表已更改。
SQL> select table_name,index_name,status from user_indexes where table_name='TEST';
TABLE_NAME INDEX_NAME STATUS
------------------------------ ------------------------------ --------
TEST IDX_TEST_NAME N/A
TEST IDX_TEST_ID UNUSABLE
分割槽中有資料時執行drop分割槽,會改變全域性索引狀態。
而我們知道,全域性索引和本地索引執行dml都不會改變索引狀態;
但是從上面得知,在進行交換分割槽時會改變全域性索引狀態;當drop或truncate分割槽並且分割槽裡有資料時,會改變全域性索引狀態。
但是他們都不改變本地索引狀態。
有時你可能會忽然發現全域性索引失效,其實這對於生產庫來說是很可怕的事情。在操作時千萬要小心,如果不得不進行會引起全域性索引失效的操作,
那麼操作完畢一定要記得將全域性索引rebuild。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24496749/viewspace-734921/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分割槽表、分割槽索引和全域性索引部分總結索引
- 全域性分割槽索引和區域性分割槽索引索引
- Oracle分割槽表全域性索引新增分割槽時不會失效Oracle索引
- ORACLE 分割槽索引UNUSABLE導致的DML操作失敗引起的血案Oracle索引
- 分割槽表全域性索引與本地索引的選擇索引
- 分割槽表本地索引與全域性索引的區別索引
- 分割槽表 全域性索引與本地索引失效測試索引
- 分割槽表中的區域性分割槽索引及全域性索引與執行計劃索引
- 分割槽索引和全域性索引(轉載)索引
- 分割槽索引:區域性 locally & 全域性 global索引
- MySQL Online DDL導致全域性鎖表案例分析MySql
- 刪除分割槽需要更新全域性索引索引
- [轉]Oracle分割槽索引--本地索引和全域性索引比較Oracle索引
- Oracle分割槽索引--本地索引和全域性索引比較(轉)Oracle索引
- 刪除分割槽更新全域性索引使用提醒索引
- 分割槽表中全域性及本地分割槽索引什麼時候會失效及處理索引
- 分割槽索引之本地(local index)索引和全域性索引(global index)索引Index
- 記一次Oracle分割槽表全域性索引重建的過程Oracle索引
- 全面學習分割槽表及分割槽索引(15)--修改表分割槽屬性和模板索引
- oracle分割槽表的常規操作導致對索引的影響Oracle索引
- 分割槽表中全域性及本地分割槽索引什麼時候會失效及處理[final]索引
- Oracle分割槽表及分割槽索引Oracle索引
- ORACLE10g新特性——全域性HASH分割槽索引Oracle索引
- Oracle帶區域性分割槽索引的分割槽表刪除舊分割槽新增新分割槽Oracle索引
- 分割槽表的分割槽資料刪除、truncate會對全域性和區域性索引產生什麼影響索引
- 簡單ORACLE分割槽表、分割槽索引Oracle索引
- rebuild分割槽表分割槽索引的方法Rebuild索引
- 分割槽表及分割槽索引建立示例索引
- 【學習筆記】分割槽表和分割槽索引——管理索引分割槽(四)筆記索引
- 在範圍分割槽表上分割槽維護操作對全域性及本地索引狀態的影響(2)索引
- 全面學習分割槽表及分割槽索引(13)--分隔表分割槽索引
- 事務、全域性索引、透明分散式,再見,分割槽健!索引分散式
- 全面學習分割槽表及分割槽索引(17)--其它索引分割槽管理操作索引
- 全面學習分割槽表及分割槽索引(9)--刪除表分割槽索引
- 全面學習分割槽表及分割槽索引(11)--合併表分割槽索引
- 全面學習分割槽表及分割槽索引(12)--修改list表分割槽索引
- 學習筆記】分割槽表和分割槽索引——新增表分割槽(二)筆記索引
- 分割槽表分割槽索引查詢效率探究索引