在实际项目中会遇到大数据量备份的场景,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