大批次對帳程序執行至中途失敗,錯誤為 ORA-01562: failed to extend rollback segment number 12、ORA-01628: max # extents (505) reached for rollback segment RBS12。本文提供從臨時紓解到根本優化的完整處理步驟。
回滾段 RBS12 的 MAXEXTENTS 達上限(505),無法再擴展區塊滿足長交易需求。系統有 20 多個回滾段,但大交易未指定使用大回滾段,導致小回滾段耗盡。
ALTER TABLESPACE RBS ADD DATAFILE
'/opt/oracle/db02/oradata/ORCL/rbs02.dbf'
SIZE 8192M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;
ALTER ROLLBACK SEGMENT APPRBS STORAGE (MAXEXTENTS UNLIMITED);
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_MANAGEMENT=AUTO 並設定 UNDO_TABLESPACE、UNDO_RETENTION,由資料庫自動管理DBA_ROLLBACK_SEGS 或 V$UNDOSTAT 監控腳本,極限值 80% 即告警手動回滾段管理已成歷史,儘早遷移至自動 UNDO 管理才是根本之道。