環境
- Oracle 11.2.0.1.0 64-bit / Windows Server 2008 R2
- 告警日誌大量 ORA-01578、ORA-01110、ORA-26040
一、定位損壞物件類型
1.1 根據 File# + Block# 查段
SELECT tablespace_name, segment_type, owner, segment_name
FROM dba_extents
WHERE file_id = 6
AND 329302 BETWEEN block_id AND block_id + blocks - 1;
1.2 LOBSEGMENT 進一步定位基表
SELECT owner, table_name
FROM dba_lobs
WHERE segment_name = 'SYS_LOB0000820025C00004$$';
1.3 索引段直接得知索引名
SELECT tablespace_name, segment_type, owner, segment_name
FROM dba_extents
WHERE file_id = 6
AND 329302 BETWEEN block_id AND block_id + blocks - 1;
-- 回傳 SEGMENT_TYPE=INDEX, SEGMENT_NAME=M83_SU_USR_PK_1
二、資料表壞塊處理 (無備份 → 接受資料遺失)
2.1 設定事件 10231 跳過壞塊
ALTER SYSTEM SET EVENTS '10231 trace name context forever, level 10';
2.2 匯出完好資料
exp yksoft/*** file=xx.dmp log=xx.log tables=CONSTANT
# 多表
exp yksoft/*** file=xx.dmp log=xx.log tables=TABLE1,TABLE2
2.3 關閉事件
ALTER SYSTEM SET EVENTS '10231 trace name context off';
2.4 重建表並匯入
DROP TABLE yksoft.CONSTANT PURGE;
CREATE TABLE yksoft.CONSTANT ...; -- 依原結構
imp yksoft/*** file=xx.dmp log=imp.log tables=CONSTANT
三、索引壞塊處理 (標準:刪除重建)
3.1 嘗試直接刪除
DROP INDEX yksoft.M83_SU_USR_PK_1;
-- 若報 ORA-02429 (主鍵/唯一約束依賴) → 需先刪約束
3.2 完整重建流程
- 查詢索引所屬表與欄位
SELECT index_name, column_name, table_name
FROM dba_ind_columns WHERE index_name='M83_SU_USR_PK_1';
- 導出表結構 DDL
SET LONG 90000 PAGES 999
SELECT DBMS_METADATA.GET_DDL('TABLE','M83_SU_USR','YKSOFT') FROM DUAL;
- 導出索引 DDL
SELECT DBMS_METADATA.GET_DDL('INDEX','M83_SU_USR_PK_1','YKSOFT') FROM DUAL;
- 刪除約束
ALTER TABLE yksoft.M83_SU_USR DROP CONSTRAINT M83_SU_USR_PK_1;
- 刪除索引
DROP INDEX yksoft.M83_SU_USR_PK_1;
- 重建索引 (依導出 DDL)
CREATE UNIQUE INDEX "YKSOFT"."M83_SU_USR_PK_1" ON "YKSOFT"."M83_SU_USR" ("RECIDX")
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
STORAGE(...) TABLESPACE "YKSPACE";
- 重建約束
ALTER TABLE yksoft.M83_SU_USR ADD CONSTRAINT "M83_SU_USR_PK_1" PRIMARY KEY ("RECIDX");
關鍵提醒
- **有備份優先 RMAN 恢復** (零資料遺失)
- 事件 10231 僅供匯出階段開啟,**匯出完畢立即關閉**
- 索引重建建議
NOLOGGING 加速,完成後切回 LOGGING
- 壞塊修復後執行
DBMS_REPAIR.CHECK_OBJECT 驗證