在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,灵活性强且适用于跨数据库操作。