LINUX定时执行含有DB2存储过程的SHELL脚本

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)系统上运行,希望能帮助看到此文档的同学,我这里只是一个比较简单的定时脚本,抛砖引玉吧,后期还会进行丰富和更新。

相关文档
最新文档