shell根据SQL语句实现数据文件离线异地备份

版权声明:silly8543 https://blog.csdn.net/cen50958/article/details/89710362
1.需求

在这里插入图片描述

  • 只备份库中以_mt结尾的表数据
  • 查询昨天的数据,根据不同的表、省份、年月生成不同的数据文件,并且压缩成tar.gz
  • 将生成的文件上传到异地服务器,上传完成后,删除本地文件数据
  • 删除7天以前的执行日志
  • 执行完成后将当天的执行日志邮件发送给管理员
2.操作环境

CentOS Linux release 7.5.1804 (Core)
Mysql server version: 5.7.21

3.前置环境准备
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`" [email protected] < $logFile.mail && 
rm -f  $logFile.mail

猜你喜欢

转载自blog.csdn.net/cen50958/article/details/89710362
今日推荐