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

Oracle 常見錯誤代碼深度解析(一):ORA-01650 回滾段擴展失敗與 ORA-01652 臨時段擴展失敗

     編輯:Oracle 資料庫相關知識

ORA-01650: Unable to Extend Rollback Segment

錯誤全文

ORA-01650: unable to extend rollback segment NAME by NUM in tablespace NAME

產生原因

用戶執行大批量 DML(大量 INSERT/UPDATE/DELETE),產生大量 UNDO,導致回滾段表空間可用空間耗盡,無法分配新擴展。這是 DBA 最常見的空間類錯誤之一。

解決方案

  1. 緊急擴容(立即生效,無需停機):
    ALTER TABLESPACE rbs_tbs ADD DATAFILE '/path/rbs02.dbf' SIZE 2G;

    可一次添加多個文件,根據裸設備剩餘空間決定大小。

  2. 檢查剩餘空間:
    SELECT tablespace_name, SUM(bytes)/1024/1024 MB_FREE
    FROM dba_free_space
    WHERE tablespace_name = 'RBS_TBS'
    GROUP BY tablespace_name;
  3. 監控回滾段爭用(判斷是否需增加回滾段數量):
    -- 等待統計
    SELECT class, count
    FROM v$waitstat
    WHERE class IN ('system undo header','system undo block','undo header','undo block');
    
    -- 總訪問量
    SELECT SUM(value) FROM v$sysstat WHERE name IN ('db block gets','consistent gets');
    
    -- 若任一 class count / 總訪問量 > 1%,建議增加回滾段
  4. 長期規劃:遷移至 自動 UNDO 管理(UNDO_MANAGEMENT=AUTO + UNDO_TABLESPACE),由 Oracle 自動調整回滾段大小與數量,徹底消除手工管理痛點。

英文原文

Cause: Failed to allocate extent from the rollback segment in tablespace
Action: Use the ALTER TABLESPACE ADD DATAFILE statement to add one or more files to the specified tablespace.

ORA-01652: Unable to Extend Temp Segment

錯誤全文

ORA-01652: unable to extend temp segment by NUM in tablespace NAME

產生原因

排序、哈希連接、創建索引、全表掃描等操作需要臨時段空間,但臨時表空間(或用戶臨時表空間)無足夠連續空間。Oracle 傾向分配連續擴展,碎片化嚴重時即使總空閒足夠也會報錯。

解決方案

  1. 查看臨時表空間碎片分布:
    SELECT file_id, block_id, blocks, bytes
    FROM dba_free_space
    WHERE tablespace_name = 'TEMP_TBS'
    ORDER BY file_id, block_id;

    關注最大連續空閒塊是否滿足報錯需求的 NUM(以塊為單位)。

  2. 檢查表空間默認存儲參數**:
    SELECT initial_extent, next_extent, min_extents, pct_increase
    FROM dba_tablespaces
    WHERE tablespace_name = 'TEMP_TBS';

    若 NEXT 過小導致大量微小擴展,加劇碎片。

  3. 調整默認存儲參數**:
    ALTER TABLESPACE temp_tbs DEFAULT STORAGE (INITIAL 10M NEXT 10M PCTINCREASE 0);

    現代最佳實踐:本地管理臨時表空間 + UNIFORM SIZE,完全避免碎片:

    CREATE TEMPORARY TABLESPACE temp2 TEMPFILE '/path/temp2.dbf' SIZE 5G
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 10M;
  4. 修改用戶臨時表空間**:
    ALTER USER app_user TEMPORARY TABLESPACE temp2;
  5. 添加臨時文件**(立即生效):
    ALTER TABLESPACE temp_tbs ADD TEMPFILE '/path/temp02.dbf' SIZE 2G AUTOEXTEND ON NEXT 1G MAXSIZE 10G;

關鍵提示

  • ALTER TABLESPACE ... ADD DATAFILE/TEMPFILE 完成即可使用,無需離線表空間或重啟
  • 一旦添加數據/臨時文件,**無法單獨刪除文件**,只能刪除整個表空間
  • 臨時表空間建議掛載在高速存儲(SSD/NVMe)且啟用 UNIFORM SIZE

示例

ORA-01652: unable to extend temp segment by 207381 in tablespace TEMPSPACE
-- 207381 塊 × 8K = ~1.6GB 連續空間需求,典型大排序/哈希連接場景

英文原文

Cause: Failed to allocate extent for temp segment in tablespace
Action: Use the ALTER TABLESPACE ADD DATAFILE statement to add one or more files to the specified tablespace or create the object in another tablespace.

總結對比

維度ORA-01650ORA-01652
段類型回滾段 (UNDO)臨時段 (SORT/HASH/INDEX)
觸發操作大事務 DML大排序/哈希連接/建索引
表空間類型永久表空間 (回滾段專用)臨時表空間 / 用戶臨時表空間
核心解決加數據文件 / 遷移自動 UNDO加臨時文件 / 改本地管理 UNIFORM SIZE
長期治理UNDO_MANAGEMENT=AUTO本地管理臨時表空間 + 適當 UNIFORM SIZE

最佳實踐建議

  1. 所有新建庫啟用 UNDO_MANAGEMENT=AUTO,廢棄手工回滾段
  2. 臨時表空間統一使用 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 10M~100M
  3. 建立空間監控告警:表空間使用率 > 80% 觸發擴容工單
  4. 定期運行 DBMS_SPACE_ADMIN.TABLESPACE_FIX_SEGMENT_STATES 修復位圖異常
  5. 大批量操作前預估臨時/UNDO 空間,預先擴容
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved