在Ubuntu上配置Oracle定時任務主要有兩種方式:通過Oracle內置的DBMS_SCHEDULER
(數據庫級定時任務)和通過Ubuntu的cron
(操作系統級定時任務)。以下是詳細步驟及注意事項:
適用于需要在數據庫內部定期執行PL/SQL代碼、存儲過程或SQL腳本的場景,無需依賴操作系統環境。
使用sqlplus
工具以具有足夠權限(如SYSDBA
或擁有CREATE JOB
權限的用戶)登錄數據庫:
sqlplus username/password@database_name
通過DBMS_SCHEDULER.CREATE_JOB
過程創建作業,示例如下:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'daily_backup_job', -- 作業名稱(唯一標識)
job_type => 'PLSQL_BLOCK', -- 作業類型(PL/SQL塊)
job_action => 'BEGIN my_package.my_procedure; END;', -- 要執行的PL/SQL代碼
start_date => SYSTIMESTAMP, -- 啟動時間(立即啟動)
repeat_interval => 'FREQ=DAILY; BYHOUR=0; BYMINUTE=0; BYSECOND=0', -- 重復間隔(每天午夜)
enabled => TRUE, -- 是否啟用
comments => 'Daily database backup job' -- 備注
);
END;
/
job_name
:自定義作業名稱,避免與現有作業沖突。job_type
:常見類型包括PLSQL_BLOCK
(PL/SQL塊)、STORED_PROCEDURE
(存儲過程)、EXECUTABLE
(操作系統命令)。repeat_interval
:使用Oracle的調度語法(如FREQ=WEEKLY; BYDAY=MON
表示每周一執行)。SELECT job_name, enabled, state, repeat_interval FROM DBA_SCHEDULER_JOBS;
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => 'daily_backup_job',
attribute => 'repeat_interval',
value => 'FREQ=WEEKLY; BYDAY=MON,FRI' -- 改為周一、周五執行
);
END;
/
BEGIN
DBMS_SCHEDULER.DROP_JOB(job_name => 'daily_backup_job', force => TRUE);
END;
/
CREATE JOB
、MANAGE SCHEDULER
等必要權限(可通過GRANT CREATE JOB TO username;
授權)。DBA_SCHEDULER_JOB_RUN_DETAILS
視圖查看(如SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE job_name = 'DAILY_BACKUP_JOB';
)。適用于需要通過操作系統調度執行Oracle相關腳本(如數據泵導出、備份、日志清理等)的場景,依賴Shell腳本和Oracle環境變量。
創建執行Oracle操作的Shell腳本(如/home/oracle/scripts/oracle_backup.sh
),并添加以下內容:
#!/bin/bash
# 設置Oracle環境變量(根據實際路徑調整)
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_SID=ORCLCDB
export PATH=$ORACLE_HOME/bin:$PATH
# 執行Oracle數據泵導出(示例)
expdp system/password@ORCLCDB schemas=test directory=backdir dumpfile=backup_$(date +%Y%m%d).dmp logfile=backup_$(date +%Y%m%d).log
# 壓縮并清理舊備份(保留7天)
tar -zcvf /backup/full/backup_$(date +%Y%m%d).tar.gz /backup/full/*.dmp /backup/full/*.log --remove-files
find /backup/full -type f -mtime +7 -exec rm {} \;
ORACLE_HOME
、ORACLE_SID
、PATH
環境變量,否則expdp
、sqlplus
等命令無法識別。chmod +x /home/oracle/scripts/oracle_backup.sh
使用crontab
命令編輯當前用戶的定時任務(如需root權限,用sudo crontab -e
):
crontab -e
添加以下行(每天凌晨2點執行腳本,并將輸出重定向到日志文件):
0 2 * * * /home/oracle/scripts/oracle_backup.sh >> /var/log/oracle_backup.log 2>&1
0 2 * * *
:表示每天凌晨2點(分鐘=0,小時=2,日期、月份、星期幾均為*
,即任意值)。>> /var/log/oracle_backup.log 2>&1
:將腳本的標準輸出和錯誤輸出追加到日志文件(便于排查問題)。crontab -l
sudo systemctl status cron
tail -f /var/log/oracle_backup.log
/etc/crontab
中全局設置)。oracle
)有權限訪問Oracle數據庫、腳本文件及備份目錄。echo "$(date): Backup started" >> /var/log/oracle_backup.log
),便于監控任務執行情況。DBMS_SCHEDULER
,管理便捷且與數據庫集成度高。cron
,靈活性強且適用于跨數據庫操作。