DBA 日常運維中,ORA-01650 (Rollback Segment)、ORA-01652 (Temp Segment)、ORA-01578 (Block Corruption) 是出現頻率最高、業務影響最大的三大錯誤。本文提供從現象判斷、根因分析、SQL 診斷、到修復與預防的完整閉環流程。
ORA-01650: unable to extend rollback segment RBS_01 by 128 in tablespace RBS_TS
AUTOEXTEND OFF 或磁碟滿-- 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
ALTER TABLESPACE rbs_ts ADD DATAFILE '/u02/oradata/rbs02.dbf' SIZE 2G AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
CREATE ROLLBACK SEGMENT rbs_new TABLESPACE rbs_ts STORAGE (INITIAL 10M NEXT 10M MAXEXTENTS UNLIMITED);
ALTER ROLLBACK SEGMENT rbs_new ONLINE;
ALTER SYSTEM SET undo_management = AUTO SCOPE=SPFILE;
ALTER SYSTEM SET undo_tablespace = UNDOTBS1 SCOPE=SPFILE;
-- 重啟生效
ORA-01652: unable to extend temp segment by 207381 in tablespace TEMP
AUTOEXTEND OFF 或單一 Tempfile 達上限 (32GB/64GB 視 block size)-- 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;
ALTER TABLESPACE temp ADD TEMPFILE '/u03/oradata/temp02.dbf' SIZE 5G AUTOEXTEND ON NEXT 500M MAXSIZE 32G;
ALTER USER app_user TEMPORARY TABLESPACE temp2;
PGA_AGGREGATE_TARGET、建立適當索引避免全表掃描排序ORA-01578: Oracle data block corrupted (file # 4, block # 12345)
SELECT owner, segment_name, segment_type
FROM dba_extents
WHERE file_id = 4
AND 12345 BETWEEN block_id AND block_id + blocks - 1;
| 對象類型 | 處理方式 |
|---|---|
| INDEX | ALTER INDEX idx_name REBUILD ONLINE; (最簡單、無數據損失) |
| TABLE | 見步驟 3 |
| SYS 字典 / ROLLBACK / SYSTEM 表空間 | **立即開 SR 聯繫 Oracle Support**,勿自行嘗試 |
ANALYZE TABLE corrupted_tbl VALIDATE STRUCTURE CASCADE;
BLOCKRECOVER 或 Tablespace Point-in-Time Recovery (TSPITR)-- 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 重啟,重命名表、重建索引/權限
BACKUP VALIDATE CHECK LOGICAL DATABASE; 每週執行三大高頻錯誤核心對策:**Rollback/Temp 空間「監控+自動擴展+遷移自動管理」;壞塊「RMAN Validate 早發現、Index Rebuild 快修復、字典損壞找 Oracle」**。建立標準化 Runbook,讓值班 DBA 15 分鐘內完成定位與初步修復。