db2 数据库大数据量批量备份到新表中

在实际项目中会遇到大数据量备份的场景,db2数据库可以导出del 再使用 import 导入但是磁盘空间会是一个问题,有的时候也会遇到大数据量备份到其他表的情况,会因为数据量较大,产生一系列的问题,这个时候可以使用分时间段导出的方式 降低每次导出的数据量,这边写了一个脚本,发出来也可以让各位参考一下。

脚本中的时间字段可以改成参数形式,方便其它项目中使用,这里用到了以30天为一个周期的备份模式,也可以根据需求调整,主要是取模的方式来保证最后一个时间段的数据备份,小弟不才,随手写的脚本希望对后面有需要的人有帮助。

#!/bin/bash
#########################################################################################################################################3
#脚本名称:     backup_data.sh
#脚本功能:     通过存储过程备份数据 这边使用固定的存储过程 只需传入备份的表名,目标表名 开始时间以及日期参数 支持断点重跑
#脚本调用:     sh backup_data.sh <backup_table> <target_table>  <start_date> <end_date>
#脚本参数:     <backup_table>   备份的原表
#               <target_table>   目标表名
#               <start_date>   备份数据开始日期
#               <end_date>     备份数据结束日期
#输出文件:     backupData_<current_Date>.log
#使用实例:     
#编 写 人:     
#编写日期:     
#########################################################################################################################################
if [ $# -ne 4 ]
then
    echo "参数个数不正确"
	exit 10
fi

backup_table=$1
target_table=$2
start_date=$3
end_date=$4
log=/tmp/log/${backup_table}_$(date "+%Y-%m-%d%").log
    #连接db2  edw 
    #db2 connect to edw
    #要求传入的数据格式为yyyyMMdd的两个开始和结束参数,如20160901 20160910
    start_dt=`date -d "${start_date}" +'%Y%m%d'`
    end_dt=`date -d "${end_date}" +'%Y%m%d'`
	##将输入的日期转为的时间戳格式
    startDate=`date -d "${start_date}" +%s`
    endDate=`date -d "${end_date}" +%s`
	##计算两个时间戳的差值除于每天86400s即为天数差 修改为30天间隔
    stampDiff=`expr $endDate - $startDate`
    dayDiff=`expr $stampDiff / 86400`
    count=`expr $dayDiff / 30`
	count_mod=`expr $dayDiff % 30`
	#定义前后日期默认值为初始日期
	pre_date=`date -d "${start_date}" +'%Y-%m-%d'`
	next_date=`date -d "${start_date}" +'%Y-%m-%d'`
	current_Date=`date -d "${start_date}" +'%Y-%m-%d'`
	function excute(){
    #将日期转为时间戳格式
	tmp_curr=`date -d "${current_Date}" +%s`
	tmp_pre_date=`date -d "${pre_date}" +%s`
	tmp_next_date=`date -d "${next_date}" +%s`
	 #判断pre_date及next_date 是否发生了变化 如果变化了就直接重跑对应日期的数据并直接终止excute
    if [[ $tmp_pre_date -ne $tmp_curr ]] && [[ $tmp_next_date  -ne $tmp_curr ]];
	then
	    echo "开始重跑: 数据日期【${pre_date} -- ${next_date} 】"
	    echo db2 -x "LOAD FROM (SELECT * FROM ${backup_table} WHERE ACG_DT>='${pre_date}' AND ACG_DT<'${next_date}') OF CURSOR INSERT INTO ${target_table}"   
	    echo db2 -x "LOAD FROM (SELECT * FROM ${backup_table} WHERE ACG_DT>='${pre_date}' AND ACG_DT<'${next_date}') OF CURSOR INSERT INTO ${target_table}" >>$log;
	    db2 -x "LOAD FROM (SELECT * FROM ${backup_table} WHERE ACG_DT>='${pre_date}' AND ACG_DT<'${next_date}') OF CURSOR INSERT INTO ${target_table}" >>$log;
	    return 0
	fi
	   for((i=1;i<=$count;i++))
       do	   
	       j=`expr $i \* 30`
		   echo $j
		   l=`expr $i - 1`
		   echo $l
		   k=`expr $l \* 30`
		   echo $k
		   pre_date=`date -d "${start_date} $k day" +'%Y-%m-%d'`
	       next_date=`date -d "${start_date} $j day" +'%Y-%m-%d'`
		   echo  $pre_date  $next_date
	   if [ $count -eq $i ];then
	      next_date=`date -d "${next_date} $count_mod day" +'%Y-%m-%d'`
	      echo db2 -x "LOAD FROM (SELECT * FROM ${backup_table} WHERE ACG_DT>='${pre_date}' AND ACG_DT<='${next_date}') OF CURSOR INSERT INTO ${target_table}"   
	      echo db2 -x "LOAD FROM (SELECT * FROM ${backup_table} WHERE ACG_DT>='${pre_date}' AND ACG_DT<='${next_date}') OF CURSOR INSERT INTO ${target_table}" >>$log;
	     db2 -x "LOAD FROM (SELECT * FROM ${backup_table} WHERE ACG_DT>='${pre_date}' AND ACG_DT<='${next_date}') OF CURSOR INSERT INTO ${target_table}" >>$log; 
	   else
	      echo db2 -x "LOAD FROM (SELECT * FROM ${backup_table} WHERE ACG_DT>='${pre_date}' AND ACG_DT<'${next_date}') OF CURSOR INSERT INTO ${target_table}"   
	      echo db2 -x "LOAD FROM (SELECT * FROM ${backup_table} WHERE ACG_DT>='${pre_date}' AND ACG_DT<'${next_date}') OF CURSOR INSERT INTO ${target_table}" >>$log;
	     db2 -x "LOAD FROM (SELECT * FROM ${backup_table} WHERE ACG_DT>='${pre_date}' AND ACG_DT<'${next_date}') OF CURSOR INSERT INTO ${target_table}" >>$log; 
	   fi  
	   done
	   if [ "$?"="0" ];then
         return 0
	   else
	     return 1
	   fi
	}
	excute
	if [ $? -eq 0 ]; then
         echo "备份表名:${backup_table} 
		       备份数据完成 
			   时间范围:${start_dt} - ${end_dt} " >>$log;	         
	 else
          #db2 -x "LOAD FROM *.TXT OF DEL TERMINATE INTO ${target_table}"               
        excute		 
    fi
db2 connect reset
db2 terminate









  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_39276701

创作不易,还请各位老爷们支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值