Oracle

如何更正 Oracle 中損壞的索引?

  • June 16, 2016

我的日誌中有這個 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!

引用自:https://dba.stackexchange.com/questions/40852