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

Oracle 常見錯誤代碼深度解析與解決方案:ORA-01650 / ORA-01652 表空間不足專題

     編輯:MySQL 資料庫相關知識

前言:表空間不足是 DBA 最常見的「半夜報警」

ORA-01650 (Rollback Segment) 與 ORA-01652 (Temporary Segment) 同屬「無法擴展 Segment」錯誤族,本質均為 **表空間可用連續空間耗盡**。本文深度解析兩錯誤的產生機制、診斷 SQL、臨時緩解與根治方案,並對比現代自動擴展/大文件表空間的最佳實踐。

一、ORA-01650: Unable to Extend Rollback Segment

1.1 錯誤全文


ORA-01650: unable to extend rollback segment string by string in tablespace string
Cause: Failed to allocate extent from the rollback segment in tablespace
Action: Use ALTER TABLESPACE ADD DATAFILE to add one or more files to the specified tablespace

1.2 產生機制

  • 長事務 / 大批量 DML 產生大量 Undo 數據
  • Undo 表空間 (Rollback Segment 所在) 可用空間不足、或因碎片無法分配連續 Extent
  • 預設 PCT_INCREASE 導致下一 Extent 過大,超過剩餘最大塊

1.3 診斷 SQL 工具箱


-- 1. 查看表空間剩餘空間及最大連續塊
SELECT tablespace_name, 
       SUM(bytes)/1024/1024 AS total_mb,
       MAX(bytes)/1024/1024 AS max_contiguous_mb,
       COUNT(*) AS fragments
FROM dba_free_space
GROUP BY tablespace_name;

-- 2. 檢查 Rollback Segment 狀態
SELECT segment_name, tablespace_name, status, initial_extent, next_extent, min_extents, pct_increase
FROM dba_rollback_segs;

-- 3. 監控 Undo 爭用 (若任何 wait_class 佔比 > 1% 需擴展)
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');
-- 計算: count / SUM(value) > 0.01 → 需增加 rollback segment

1.4 解決方案階梯

層級動作適用場景風險
緊急臨時ALTER TABLESPACE undo_tbs ADD DATAFILE '/path/undo02.dbf' SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE 10G;業務高峰期快速止血依賴裸設備/文件系統剩餘空間
參數調優調整 UNDO_RETENTION、UNDO_TABLESPACE、_UNDO_AUTOTUNE (隱含參數)長期優化,配合 AWR 分析需測試驗證
架構升級遷移至 **自動 Undo 管理** (10g+ 默認),啟用 **保證 Undo 保留** RETENTION GUARANTEE新建庫/重構遷移需規劃足夠空間
根治大文件表空間 BIGFILE TABLESPACE + AUTOEXTEND ON MAXSIZE UNLIMITED + 監控告警 (閾值 80%)現代標準架構單文件上限 128TB (32K block),極難滿

二、ORA-01652: Unable to Extend Temp Segment

2.1 錯誤全文


ORA-01652: unable to extend temp segment by string in tablespace string
Cause: Oracle always tries to allocate contiguous space; fails when insufficient or fragmented
Action: Add datafile to tablespace, or increase PCT_INCREASE / reduce sort/join memory

2.2 產生場景

  • 大排序 (ORDER BY、GROUP BY、DISTINCT)、Hash Join、索引創建、物化視圖刷新
  • 臨時表空間 (TEMP) 空間不足或碎片化嚴重
  • PCT_INCREASE 非 0 導致 Extent 指數增長,快速耗盡空間

2.3 診斷與緩解


-- 1. 檢查臨時表空間使用情況
SELECT tablespace_name, 
       SUM(bytes_used)/1024/1024 AS used_mb,
       SUM(bytes_free)/1024/1024 AS free_mb,
       ROUND(SUM(bytes_used)/SUM(bytes_alloc)*100,2) AS pct_used
FROM v$temp_space_header
GROUP BY tablespace_name;

-- 2. 查找佔用 Temp 空間最大的會話
SELECT s.sid, s.serial#, s.username, s.sql_id, u.tablespace, u.segtype, u.blocks*8192/1024/1024 AS mb
FROM v$session s
JOIN v$tempseg_usage u ON s.saddr = u.session_addr
ORDER BY u.blocks DESC;

-- 3. 臨時擴容
ALTER TABLESPACE temp ADD TEMPFILE '/path/temp02.dbf' SIZE 4G AUTOEXTEND ON NEXT 100M MAXSIZE 20G;

-- 4. 會話級調優 (避免大排序落盤)
ALTER SESSION SET workarea_size_policy = AUTO;
ALTER SESSION SET pga_aggregate_target = 500M;  -- 或手動 sort_area_size/hash_area_size

2.4 現代最佳實踐:本地管理 + 統一大小 Extent + 自動擴展


-- 創建現代標準臨時表空間
CREATE BIGFILE TEMPORARY TABLESPACE temp 
TEMPFILE '/u01/oradata/ORCL/temp01.dbf' SIZE 2G 
AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
  • LOCAL EXTENT MANAGEMENT:位圖管理,無字典爭用,高並發優異
  • UNIFORM SIZE 1M:固定 Extent 大小,消除碎片、PCT_INCREASE 問題
  • BIGFILE + AUTOEXTEND UNLIMITED:單文件 128TB 上限,運維極簡

三、通用表空間容量規劃與監控體系

維度關鍵指標告警閾值自動化響應
永久表空間已用%、最大連續空闲塊、增長趨勢80% / 最大塊 < 100MAutoextend / 增加 Datafile / 分區歸檔
Undo 表空間活躍事務數、Undo 保留時間、爭用比率爭用 > 1%、保留時間不足增加 Undo 文件 / 調大 RETENTION
臨時表空間使用率、活躍排序會話、最大排序空間85%、單會話 > 2G增加 Tempfile / SQL 調優 (避免全表排序)
系統表空間SYSTEM/SYSAUX 增長90%移動 AWR/統計信息至 SYSAUX、定期清理

四、常見誤區辨析

誤區真相
「加 Datafile 就能解決所有 1650/1652」若磁盤無空間、文件系統 inode 滿、ASM 磁盤組滿,加文件同樣失敗。需全鏈路容量規劃。
「PCT_INCREASE 設置大點減少擴展次數」指數增長反而加速空間耗盡並製造碎片。現代局部管理表空間**不使用 PCT_INCREASE**,改用 UNIFORM SIZE。
「Temp 表空間滿了重啟數據庫就好」重啟僅釋放臨時段,根因 (大排序 SQL、PGA 太小、Temp 太小) 未解,必復發。
「Rollback Segment 過時概念,10g+ 不用管」10g+ 雖默認自動 Undo 管理,但仍需規劃 Undo 表空間大小、保留時間、保證保留選項,否則長查詢報 ORA-01555 (Snapshot too old)。

結語

ORA-01650/01652 看似簡單的「空間不足」,背後折射的是 **容量規劃、Extent 管理策略、SQL 調優、監控體系** 的系統工程能力。從手工 ADD DATAFILE 到 **Bigfile + Local Uniform + Autoextend + 智能監控**,是每位 DBA 成長的必經之路。記住:空間告警 80% 介入,90% 升級,100% 故障。

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