ORA-08104
Beberapa waktu lalu, saya mendapatkan error “ORA-08104” di database warehouse di kantor, dikarenakan di “kill” nya proses “rebuild index online” nya, sehingga menyebabkan index tersebut menjadi tidak valid.
Dan berdasarkan referensi dari metalink note.375856.1, disitu dinyatakan bahwa error tersebut terdapat relasi dengan BUG 3805539, yang nyatanya issue tersebut harusnya sudah fix di Oracle Ver. 10.2.0.1, Tapi nyatanya di database warehouse saya yang notabene adalah Oracle Ver. 10.2.0.4.0 dan miskin downtime masih terdapat error tersebut.
Tilik ditilik ternyata didapatkan 2 solusinya, yaitu dengan mengganti flag pada “SYS.IND$” tersebut, atau menggunakan “dbms_repair.online_index_clean” sesuai dengan note.375856.1 tadi.
Oke pertama kita gunakan solusi yang pertama dengan menganti flag pada “SYS.IND$” tersebut.
1) Kita cari dulu “object ID” dari index yang bermasalah itu
SELECT obj# from sys.ind$ where bitand(flags, 512)=512;
2) Update flag untuk “object id” tersebut.
1 2 | UPDATE sys.ind$ SET flags = flags - 512 WHERE obj# = 317358; commit; |
3) Drop and recreate the index
Disini setelah update flag, ternyata index tidak bisa didrop, malah muncul error “ORA-00054: resource busy and acquire with NOWAIT specified”, puih..
Oke saya anggap gagal, Next kita coba solusi berikutnya,
1) Kita cari dulu “object ID” dari index yang bermasalah itu
SELECT i.obj#, i.flags, u.name, o.name, o.type# FROM sys.obj$ o, sys.user$ u, sys.ind$ idx, sys.ind_online$ i WHERE bitand(i.flags, 512) = 512 AND o.obj#=idx.obj# and o.owner# = u.user# and idx.obj#=i.obj#;
2) Execute DBMS_REPAIR.ONLINE_INDEX_CLEAN
1 2 3 4 5 6 7 8 9 10 11 12 13 | DECLARE RetVal BOOLEAN; OBJECT_ID BINARY_INTEGER; WAIT_FOR_LOCK BINARY_INTEGER; BEGIN OBJECT_ID := 317358; --ini Object ID Hasil dari Kueri 1 WAIT_FOR_LOCK := NULL; RetVal := SYS.DBMS_REPAIR.ONLINE_INDEX_CLEAN (); COMMIT; END; / |
Setelah proses clean up diatas berhasil, coba lakukan DML ke dalam tabel dimana index tersebut berada.
Dijamin tokcer, tanpa perlu bouncing databasenya.


3 Comments