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

Oracle 高頻錯誤碼解析與修復:ORA-01650/01652/01578 實戰排查手冊

     編輯:Oracle 資料庫基礎

前言

DBA 日常運維中,ORA-01650 (Rollback Segment)、ORA-01652 (Temp Segment)、ORA-01578 (Block Corruption) 是出現頻率最高、業務影響最大的三大錯誤。本文提供從現象判斷、根因分析、SQL 診斷、到修復與預防的完整閉環流程。

一、ORA-01650:Rollback Segment 表空間不足

現象

ORA-01650: unable to extend rollback segment RBS_01 by 128 in tablespace RBS_TS

根因

  • 長時間大事務 (大批次 UPDATE/DELETE) 佔用大量 Undo
  • Rollback Segment 表空間 AUTOEXTEND OFF 或磁碟滿
  • 並發事務多,現有 Rollback Segment 不足

診斷 SQL

-- 1. 檢查表空間剩餘
SELECT tablespace_name, SUM(bytes)/1024/1024 free_mb
FROM dba_free_space
WHERE tablespace_name = 'RBS_TS'
GROUP BY tablespace_name;

-- 2. 檢查 Rollback Segment 爭用
SELECT class, count
FROM v$waitstat
WHERE class IN ('system undo header','system undo block','undo header','undo block');

SELECT SUM(value) total_gets
FROM v$sysstat
WHERE name IN ('db block gets','consistent gets');

-- 若 class.count / total_gets > 1% 需增加 Rollback Segment

修復方案

  1. 擴展表空間 (首選):
    ALTER TABLESPACE rbs_ts ADD DATAFILE '/u02/oradata/rbs02.dbf' SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
    
  2. 新增 Rollback Segment (9i 手動管理模式):
    CREATE ROLLBACK SEGMENT rbs_new TABLESPACE rbs_ts STORAGE (INITIAL 10M NEXT 10M MAXEXTENTS UNLIMITED);
    ALTER ROLLBACK SEGMENT rbs_new ONLINE;
    
  3. 遷移至 UNDO 表空間自動管理 (10g+ 推薦):
    ALTER SYSTEM SET undo_management = AUTO SCOPE=SPFILE;
    ALTER SYSTEM SET undo_tablespace = UNDOTBS1 SCOPE=SPFILE;
    -- 重啟生效
    

二、ORA-01652:Temp Segment 表空間不足

現象

ORA-01652: unable to extend temp segment by 207381 in tablespace TEMP

根因

  • 大排序 (ORDER BY/GROUP BY/DISTINCT)、Hash Join、索引建立溢寫到磁碟
  • 臨時表空間 AUTOEXTEND OFF 或單一 Tempfile 達上限 (32GB/64GB 視 block size)
  • 臨時段碎片化,無連續大塊可用

診斷 SQL

-- 1. 臨時表空間免費空間分布
SELECT file_id, block_id, blocks, bytes/1024/1024 free_mb
FROM dba_free_space
WHERE tablespace_name = 'TEMP'
ORDER BY bytes DESC;

-- 2. 當前排序用量
SELECT username, sql_id, tablespace, blocks*8192/1024/1024 sort_mb
FROM v$sort_usage
ORDER BY sort_mb DESC;

修復方案

  1. 新增/擴展 Tempfile:
    ALTER TABLESPACE temp ADD TEMPFILE '/u03/oradata/temp02.dbf' SIZE 5G AUTOEXTEND ON NEXT 500M MAXSIZE 32G;
    
  2. 調整用戶臨時表空間 (分流):
    ALTER USER app_user TEMPORARY TABLESPACE temp2;
    
  3. 優化 SQL 減少磁碟排序:增加 PGA_AGGREGATE_TARGET、建立適當索引避免全表掃描排序

三、ORA-01578:數據塊損壞 (Block Corruption)

現象

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

根因分類

  1. 硬體 I/O 錯誤 (磁碟壞軌、控制器故障)
  2. OS/檔案系統層面損壞
  3. 記憶體/ECC 錯誤寫入
  4. 非格式化塊被讀取

分級修復流程

步驟 1:定位損壞對象

SELECT owner, segment_name, segment_type
FROM dba_extents
WHERE file_id = 4
  AND 12345 BETWEEN block_id AND block_id + blocks - 1;

步驟 2:按對象類型處理

對象類型處理方式
INDEXALTER INDEX idx_name REBUILD ONLINE; (最簡單、無數據損失)
TABLE見步驟 3
SYS 字典 / ROLLBACK / SYSTEM 表空間**立即開 SR 聯繫 Oracle Support**,勿自行嘗試

步驟 3:表塊損壞深度處理

  1. 驗證損壞性質 (多執行 2-3 次):
    ANALYZE TABLE corrupted_tbl VALIDATE STRUCTURE CASCADE;
    
    • 同樣錯誤參數 → **永久性物理/邏輯壞塊**
    • 不同參數 → 可能為記憶體/暫時性錯誤
  2. 有備份:RMAN BLOCKRECOVER 或 Tablespace Point-in-Time Recovery (TSPITR)
  3. 無備份/損壞非關鍵列:Event 10231 跳過壞塊導出數據 (最後手段):
    -- 1. 關庫編輯 init.ora
    event="10231 trace name context forever, level 10"
    -- 2. 啟動限制模式
    STARTUP RESTRICT;
    -- 3. 建立臨時表跳過壞塊
    CREATE TABLE tmp_clean AS SELECT * FROM corrupted_tbl;
    -- 4. 移除 event 重啟,重命名表、重建索引/權限
    

四、預防體系建設

  1. 啟用 DB_BLOCK_CHECKSUM=FULL, DB_BLOCK_CHECKING=MEDIUM/FULL (11g+ 預設開啟)
  2. RMAN 定期 VALIDATE DATABASE:BACKUP VALIDATE CHECK LOGICAL DATABASE; 每週執行
  3. 硬體層 RAID 10 + 定期巡檢、OS 層檔案系統一致性檢查
  4. 表空間監控告警:免費空間 < 15% 或最大連續自由區 < 下一 Extent 即告警

五、總結

三大高頻錯誤核心對策:**Rollback/Temp 空間「監控+自動擴展+遷移自動管理」;壞塊「RMAN Validate 早發現、Index Rebuild 快修復、字典損壞找 Oracle」**。建立標準化 Runbook,讓值班 DBA 15 分鐘內完成定位與初步修復。

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