| 需求 | INTERVAL 表達式 |
| 每天凌晨 2 點 | TRUNC(SYSDATE+1) + 2/24 |
| 每小時 | SYSDATE + 1/24 |
| 每周一 3:30 | NEXT_DAY(TRUNC(SYSDATE), 'MONDAY') + 3.5/24 |
| 每月 1 號 | ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1) |
管理命令
-- 查看用戶作業
SELECT JOB, WHAT, NEXT_DATE, INTERVAL, BROKEN FROM USER_JOBS;
-- 修改作業(如變更執行內容)
EXEC DBMS_JOB.CHANGE(123, 'MY_PKG.NEW_LOGIC;');
-- 移除作業
EXEC DBMS_JOB.REMOVE(123);
-- 強制立即執行一次
EXEC DBMS_JOB.RUN(123);
-- 標記/取消標記損壞(停用/啟用)
EXEC DBMS_JOB.BROKEN(123, TRUE); -- 停用
EXEC DBMS_JOB.BROKEN(123, FALSE); -- 啟用
二、DBMS_FLASHBACK:閃回查詢恢復誤刪/誤改數據
核心原理
Oracle 通過 Undo 段保留歷史版本,DBMS_FLASHBACK 允許會話級設置「查詢時間點(SCN 或 Timestamp)」,後續該會話所有查詢自動訪問該時刻的數據快照,不修改當前數據,極其安全。
關鍵程序
| 程序 | 作用 | 參數 |
ENABLE_AT_TIME | 啟用閃回模式,指定查詢時間點 | query_time IN TIMESTAMP 或 query_scn IN NUMBER |
ENABLE_AT_SYSTEM_CHANGE_NUMBER | 按 SCN 啟用 | query_scn IN NUMBER |
DISABLE | 關閉閃回模式,恢復當前數據視圖 | 無 |
實戰:恢復誤刪除的員工記錄
-- 場景:10:00 誤執行 DELETE FROM EMP WHERE DEPTNO=10,需恢復
-- 步驟 1:確定誤操作前時間點(如 09:55)
DECLARE
v_scn NUMBER;
BEGIN
-- 獲取 09:55 對應的 SCN(或直接用 TIMESTAMP)
v_scn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER; -- 當前 SCN,實際需查閱歷史映射
-- 啟用閃回
DBMS_FLASHBACK.ENABLE_AT_TIME(TIMESTAMP '2024-01-15 09:55:00');
-- 查詢被刪數據(此時看到 09:55 的快照)
INSERT INTO EMP_RECOVERY
SELECT * FROM EMP WHERE DEPTNO = 10;
-- 關閉閃回,恢復正常會話
DBMS_FLASHBACK.DISABLE;
COMMIT;
END;
/
-- 步驟 2:驗證恢復數據
SELECT * FROM EMP_RECOVERY;
關鍵限制:閃回查詢依賴 Undo 保留時間(UNDO_RETENTION 參數,默認 900 秒)。若誤操作超過保留窗口,Undo 已被覆蓋,無法閃回。生產庫建議設置 UNDO_RETENTION = 86400 (1天) 並保證 Undo 表空間足夠大。
三、現代替代:DBMS_SCHEDULER (10gR2+ 推薦)
DBMS_JOB 為舊版調度器,功能受限(無事件驅動、無鏈式依賴、無資源管理、無遠程外部作業)。12c+ 新項目強制使用 DBMS_SCHEDULER。
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'DAILY_CLEANUP_JOB',
job_type => 'STORED_PROCEDURE',
job_action => 'MY_PKG.DAILY_CLEANUP',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0', -- Calendaring 語法
enabled => TRUE,
comments => '每日清理過期數據',
auto_drop => FALSE
);
END;
/
-- 事件驅動示例:文件到達觸發
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'FILE_WATCHER_JOB',
job_type => 'EXECUTABLE',
job_action => '/app/scripts/process_file.sh',
event_condition => 'tab.user_data.file_size > 1000',
queue_spec => 'FILE_WATCH_Q',
enabled => TRUE
);
END;
/
四、總結與選型建議
| 場景 | 推薦方案 | 理由 |
| 舊系統維護 (10g/11g) | DBMS_JOB | 兼容性、零改動 |
| 新系統/升級 (12c+) | DBMS_SCHEDULER | 功能完整、事件驅動、雲原生、Enterprise Manager 圖形化管理 |
| 誤操作秒級恢復 | DBMS_FLASHBACK | 會話級、只讀、無鎖、無日誌、安全無副作用 |
| 表級/庫級時間點恢復 | Flashback Table / Flashback Database | DDL 級恢復、需啟用閃回日誌、影響範圍大 |
| 跨庫異構調度 | 外部調度器 (Control-M, Airflow, K8s CronJob) | 統一編排、可視化、多平台 |
掌握 DBMS_JOB 維護存量、DBMS_SCHEDULER 構建增量、DBMS_FLASHBACK 守護數據安全,構成 Oracle DBA 任務調度與數據恢復的核心技能組合。
- 上一篇文章: SQL Server 精準測量語句執行時間:毫秒級計時模板
- 下一篇文章: Oracle 高 CPU 消耗診斷實戰:vmstat 定位、SQL 追蹤、執行計劃分析與綁定變量優化
Copyright ©
程式碼之家 All Rights Reserved