关闭

使用shell进行mysql数据统计并上传

612人阅读 评论(0) 收藏 举报

(这是批处理的旧版本)

需求如下:

  1. 对指定数据库进行统计,输出结果为文本格式,TAB进行分割,不带列标题,文件名为“日期_统计名.dat"
  2. 对统计结果计算md5,并写入“日期_统计名.dat.md5"
  3. 对统计结果进行压缩,并写入“日期_统计名.dat.7z"
  4. 上传md5,和7z文件

#!/bin/sh
#每日统计脚本
#每天零点开始统计前一天的数据,并打包上传到指定服务器


#当crontab执行时,在其他目录,所以要转到当前脚本目录先,后面的路径才会正确
seftdir=$(cd "$(dirname "$0")"; pwd)
cd ${seftdir}


# 设置变量
# 我们的Time是UNIX_TIMESTAMP
today=`date +%Y-%m-%d`
endDay=`date -d"$today" +%s`
startDay=$[ $endDay - 86400]
echo today=$today, startDay=$startDay, endDay=$endDay




GameId=1101
ParterID=1
WrolDID=1


#设置查询的sql,为了方便查看,我们换行了
getUserInfo_sql="select $GameId as 'gameid', $ParterID as 'ParterID', $WrolDID as 'WrolDID', \
User, UserID \
from  accountinfo  where Time >= $startDay and Time < $endDay;"


getLoginLog_sql="select $GameId as 'gameid', $ParterID as 'ParterID', $WrolDID as 'WrolDID', \
UserId, ActorID, RoleLv \
from  UserLoginLog \
where (TimeLogin < $endDay and TimeLogout = 0) \
or (TimeLogout >= $startDay and TimeLogout < $endDay);"






#要统计的数据库用户信息-运维修改
mysqlIp=192.168.0.1
mysqlPort=3306
user=Dbuser
password=dbPassword




# 上传的统计库信息
server_ip=192.168.0.2
server_port=21
server_user=ftpUser
server_password=ftpPassword






# 建立本次处理的临时目录
tname=`date +%Y-%m-%dT%H%M%S.000`
mkdir ${tname}
echo target dir : ${tname}
cd ${tname}


#初始化FTP命令
tempFtpCmdFile=ftp.cmd
echo open ftp://$server_user:$server_password@$server_ip:$server_port >> $tempFtpCmdFile
#echo mkdir WBGmae_Receive >> $tempFtpCmdFile
#echo mkdir WBGmae_Receive/${mysqlIp} >> $tempFtpCmdFile




# 处理子函数
function __stat__ () {
#参数 要执行的SQL文件,保存的文件名
dbname=$1
sqlfile=$2
uploadfile=$3


echo
echo ---- [$uploadfile run] ---- 
#执行SQL统计
curFilename=${tname}_${uploadfile}.dat
echo ${curFilename}
echo ---- SQL -----
echo $sqlfile
mysql -u$user -p$password -h $mysqlIp -P $mysqlPort --default-character-set=gbk --skip-column-names --execute="$sqlfile" $dbname  1>${curFilename} 2>${curFilename}.err
echo ---- *** -----


# 转成DOS格式,这是很浪费时间和磁盘的事情
unix2dos ${curFilename}


#压缩结果
echo [$uploadfile  compress ...]
7z a ${curFilename}.7z ${curFilename}




# 生成MD5
#md5result=`md5 ${curFilename}.7z`
#echo ${md5result:0:32} > ${curFilename}.md5
md5 ${curFilename}.7z > ${curFilename}.md5


#生成FTP命令
echo mkdir -p /WGStatCenterSource/${uploadfile}/${mysqlIp} >> $tempFtpCmdFile
echo mput ~/dbStat/${tname}/${curFilename}.7z -O /WGStatCenterSource/${uploadfile}/${mysqlIp} >> $tempFtpCmdFile
echo mput ~/dbStat/${tname}/${curFilename}.md5 -O /WGStatCenterSource/${uploadfile}/${mysqlIp} >> $tempFtpCmdFile
echo [$uploadfile  ok]
echo ------------------------------------------------------
}




# 统计部分
echo start get mysql stat 开始统计




__stat__ gameroledb "$getUserInfo_sql"      WGAccountInfo_Tmp
__stat__ logdb      "$getLoginLog_sql"      WGUserLoginLog_Tmp




# FTP 上传
echo start upload ftp: $server_ip:$server_port 上传
echo bye>> $tempFtpCmdFile
#cat $tempFtpCmdFile
# lftp -f 和 -u 不能一起使用
lftp -f $tempFtpCmdFile  $server_ip:$server_port
rm $tempFtpCmdFile

============ 结束 ============
与批处理不同的是,lftp只需要一次登录就可以把文件全部上传,效率高很多。
还有就是变量可以换行,sql语句可以分多行写,好看很多,不容易出错。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:120496次
    • 积分:1915
    • 等级:
    • 排名:千里之外
    • 原创:66篇
    • 转载:11篇
    • 译文:0篇
    • 评论:31条
    文章分类
    最新评论