1 环境
linux centos 7.x
2 背景说明
图片,文件的存储使用的是私有云,但是运维弄了一个多月后,告诉我说由于某些原因他们无法对数据进行备份,让自己想办法处理。
想到的办法是 从mysql 读取使用的图片文件数据,然后下载到服务器进行存储。
mysql 中存储的是图片的地址或者文件名,两种情况都有。
所以最好的办法是 将mysql 存储的图片字段进行处理,获取文件名, 将文件名于路径拼接,获取图片下载地址。
备份策略: 每4小时增量更新一次。
代码说明
获取文件所在的路径,并进入该路径。(个人在写shell, python 时很喜欢这么写,程序执行不容易出现因路径不对问题)
DIR=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
cd $DIR
执行mysql 语句,获取一个表中的两个字段的值,并将返回结果赋值给contract_result (含表头)
contract_result=`/work/install/mysql-5.7.28/bin/mysql -h$host -P$port -u$mysql_u -p$mysql_p car_subsidy -e "${contract_sql}"`
判断以上语句是否成功执行
if [ $? = 0 ]
去掉数据库返回结果中的表头,并将数据存储到一个临时文件中。
echo "$contract_result"|tail -n +2 > ${f_temp}
循环读取临时文件的数据,
while read line;do
((all_count++))
echo "$all_count"
arr=(${line})
#user_id=${arr[0]}
pic=${arr[1]}
pic=`echo ${pic}`
pic=${pic##http*\/}
if [[ $imgprefix* == $pic ]]
then
img_url=${pic}
else
img_url=${imgprefix}${pic}
fi
#echo $pic
#flag=$(`cat $file_contract | grep "${pic}" | wc -l`)
flag=` grep "${pic}" ${file_out} | wc -l`
if [ $flag -lt 1 ]
then
wget -P ${imgpath} ${img_url}
((new_count++))
echo "${line}" >> ${file_out}
fi
done < ${f_temp}
1 获取数据数组
arr=(${line})
2 去掉 http到 / 之前的字符串
pic=${pic##http*\/}
例如: http:/123455/abcd/xyz.jpg
处理后: xyz.jpg
3 判断字符串包含关系
if [[ $imgprefix* == $pic ]]
pic 是否包含 imgprefix, 即pic 是否以 imgprefix 开头。
4 下载图片到 目录 imgpath。
wget -P ${imgpath} ${img_url}
5 判断 file_out 文件中是否有 pic 字段。
` grep "${pic}" ${file_out} | wc -l`
定时任务
crontab -e
0 */4 * * * cd /data/images && sh start.sh
3 完整代码
start.sh
DIR=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
cd $DIR
host=localhost ####### change ######
imgpath=img/contract/ ######## change ########
imgprefix=http://obs.example.com.cn/
mysql_u=user
mysql_p=password
port=3306
#d=$(date +%Y-%m-%d %H:%M:%S)
d=$(date +%F#%T)
########### t_purchase_contract ######################
file_out=recorder ############ change #############
f_temp=${file_out}"_temp" ############ change #############
mysql_table=table ############ change #############
mysql_field=contract ############ change #############
contract_sql="select user_id,${mysql_field} from ${mysql_table}"
contract_result=`/work/install/mysql-5.7.28/bin/mysql -h$host -P$port -u$mysql_u -p$mysql_p car_subsidy -e "${contract_sql}"`
# 判断是否连接成功
new_count=0
all_count=0
img_url=
if [ $? = 0 ]
then
echo "$contract_result"|tail -n +2 > ${f_temp}
while read line;do
((all_count++))
echo "$all_count"
arr=(${line})
#user_id=${arr[0]}
pic=${arr[1]}
pic=`echo ${pic}`
pic=${pic##http*\/}
if [[ $imgprefix* == $pic ]]
then
img_url=${pic}
else
img_url=${imgprefix}${pic}
fi
#echo $pic
#flag=$(`cat $file_contract | grep "${pic}" | wc -l`)
flag=` grep "${pic}" ${file_out} | wc -l`
if [ $flag -lt 1 ]
then
wget -P ${imgpath} ${img_url}
((new_count++))
echo "${line}" >> ${file_out}
fi
done < ${f_temp}
echo "${mysql_table} ${mysql_field} finished at ${d},new pics: ${new_count}, all pics: ${all_count}">>log
else
echo "${mysql_table} ${mysql_field} finished at ${d}, with errors" >> log
fi
rm -rf ${f_temp}