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

Oracle 常見錯誤代碼深度解析(二):ORA-01578 塊損壞與 ORA-01628 擴展上限

     編輯:Oracle 資料庫相關知識

ORA-01578: Oracle Data Block Corrupted

錯誤全文

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

產生原因

  1. 硬件 I/O 錯誤(磁碟壞道、控制器故障)
  2. 操作系統 I/O 子系統錯誤或緩衝區問題
  3. 內存/分頁錯誤
  4. 嘗試訪問未格式化的系統塊
  5. 數據文件部分溢出/寫入不完整

以上任一原因導致邏輯壞塊或物理壞塊。注意:報錯時間可能晚於實際損壞時間。

診斷步驟

-- 1. 定位壞塊所屬段
SELECT owner, segment_name, segment_type
FROM dba_extents
WHERE file_id = <F> AND <B> BETWEEN block_id AND block_id + blocks - 1;
-- <F>、<B> 為錯誤提示的文件號、塊號

解決方案分類

壞塊位置處理策略
索引段重建索引:ALTER INDEX idx_name REBUILD; 即可修復
表段見下文詳細流程
數據字典/系統表空間/回滾段立即聯繫 Oracle 支持,不可自行嘗試

表段壞塊修復完整流程

  1. 驗證壞塊性質(建議執行多次):
    ANALYZE TABLE <table_name> VALIDATE STRUCTURE CASCADE;
    • 報相同 ORA-01578 參數 → 永久性物理/邏輯壞塊
    • 報不同參數 → 可能為內存/頁空間/I/O 設備隨機錯誤
  2. 有可用備份:優先恢復備份
  3. 無備份,需搶救數據:使用 Event 10231 跳過壞塊
    -- 1. 關閉數據庫
    SHUTDOWN IMMEDIATE;
    
    -- 2. 編輯 init<SID>.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. 替換原表
    RENAME corrupted_table TO corrupted_table_bad;
    RENAME temp_rescue TO corrupted_table;
    
    -- 7. 重建索引、約束、授權

替代方案:使用 ROWID 範圍分批導出數據,參考 Oracle 故障排除手冊。

ORA-01628: Max Extents Reached

錯誤全文

ORA-01628: max # of extents num reached for rollback segment num

原因分析

回滾段或表空間達到 MAXEXTENTS 參數上限。注意:這是邏輯參數上限,非硬件上限。硬件上限取決於創建數據庫時的 DB_BLOCK_SIZE。

解決方案

  1. 增加 MAXEXTENTS:
    ALTER TABLESPACE tbs_name STORAGE (MAXEXTENTS 10000);

    新值必須 > 當前報錯值,且 ≤ LARGEST MAXEXTENT(由 block size 決定)。

  2. 若已達 LARGEST MAXEXTENT:重建大區塊尺寸表空間
    -- 1. EXP 導出表 (COMPRESS=Y)
    -- 2. 重命名原表空間
    -- 3. 創建新表空間 (較大 INITIAL/NEXT/UNIFORM SIZE)
    -- 4. IMP 導入數據
  3. 按對象類型處理:
    • 回滾段/索引:刪除並重建
    • 臨時表空間:修改存儲參數

示例

ORA-01628: max # extents 50 reached for rollback segment RBS_1
-- 處理:DROP ROLLBACK SEGMENT RBS_1; CREATE ROLLBACK SEGMENT RBS_1 STORAGE (MAXEXTENTS UNLIMITED);

英文原文對照

ORA-01578
Cause: The given data block was corrupted, probably due to program errors.
Action: Try to restore the segment containing the given data block. This may involve dropping the segment and recreating it. If there is a trace file, report the messages in it to customer support.

ORA-01628
Cause: An attempt was made to extend a rollback segment that already has reached its maximum size or space could not be allocated in the data dictionary to contain the definition of the object.
Action: If possible, increase the value of either the MAXEXTENTS or PCTINCREASE initialization parameters or find the data dictionary table lacking space and alter the storage parameters.

總結

  • ORA-01578:先定位段類型,索引重建、表段搶救數據、字典段聯繫廠商。日常必須:DB_BLOCK_CHECKING=FULL、DB_BLOCK_CHECKSUM=FULL、定期 RMAN VALIDATE、RAID 冗余、備份驗證。
  • ORA-01628:本質是存儲參數規劃不足。現代 Oracle 建議使用 本地管理表空間 + AUTOALLOCATE 或 BIGFILE 表空間,徹底消除 MAXEXTENTS 煩惱。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved