一 日常运维过程中是如何定期删除归档日志的呢?
对于定期删归档,比较普遍的做法是是使用操作系统的crontab或者windows的任务计划功能来调用删归档脚本,今天小编给大家带来一种使用oracle的Scheduler来调用清归档脚本以实现定期清理归档文件的方法。
Oracle在10g开始就提供了Scheduler来管理定时任务,这是一个企业作业调度程序,可以帮助您简化成百上千个任务的调度。Oracle调度器(Scheduler)由DBMS_Scheduler PL/SQL包中的过程和函数实现。Scheduler帮助您有效地管理和计划任务。确保许多例行任务在没有人工干预的情况下执行,有效降低操作成本,实现更可靠的管理,最大限度地减少人为错误。它可以执行任何类型的脚本(例如:PL/SQL、OS shell脚本、第三方程序等等)。在RAC),可以指定作业应在哪个数据库节点上运行,参数项instance_id。
下面我们以删除归档日志为例,来使用Scheduler。
01 前期数据库环境设置
# 修改externaljob.ora属性
#cd $ORACLE_HOME/rdbms/admin/
#chown root externaljob.ora
#chmod 640 externaljob.ora
# 修改extjob属性
#cd $ORACLE_HOME/bin
#chmod 4750 extjob
# 修改externaljob.ora文件内容
run_user = oralce #oralce用户名
eun_group = oinstall #oralce用户组
02 准备一个删除归档脚本
#!/bin/bash
export ORACLE_HOME=/oralce/app/product/11.2.0/db_1
export ORACLE_SID=ora11g1
$ORACLE_HOME/bin/rman target/<EOF
crosscgeck archivelog all;
delete noprompt archivelog until time 'sysdate-7';
exit;
##注意:脚本中必须使用绝对路径,你要的环境变量必须指定,且脚本必须拥有执行权限
03 给执行Scheduler的用户赋权
SQL> grant scheduler_admin to username;
SQL> grant manage scheduler to username;
SQL> grant create job to username;
04 在数据库创建一个program
begin
db_ms_sheduler.create_program
(
peogram_name =>'DEL_ARCS',
program_type =>'EXECUTABLE',
program_action=>'/home/oracle/delarch.sh',
enabled =>TRUE,
comments =>'delete Archived Logs'
);
end;
我们创建一个在每天凌晨一点运行一次的任务计划,该计划的名称为 'EVERY_DAY_1_00。
06 创建一个job 来调用之前创建的程序及计划
begin
dbms_scheduler.create_job
(
job_name =>'ARC_DEL',
peogram_nmae=>'DEL_ARCS',
schedule_name=>'EVERY_DAY_1_00',
comments =>'Del Archived Logs',
enabled =>TRUE
);
end;
07 如何更改Scheduler属性设置
使用
SET_ATTRIBUTE与SET_SCHEDULER_ATTRIBUTE
存储过程来更改设置。
例如,我们将该计划的执行节点改为2检点:
SQL> exec DBMS_SCHEDULER.SET_ATTRIBUTE (name=>'ARC_DEL',attribute=>'instance_id',value=>'2';
08 禁用,删除任务
禁用job(多个)
BEGIN
DBMS_SCHEDULER.DISABLE('job1,job2,job3,sys,jobclass1,sys,jobclass2');
END
删除job(多个)
BEGIN
DBMS_SCHEDULER.DROP_JOB('job1,job3,sys,jobclass1,sys,jobclass2');
END
09 设置查看记录日志
设置日志:
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE('ARC_DEL','logging_level',
DBMS_SCHEDULER.LOGGING_FALLED_RUNS);
END;
查看日志记录:
select to_char(log_date,'DD_MON_YY HH24:MI:SS') TIMESTAMP, job_name,status, SUBSTR(additional_info,1,40) ADDITIONAL_INFO
from user_acheduler_job_run_delails oder by log_date;
oralce的Scheduler(任务计划),相对于oralce之前的JOB ,更加灵活易用,且支持调用shell命令或第三方程序,并提供详细的日志记录,
更为详细的用法大家可以参考以下提供的官方文档,里面包括详细的使用方法以及可能会遇到的报错及处理方法。
参考文献
DBMS_SCHEDULER FAILS WITH ORA-27369 WHEN JOB TYPE IS EXECUTABLE (Doc ID 279866.1)
https://docs.oracle.com/database/121/ARPLS/d_sched.htm#ARPLS72308
https://docs.oracle.com/database/121/ADMIN/schedadmin.htm#ADMIN12062