首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

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

     編輯:Oracle 資料庫基礎

ORA-01578: Oracle data block corrupted (file #, block #)

成因分類

  1. 硬體 I/O 錯誤 (磁碟壞軌、控制器故障、纜線鬆動)。
  2. 作業系統 I/O 子系統/快取錯誤 (檔案系統 Bug、Volume Manager 鏡像不同步)。
  3. 記憶體/分頁問題 (ECC 錯誤、Swap 空間不足導致頁面損壞)。
  4. Oracle 讀取未格式化系統區塊 (邏輯損壞)。
  5. 資料檔離線/縮小導致邏輯位址無效。

關鍵特徵:錯誤發生時間 **晚於實際損壞時間** (只有讀取到該區塊時才報錯)。

診斷步驟


-- 1. 定位損壞區塊歸屬物件
SELECT owner, segment_name, segment_type
FROM dba_extents
WHERE file_id = &file_num
  AND &block_num BETWEEN block_id AND block_id + blocks - 1;

-- 2. 若為索引 → 直接 REBUILD
ALTER INDEX schema.index_name REBUILD [ONLINE] [TABLESPACE tbs];

-- 3. 若為表 → 驗證結構判斷永久/隨機損壞
ANALYZE TABLE schema.table_name VALIDATE STRUCTURE CASCADE;
-- 執行 2-3 次觀察一致性
-- ORA-01578 同參數 → 永久物理/邏輯損壞
-- ORA-01578 異參數 → 記憶體/硬體隨機錯誤

修復策略

場景方案
有近期備份 (RMAN/EXP)最佳:RMAN `BLOCKRECOVER` 區塊級恢復,或表空間/資料檔恢復。
無備份,僅救資料Event 10231 跳過壞區塊導出:
1. `SHUTDOWN IMMEDIATE`
2. `init.ora` 加 `event="10231 trace name context forever, level 10"`
3. `STARTUP RESTRICT`
4. `CREATE TABLE temp AS SELECT * FROM bad_table;` (跳過壞塊)
5. 移除 event 重啟
6. `RENAME bad_table TO bad_table_old; RENAME temp TO bad_table;`
7. 重建索引/約束/授權
損壞在資料字典 / 回滾段 / SYSTEM 表空間立即聯繫 Oracle Support,嚴禁自行嘗試,極高風險導致資料庫無法啟動。

ORA-01628: max # extents reached for rollback segment / table / index

成因

  • 物件儲存參數 `MAXEXTENTS` 達到上限 (非硬體極限,由 `DB_BLOCK_SIZE` 決定理論上限)。
  • 常見於頻繁 DML 的表/索引、長跑交易的回滾段、臨時表空間排序區段。

解決方案

  1. 調大 MAXEXTENTS (若未達 `LARGEST_MAXEXTENTS`):
    `ALTER TABLE schema.table_name STORAGE (MAXEXTENTS 10000);`
    `ALTER ROLLBACK SEGMENT rbs_name STORAGE (MAXEXTENTS UNLIMITED);` (Oracle 9i+ 支援 UNLIMITED)
  2. 已達理論上限:重建物件並調大 `INITIAL`/`NEXT` 減少 Extent 數量:
    `EXP ... COMPRESS=Y` 導出 → `DROP TABLE` → `IMP` 導入 (新儲存參數) 或 `CREATE TABLE new AS SELECT * FROM old` → `DROP old` → `RENAME`。
  3. 回滾段/索引/臨時段:直接 `DROP` 重建 (回滾段需先 `OFFLINE`)。
  4. 臨時表空間:調整 `TEMPORARY TABLESPACE` 儲存參數或改用 **Locally Managed Temporary Tablespace** (Oracle 8i+ 預設 `UNIFORM SIZE`/`AUTOALLOCATE`,不受 MAXEXTENTS 限制)。

範例錯誤


ORA-01628: max # extents 50 reached for rollback segment RBS_1
-- 解決:ALTER ROLLBACK SEGMENT RBS_1 STORAGE (MAXEXTENTS UNLIMITED);

預防與監控建議

  • 啟用 **DB_BLOCK_CHECKSUM=FULL** (資料塊檢驗和) + **DB_BLOCK_CHECKING=MEDIUM/FULL** (邏輯一致性檢查) 早期發現損壞。
  • 定期 `RMAN VALIDATE DATABASE` / `BACKUP VALIDATE` 掃描壞塊。
  • 監控 `DBA_SEGMENTS.MAX_EXTENTS` 接近上限告警。
  • 採用 **Locally Managed Tablespace (LMT)** + **AUTOALLOCATE** 完全消除 Extent 管理負擔 (Oracle 8i+ 標準)。
  • 硬體層:RAID 1/5/10 + 磁碟巡檢 + ECC 記憶體 + 不斷電系統 (UPS)。

結語

ORA-01578 是最嚴重的資料完整性錯誤,**備份有效性是唯一底線**;ORA-01628 則是儲存管理疏忽的信號,遷移至 LMT + AUTOALLOCATE 可徹底根治。建立「壞塊零容忍」監控體系 (RMAN Validate + Block Change Tracking + 硬體健康度),才能在災難發生前完成避險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved