首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 常見錯誤代碼分析與解決 (二):ORA-01578 區塊損毀與 ORA-01628 Extents 耗盡

     編輯:Oracle 資料庫相關知識

ORA-01578: Oracle data block corrupted

成因

  1. 硬體 I/O 錯誤 (磁碟壞軌、控制器故障)
  2. 作業系統 I/O 層或快取問題
  3. 記憶體/分頁錯誤
  4. 嘗試存取未格式化的系統區塊
  5. 資料檔部分溢出

產生邏輯壞塊 (Checksum 驗證失敗) 或物理壞塊 (媒體損壞)。報錯時間可能晚於實際損壞時間。

診斷步驟

-- 1. 定位壞塊所屬物件
SELECT owner, segment_name, segment_type
FROM dba_extents
WHERE file_id = &file_no
  AND &block_no BETWEEN block_id AND block_id + blocks - 1;

-- 2. 若為 Index → 直接 REBUILD
ALTER INDEX idx_name REBUILD;

-- 3. 若為 Table → 驗證結構
ANALYZE TABLE table_name VALIDATE STRUCTURE CASCADE;

處理策略

Event 10231 搶救資料流程

-- 1. 關閉資料庫
SHUTDOWN IMMEDIATE

-- 2. 修改 init.ora 加入
event = "10231 trace name context forever, level 10"

-- 3. 啟動限制模式
STARTUP RESTRICT

-- 4. 建立臨時表搶救資料
CREATE TABLE temp_rescue AS SELECT * FROM corrupted_table;

-- 5. 移除 event 參數,重啟資料庫
SHUTDOWN IMMEDIATE
-- 移除 event 行
STARTUP

-- 6. 重命名原表,臨時表改回原名,重建索引/約束/權限

ORA-01628: max # extents reached

成因

Segment (Table/Index/Rollback) 的 Extents 數達到 MAXEXTENTS 限制,非硬體容量上限。

解決方案

  1. 調大 MAXEXTENTS:
    ALTER TABLE table_name STORAGE (MAXEXTENTS 10000);
    (上限受 DB_BLOCK_SIZE 限制,8K 區塊約 2^24 extents)
  2. 調大 NEXT/PCTINCREASE: 減少 Extent 配置頻率
    ALTER TABLE table_name STORAGE (NEXT 10M PCTINCREASE 50);
  3. 改用 LMT (Locally Managed Tablespace): 9i+ 建議,自動管理 Extent,消除此錯誤
    CREATE TABLESPACE tbs_data DATAFILE '...' SIZE 1G
      EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
  4. Rollback Segment 特殊處理: 若發生於 Undo/RBS,需 DROP/CREATE 或調整 ROLLBACK_SEGMENTS 參數

預防與監控

  • 監控 DBA_SEGMENTS 中 EXTENTS 接近 MAX_EXTENTS 的物件
  • 全面採用 LMT + ASSM (Automatic Segment Space Management)
  • 定期檢查 Alert Log 是否出現 ORA-01578/ORA-01628
  • 硬體層面:RAID、ECC 記憶體、定期磁碟掃描
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
情況處理方式
有完整備份RMAN RESTORE/RECOVER 該表空間或資料檔
無備份、壞塊於 IndexREBUILD INDEX
無備份、壞塊於 Table、資料可犧牲Event 10231 跳過壞塊匯出殘存資料
字典/系統/Undo 區塊損毀立即聯繫 Oracle Support,勿自行處理