LINUX定时执行含有DB2存储过程的SHELL脚本
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LINUX下定时执行含有DB2存储过程的SHELL脚本
最近项目要求将某些表中的数据转移到历史数据表中,并将成功转移后的数据在生产系统中删除,并且要求每天凌晨1:00定时执行脚本。这是我第一次写这样的脚本程序,现将整个编写过程或步骤记录如下,希望能对有类似需求的人所有帮助,由于本人也是刚接触DB2数据库和shell脚本,错误之处还请见谅。测试服务器的操作系统是Redhat,数据库产品:DB2(10.1版本),转移数据是在DB2存储过程中实现的,下面分几个步骤进行叙述。
一、编写DB2存储过程
1》编写存储过程
具体代码见表格1,将其中的代码形成一个sql文件,文件名为dataHandle.sql CREATE OR REPLACE PROCEDURE test_schema.dataHandle(in t_Id INT)--in表示输入参数
RESULT SETS 1 --返回结果为1个
LANGUAGE SQL
P1: BEGIN ATOMIC --ATOMIC为了使P1和END P1之间形成一个事务,要么同时成功,要么同时失败
declare tIdINT; --声明变量
set tId=t_Id; --赋值变量
IF tId> 0 THEN --判断
insert into TEST_SCHEMA.TEST_HISTORY(t_Id,t_name)
select t_Id,t_name
from TEST_SCHEMA.TM_ASM_FLTSCH where where t_Id=tId; --转移数据
delete from TEST_SCHEMA.TM_ASM_FLTSCH where t_Id=tId; --删除数据
END IF;
END P1
@ --@这里是必须的
表1
2》部署存储过程到指定数据库
a)连接数据库
切换到数据库用户下执行命令:db2 connect to Dbname
或者不切换用户执行命令:db2 connect to Dbname user Username using ******
b)部署1》中写好的存储过程
执行命令:db2 -td@ -vf dataHandle.sql
或者使用datastudio进行部署,具体流程如下:
最后点击Finish即可。
二、编写SHELL脚本
该脚本的代码见表2,主要功能是:将表test中90天之前的数据转移到test_history表中,并将表test中已被转移的数据删除掉,并对表test,test_history进行重组,使表中的索引及时生效。脚本文件名为cronTransData.sh,其中获取主键值时,是将符合查询条件的所有主键都输出到文件re.txt中,之后逐行读取该文件中的主键值,并在循环中逐个处理(循环调用存储过程)。
#!/bin/sh
#load db2 environment variables
. /home/db2inst1/.profile #加载DB2 数据的环境变量
startTime=`date +%s` #获取当前时间戳
#transfer data(90 days before) to history table
outDate=`date -d -90day +%Y-%m-%d` #获取当前日期90天之前的日期db2 connect to Dbname #连接数据库
#fetch the primary key values of transfered data into re.txt file.
db2 "select t_Id from test_schema.test where to_date<='$outDate'" > re.txt; #将90天之前的数据的主键值输出到文件re.txt中
db2 terminate #终止数据库连接,释放链接资源
#read re.txt file to fetch fltschId's value
cat re.txt|grep '[\s0-9\s]$'|while read tId #从上面的输出文件中提取只含数字和空格的行(只读取主键值)
do #循环执行
db2 connect to seat
#call store procefure to complete data transfer
db2 "call test_schema.dataHandle('$tId')" #调用上面部署成功的存储过程db2 terminate;
done
runstats on table test_schema.test and index all; #整理一下表
runstats on table test_schema.test_history and index all;
endTime=`date +%s` #运行结束时间
spendTime=$((endTime-startTime)) #整个过程消耗的时间
echo 'Spent total time:'$spendTime 's' #打印总消耗,时间单位为秒
表2
三、编写crontab定时脚本
编写定时脚本,脚本名为db2inst1,脚本中的内容为:
* 1 * * * . /opt/yourdir/cronTransData.sh>>/opt/yourdir/tranLog
在crontab脚本所在的目录下,执行crontab db2inst1(crontab脚本名),即可。
总结,上面的脚本稍作改动即可在AIX(unix)系统上运行,希望能帮助看到此文档的同学,我这里只是一个比较简单的定时脚本,抛砖引玉吧,后期还会进行丰富和更新。