#!/bin/sh #tbdetach.sh #对特定的数据表进行分区分离及附加(DETACH/ATTACH) D/A,这里的附加表示数据处理,并不对分区进行并入 #除了月底数据外 #输入:1.操作类型 A/D X表示先D后A # 2.表名 # 3.开始日期 # 4.结束日期 #张明伟 20141029 #command:./tbdetach.sh D "PLAT_ACCPCDEPSTC PLAT_CUPIDXSTC PLAT_ACCPTDEPSTC PLAT_PCUSIDNSTC" 20130401 20140401 . $(dirname 0)/public_s.sh #pub_debug="Y"; getlogname $0; log=$pub_result; tboptype=$1; #操作类型 tabname=$2; #操作表 strdate=$3; #开始日期 enddate=$4; #结束日期 lim=10; #月底数据 pub_datatype="M"; fc_getdayebtw $strdate $enddate; mdts="$pub_result"; #echo "dts is [$dts]"; #echo "mdts is [$mdts]"; #"PLAT_ACCPCDEPSTC PLAT_CUPIDXSTC PLAT_ACCPTDEPSTC PLAT_PCUSIDNSTC" for tb in $tabname do echo >>$log; date | tee -a $log; #判断日期间隔是否大于数据库可传入的最大值(FC_SPLITSTR最大传入8000) #若大于,则对数据进行分割,限制为100个传入值 fc_datediff $strdate $enddate; datediff=$pub_result; #初使化变量sstrdate,senddate sstrdate=$strdate; senddate=$enddate; sdts=""; #echo "datediff is [$datediff] and sstrdate is [$sstrdate] and senddate is [$senddate]" #20150110改变思路,由数据库出数据,再做处理 #######大于$lim的处理,超出时间的分段处理 ######i=1; ######[ $datediff -lt $lim ] && lim=0; ######while [ $datediff -gt $lim -a $sstrdate -lt $enddate ] ######do ###### #只删除非月底数据 ###### pub_datatype="D"; #数据类型 ###### incr=$lim; ###### ###### #如果最后几个日期,不足lim,用datediff来替代incr ###### #例最后还有3天,步长是10天,则末数为3天 ###### [ $lim -eq 0 ] && incr=$datediff; ###### nextday $sstrdate $incr ;#$lim; ###### senddate=$pub_result; ###### fc_getdayebtw $sstrdate $senddate; ###### dts="$pub_result"; ###### echo "[$dts]" ###### ###### #db2cmd " SELECT RE FROM TABLE(FC_SPLITSTR('$dts',' ')) "; ###### ###### ssql="SELECT RIGHT(TRIM(a.DATAPARTITIONNAME),8) ###### FROM SYSCAT.DATAPARTITIONS a ###### WHERE a.TABNAME='$tb' ###### AND RIGHT(TRIM(a.DATAPARTITIONNAME),8) IN ###### ( ###### SELECT RE FROM TABLE(FC_SPLITSTR('$dts',' ')) ###### ) ###### WITH UR"; ###### #echo "$ssql"; ###### ###### [ $senddate -gt $enddate ] && sstrdate=$enddate; ###### ###### [ $senddate -gt $enddate ] && senddate=$enddate; ###### ###### sstrdate=$senddate; ###### nextday $sstrdate; ###### sstrdate=$pub_result; ###### ###### fc_datediff $sstrdate $enddate; ###### datediff=$pub_result; ###### ###### #如果最后日期小于限定值,则把限制值降为0,以便处理最好的几个日期值 ###### [ $datediff -lt $lim ] && lim=0; ###### #echo "datediff is [$datediff] and sstrdate is [$sstrdate] and senddate is [$enddate]" ###### echo "$ssql"; ###### db2cmd "$ssql"; ###### ###### echo [pub_sqlcode is $pub_sqlcode and pub_sqlinfo is $pub_sqlinfo]; ###### ###### sdts="$sdts$pub_result"; ###### ###### i=$((i+1)); ######done; ###### ######echo "$tb s patition is [$sdts]"; ssql="SELECT RIGHT(TRIM(a.DATAPARTITIONNAME),8) FROM SYSCAT.DATAPARTITIONS a WHERE a.TABNAME='$tb' AND a.DATAPARTITIONNAME BETWEEN 'P_'||$strdate AND 'P_'||$enddate ORDER BY RIGHT(TRIM(a.DATAPARTITIONNAME),8) WITH UR"; db2cmd "$ssql"; sdts="$pub_result"; for dt in $sdts do for fdt in $mdts do #echo "fdt is [$fdt] and mdts is [$mdts] and dt is [$dt]" [ "$fdt" = "$dt" ] && continue 2; #跳转到上一层数据 $dts done #检查分区是否存在 sql_chk="select 1 from syscat.datapartitions where tabname=upper('$tb') and datapartitionname like '%'||varchar($dt)"; #echo "[$sql_chk]"; db2cmd "$sql_chk"; tbptflg=$pub_result; echo "tbpt flag is [$tbptflg]" if [ "$tbptflg" = "" -o "$tbptflg" = "-" ] then echo "$tb s $dt datapartition is not exists!"; dt=$(date -d "$dt 1 days " +"%Y%m%d" ); continue; fi; echo "for dt is [$dt]" if [ "$tboptype" = "D" -o "$tboptype" = "X" ] then #分离分区到目标表 sqld=" ALTER TABLE $tb DETACH PARTITION P_$dt INTO ${tb}_P_$dt"; fi; if [ "$tboptype" = "A" -o "$tboptype" = "X" ] then #从各分区数据插入到目标表 sqla=" INSERT INTO $tb SELECT * FROM ${tb}_P_$dt"; fi; sqldd=" drop table ${tb}_P_$dt"; for sql in "$sqld" "$sqla" "$sqldd" do echo "$sql" | tee -a $log; db2cmd "$sql" ; echo "$pub_result" | tee -a $log; done; done; done;