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

PL/SQL 實現 Oracle 任務調度與閃回查詢:DBMS_JOB 與 DBMS_FLASHBACK 實戰

     編輯:MySQL 資料庫相關知識

Oracle 內建 DBMS_JOB(任務調度)與 DBMS_FLASHBACK(閃回查詢)兩大包,分別解決「周期性自動執行」與「誤操作數據恢復」兩大經典痛點。本文系統講解配置、API、實戰場景與遷移建議。

一、DBMS_JOB:傳統任務調度(10g/11g 主流,12c+ 建議遷移至 DBMS_SCHEDULER)

初始化參數(需 DBA 權限修改 spfile/初始化文件並重啟)

JOB_QUEUE_PROCESSES = 10    -- 啟動的後台作業進程數,0 表示禁用調度
JOB_QUEUE_INTERVAL = 60     -- 每進程檢查新作業的間隔秒數,作業最小執行間隔

核心 API:SUBMIT 提交作業

VARIABLE v_jobno NUMBER;
BEGIN
    DBMS_JOB.SUBMIT(
        job       => :v_jobno,           -- OUT: 分配的作業號
        what      => 'MY_PKG.DAILY_CLEANUP;',  -- 要執行的 PL/SQL 塊(以分號結尾)
        next_date => SYSDATE,            -- 首次執行時間
        interval  => 'SYSDATE + 1'       -- 重複間隔表達式(每天)
    );
    COMMIT;  -- 必須提交才生效
END;
/
PRINT v_jobno;

常用間隔表達式

管理命令

-- 查看用戶作業
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)」,後續該會話所有查詢自動訪問該時刻的數據快照,不修改當前數據,極其安全。

關鍵程序

需求INTERVAL 表達式
每天凌晨 2 點TRUNC(SYSDATE+1) + 2/24
每小時SYSDATE + 1/24
每周一 3:30NEXT_DAY(TRUNC(SYSDATE), 'MONDAY') + 3.5/24
每月 1 號ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1)

實戰:恢復誤刪除的員工記錄

-- 場景: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;
/

四、總結與選型建議

程序作用參數
ENABLE_AT_TIME啟用閃回模式,指定查詢時間點query_time IN TIMESTAMP 或 query_scn IN NUMBER
ENABLE_AT_SYSTEM_CHANGE_NUMBER按 SCN 啟用query_scn IN NUMBER
DISABLE關閉閃回模式,恢復當前數據視圖無

掌握 DBMS_JOB 維護存量、DBMS_SCHEDULER 構建增量、DBMS_FLASHBACK 守護數據安全,構成 Oracle DBA 任務調度與數據恢復的核心技能組合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景推薦方案理由
舊系統維護 (10g/11g)DBMS_JOB兼容性、零改動
新系統/升級 (12c+)DBMS_SCHEDULER功能完整、事件驅動、雲原生、Enterprise Manager 圖形化管理
誤操作秒級恢復DBMS_FLASHBACK會話級、只讀、無鎖、無日誌、安全無副作用
表級/庫級時間點恢復Flashback Table / Flashback DatabaseDDL 級恢復、需啟用閃回日誌、影響範圍大
跨庫異構調度外部調度器 (Control-M, Airflow, K8s CronJob)統一編排、可視化、多平台