如何更正 Oracle 中損壞的索引?
我的日誌中有這個 ORA 錯誤:
引起:java.sql.BatchUpdateException:ORA-01578:ORACLE 數據塊損壞(文件#8,塊#22921) ORA-01110:數據文件 8:’/data/app/oracle/oradata/MYSRVR/datafile/o1_mf_mysrvr_88m82mdj.數據庫'
我嘗試在 sqlplus 中執行它:
從 sys.dba_extents 中選擇 segment_name、segment_type、tablespace_name、owner,其中 file_id=8 和 22921 在 block_id 和 block_id + 塊 -1 之間;
輸出是:
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME OWNER ----------------------- ------------ ---------------- --------------- PK_ZXCATSET_CATID INDEX MYSRVR_IDX_TB MYSRVR
現在我被困在哪個索引是實際的段名稱上。(我認為:/)我嘗試這樣做來重建該索引:
SQL> alter index PK_ZXCATSET_CATID 重建表空間 MYSRVR_IDX_TB;
- 第 1 行的錯誤:ORA-01418:指定的索引不存在
即使我執行“從 dba_indexes 中選擇 index_name”,也會顯示該索引名稱。我究竟做錯了什麼?這是一個 10.2 Oracle 伺服器。
提前致謝!
編輯如果我做 MYSRVR.PK_ZXCATSET_CATID 改變完成……但我仍然認為我的問題沒有得到解決!
好像你有媒體腐敗。如果您的數據庫中存在未解決的故障,我會查閱自動診斷儲存庫 (ADR) 內容。您可以通過 Enterprise Manager 或使用 RMAN 命令行實用程序來執行此操作:
[oracle@oca ~]$ rman target=/ RMAN> list faliure;
如果有
OPEN
列出狀態的故障,您可以要求數據恢復顧問 (DRA) 對其進行分析,並為您推薦修復故障的解決方案:RMAN> advise failure;
由於您有塊損壞,DRA 可能會建議您恢復損壞的塊,並創建適當的腳本,您可以手動執行或使用 RMAN 在同一流程中執行:
RMAN> repair failure;
修復故障後,DRA 會自動關閉它們。
list failure
您可以使用RMAN 中的另一個命令檢查是否所有故障都已關閉,如果沒有,您可以從 DRA 獲得另一個建議。編輯:
由於您執行的恢復沒有持續很長時間(
elapsed time: 00:00:00
),我推斷數據文件不是由 RMAN 寫入的,甚至可能檢查過。因此,我建議您主動驗證數據庫;為此,只需validate database
在 RMAN 中發出並分析輸出。RMAN 將檢查所有數據文件(包括控製文件和 spfile)並顯示是否有任何損壞的塊。在您的評論中,您說 RMAN 返回消息“塊媒體恢復需要企業版”以響應您的一個命令,並且根據 RMAN 對
validate database
命令的響應,我懷疑此功能在您的軟體版本中也不可用。如果您的數據庫在ARCHIVELOG
模式下執行(檢查select log_mode from v$database
),您可以完全恢復和恢復您的數據庫而不會失去已送出的事務,但在此之前我會確保您的媒體(硬碟)沒有損壞。
好的,“RMAN> 列表失敗;” 事情沒有奏效,但它確實引導我朝著正確的方向前進。為了讓事情重新開始,我這樣做了:
$ rman target sys/myuser@mytargetsrvr RMAN> recover datafile 8
// 這給了這個
ORA-00283: recovery session canceled due to errors ORA-01124: cannot recover data file 8 - file is in use or recovery
// 相反,我先這樣做
RMAN> sql 'alter tablespace MYSRVR_IDX_TB offline'; sql statement: alter tablespace MYSRVR_IDX_TB offline RMAN> recover datafile 8; Starting recover at 25-APR-13 using channel ORA_DISK_1 starting media recovery media recovery complete, elapsed time: 00:00:00 Finished recover at 25-APR-13 RMAN> sql 'alter tablespace MYSRVR_IDX_TB online'; sql statement: alter tablespace MYSRVR_IDX_TB online
非常感謝 Yasir Arsanukaev!