1.需求
- 只备份库中以_mt结尾的表数据
- 查询昨天的数据,根据不同的表、省份、年月生成不同的数据文件,并且压缩成tar.gz
- 将生成的文件上传到异地服务器,上传完成后,删除本地文件数据
- 删除7天以前的执行日志
- 执行完成后将当天的执行日志邮件发送给管理员
2.操作环境
CentOS Linux release 7.5.1804 (Core)
Mysql server version: 5.7.21
3.前置环境准备
- 备份数据库需要创建只读账号
- 执行服务器与异地服务器需要实现免密登录,参考博文:https://blog.csdn.net/cen50958/article/details/89504443
- 配置mail使用外部SMTP发送邮件,参考博文:https://blog.csdn.net/cen50958/article/details/89321509
- scp上传文件,参考博文:https://blog.csdn.net/cen50958/article/details/89503303
4.shell脚本文件
#!/bin/sh
#数据库信息
dbUserName=backup
dbPasswd=123456
db=sms
dbPort=3306
#远程服务器信息
remoteIp=116.114.18.147
remotePort=2233
remoteUser=backup
remotePath=/backup
#昨天时间
yesterday=$(date +%F -d '-1day')
year=$(date +%Y -d '-1day')
month=$(date +%m -d '-1day')
#临时文件存放目录
dirTemp=/home/backup/scripts/db_sms/temp
#日志文件目录
dirLog=/home/backup/scripts/db_sms/logs
#数据存放目录
dirData=/backup/sms_mt
#表名文件
tablesFile=$dirTemp/tables.txt
#每天生成一个日志文件
logFile=$dirLog/info_`date +%Y%m%d`.log
echo "`date +%Y-%m-%d-%H:%M:%S` show tables start" >>$logFile
#查询数据库所有表名
/usr/local/mysql/bin/mysql -u$dbUserName -p$dbPasswd -e "
use $db;
show tables;
" >$tablesFile
#将查询的表名写入日志文件,做记录
cat $tablesFile >> $logFile
echo "`date +%Y-%m-%d-%H:%M:%S` show tables finish" >>$logFile
#判断表文件是否存在
if [ ! -f $tablesFile ];
then
echo "`date +%Y-%m-%d-%H:%M:%S` tables file not exists" >>$logFile
exit 1
fi
#导出数据离线文本
function exportSms(){
echo "`date +%Y-%m-%d-%H:%M:%S` export data:$1 start" >>$logFile
#获取省份编码
provinceCode=${1/_sms_mt/}
#存放数据目录
dirDataTbale=$dirData/$provinceCode/$year/$month
#判断数据目录是否存在
if [ ! -d $dirDataTbale ];then
mkdir -p $dirDataTbale
fi
#数据文件名称
dataFile=$provinceCode-$yesterday
#执行sql语句
/usr/local/mysql/bin/mysql -u$dbUserName -p$dbPasswd -e "
use $db;
select * from $1 where create_time >= '$yesterday 00:00:00' and create_time <='$yesterday 23:59:59';
">/$dirDataTbale/$dataFile.txt
#进入文件目录,压缩文件
cd $dirDataTbale &&
#压缩文件
tar zcf $dataFile.tar.gz $dataFile.txt &&
#删除txt文件
rm -f $dataFile.txt
echo "`date +%Y-%m-%d-%H:%M:%S` export data:$1 end" >>$logFile
}
#读取表文件,依次处理
cat $tablesFile | while read line
do
#判断表名是否以sms_mt结尾
if [[ $line == *_sms_mt ]];
then
exportSms $line
fi
done
#推送数据给远程服务器端
echo "`date +%Y-%m-%d-%H:%M:%S` push data start" >>$logFile
scp -P$remotePort -r -p $dirData $remoteUser@$remoteIp:$remotePath &&
rm -rf $dirData/*
echo "`date +%Y-%m-%d-%H:%M:%S` push data end" >>$logFile
#删除7天后日志
find $dirLog/ -type f -mtime +7 -name "*.log" |xargs rm -f
#复制日志文件
cp -r $logFile $logFile.mail &&
#将执行日志邮件发送给管理员
mail -s "sms db auto back `date +%Y-%m-%d`" silly8543@163.com < $logFile.mail &&
rm -f $logFile.mail