本文介绍在 Linux 系统中, 如何利用crontab去定时重复执行一个程序, 包括oracle sql等.
本文介绍在 Linux 系统中, 如何利用crontab去定时重复执行一个程序, 包括oracle sql等.
关键词: crontab Linux 定时 oracle 脚本
例如一个很常见的用户需求:
定时在oracle数据库中查询一些数据,写入到操作系统文件中.
这个需求分解为以下三个步聚:
一、定时
二、执行操作系统脚本
三、执行数据查询,写文件
在实现这个需求时要用逆序的方法
1. 写一个查询/写文件的 sql 脚本(带参数执行)。
2. 写一个调用 sql 脚本的 shell 脚本。
3. 实现 shell 脚本的定时执行。
具体实现如下:
1. 写 sql 脚本 ss.sql :
::::::::::::::
ss.sql
::::::::::::::
set heading off
set pagesize 0
set linesize 300
SET trimspool ON
set feedback off
set echo off
spool &1
select * from regionalism WHERE ROWNUM<10;
spool off
SET trimspool off
set heading ON
set pagesize 100
set linesize 300
set feedback ON
set echo ON
exit
2. 写shell 脚本 ss.sh, 调用ss.sql
::::::::::::::
ss.sh
::::::::::::::
RQ=`date +%y%m%d%T`
echo $RQ >>/home/oracle/ss.log
FILE=/home/oracle/$RQ.txt
echo $FILE >>/home/oracle/ss.log
sqlplus cidb/cidb@ciis @ss.sql $FILE
filename=$RQ_tabname.his
# 此处可添加操作系统命令
exp username/pwd@cctv files=filename tables=tabname partiton=month
exp username/pwd@cctv files=filename tables=tabname sql="where no=110"
# 再执行收尾 SQL
sqlplus cidb/cidb@ciis @ss01.sql $FILE
# sql文件可包括如下内容:
alter TABLE ... drop partition
delete from tabname where ....;
注:RQ=`date +%y%m%d%T` 中的“`”在键盘左上角的“ESC”键下面。
以上二个脚本在oracle用户下测试通过后,继续以下操作。
3. 实现定时执行
3.1 生成 oracle 用户的 crontab 文件
在操作系统下,登录 oracle 用户,
crontab -e
写入以下内容,要根据现场的位置进行修改。
NLS_LANG=Simplified Chinese_china.ZHS32GB18030
ORACLE_SID=ciis
ORACLE_BASE=/opt/oracle
PATH=$PATH:/opt/oracle/ora92/bin:/home/oracle/bin:/home/oracle/bin
LANG=zh_CN.GB18030
LANGUAGE=zh_CN.GB18030:zh_CN.GB2312:zh_CN
ORA_NLS33=/opt/oracle/ora92/ocommon/nls/admin/data
ORACLE_HOME=/opt/oracle/ora92
SHELL=/bin/bash
MAILTO=oracle
HOME=/home/oracle
# run shell
1 * * * * /home/oracle/ss.sh
保存退出。
OK!完成。
注:
1 * * * * /home/oracle/ss.sh
分,时,日,月,周
此定时为小时的第一分钟执行。
如
要定时为 2 分钟执行一次:
0-59/2 * * * * /home/oracle/ss.sh
或
1-59/2 * * * * /home/oracle/ss.sh
每天上午10点1分执行:
1 10 * * * /home/oracle/backupInFile.sh