将生产线上的数据库使用shell/ target=_blank class=infotextkey>shell脚本每天凌晨1点远程备份到统计分析服务器并将数据自动导入到统计分析数据库中。理论上这种思路是可行的而且实现起来没有什么技术上的问题。但是脚本部署到这两台服务器上后经过测试发现生产线上的视图表到统计分析服务器上导入后变成了数据库表,究其原因是mysql/ target=_blank class=infotextkey>mysql数据库在备份时将视图备份成建表dll了。这样就会导致这样的问题业务使用正常,但是却没有任何统计分析数据生成,因为视图变成表以后失去了其原有整合处理数据的功能。
具体思路:
第一、在生产服务器上仅仅导出所有表中的数据;
第二、与技术人员协调沟通拿到最新的建表和构建视图的sql文;
第三、在统计分析服务器上编写一个简单的shell脚本实现删库、建库、建表、建视图及导入数据的功能。
实现过程:
一、在生产服务器上部署的脚本如下所示:
# version: 1.0 for linux
# method: 全备份mysql数据
# author: fengzhanhai
# history: create program V1.0 20121101 by fengzhanhai
# tasks: * 1 * * * /home/db-backup/mysql/mysqlbk.sh >> /dev/null 2>&1
#conf---------
UserName='sdmtv'
myPwd='sdtv@13.cm'
DbName=mms_sdmtv
BakDir=/data/tongji/
LogFile=/data/tongji/backdb.log
DATE=`date +%Y%m%d`
DumpFile=data$DATE.sql
FtpServer=10.0.211.12
FtpTargetPath=/root/mon
#main-------------
echo $(date +"%y-%m-%d %H:%M:%S") backup begin >> $LogFile
cd $BakDir
#备份当天文件
/usr/bin/mysqldump -u$UserName -p$myPwd $DbName -t > $BakDir$DumpFile
echo $(date +"%y-%m-%d %H:%M:%S") Dump Done >> $LogFile
echo $(date +"%y-%m-%d %H:%M:%S") $GZDumpFile compress done >> $LogFile
#上传到ftp服务器
ftp -v -n $FtpServer << END
user dbback1 s.allook.cn
bin
#cd $FtpTargetPath
put $DumpFile
bye
END
echo $(date +"%y-%m-%d %H:%M:%S") ftp $GZDumpFile compress done >> $LogFile
rm -f $GZDumpFile
#删除当前目录下7天前的文件备份文件
find $BakDir -name "data*" -mtime +7 -exec rm {} ;
echo $(date +"%y-%m-%d %H:%M:%S") delete old file done >> $LogFile
#验证结果
ls -al $DumpFile >> $LogFile
二、在统计分析服务器上部署脚本如下所示:
#!/bin/bash
#It was created by fengzhanhai on 20121105
#It was used by backup mysql
backdb=/backdata
mytime=`date +'%Y%m%d'`
account=root
pwd=sjtv@12.cc
dbname=mms_sdmtv
#mysqldump -u root -psjtv@12.cc mms_sdmtv -t >$backdb/mms.$mytime.sql
mysql -u $account -p$pwd <<end
drop database $dbname;
#删库
create database $dbname;
#建库
end
mysql -u $account -p$pwd $dbname<$backdb/alldb.sql >>/dev/null 2>&1
#建表、建视图
#mysql -u $account -p$pwd $dbname -t<$backdb/data$mytime.sql >>/dev/null 2>&1
mysql -u $account -p$pwd <<feng
use $dbname
source /backdata/data$mytime.sql
#导入数据
find $backdb/ -name 'data*' -ctime +90 | xargs rm -rf {};
#删除3个月之前的数据