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

解決 ORA-01562 / ORA-01628:回滾段 MAXEXTENTS 耗盡的完整處方

     編輯:Oracle 資料庫相關知識

大批次對帳程序執行至中途失敗,錯誤為 ORA-01562: failed to extend rollback segment number 12、ORA-01628: max # extents (505) reached for rollback segment RBS12。本文提供從臨時紓解到根本優化的完整處理步驟。

錯誤成因

回滾段 RBS12 的 MAXEXTENTS 達上限(505),無法再擴展區塊滿足長交易需求。系統有 20 多個回滾段,但大交易未指定使用大回滾段,導致小回滾段耗盡。

解決步驟

1. 擴充回滾段表空間

ALTER TABLESPACE RBS ADD DATAFILE 
  '/opt/oracle/db02/oradata/ORCL/rbs02.dbf' 
  SIZE 8192M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;

2. 建立/調整大回滾段

ALTER ROLLBACK SEGMENT APPRBS STORAGE (MAXEXTENTS UNLIMITED);

3. 指定大交易使用大回滾段

SQL*Plus / 單一交易:

SET TRANSACTION USE ROLLBACK SEGMENT APPRBS;
-- 執行大量 DML
COMMIT;

PL/SQL 程序內:

BEGIN
  DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('APPRBS');
  -- 大量 SQL 操作
  COMMIT;
END;

驗證與觀察

再次執行對帳程序,成功完成。執行時間較長但無錯誤。可透過以下查詢監控回滾段使用情況:

SELECT SEGMENT_NAME, TABLESPACE_NAME, STATUS, 
       INITIAL_EXTENT, NEXT_EXTENT, MAX_EXTENTS, EXTENTS
FROM DBA_ROLLBACK_SEGS
WHERE SEGMENT_NAME = 'APPRBS';

長期優化建議

  • 改用自動 UNDO 管理:Oracle 9i+ 建議棄用手動回滾段,啟用 UNDO_MANAGEMENT=AUTO 並設定 UNDO_TABLESPACE、UNDO_RETENTION,由資料庫自動管理
  • 大交易拆解:將超大批次拆分為較小單元,定期提交,減少單一交易的 UNDO 需求
  • 監控告警:設定 DBA_ROLLBACK_SEGS 或 V$UNDOSTAT 監控腳本,極限值 80% 即告警
  • 表空間預留:UNDO 表空間預留足夠空間並啟用自動擴展

手動回滾段管理已成歷史,儘早遷移至自動 UNDO 管理才是根本之道。

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