需求:每天凌晨自动执行脚本,提取mongodb中前一天的数据,导出为json格式,然后把json文件上传到指定ftp上面。
计划:写shell脚本,写日期变量取凌晨执行时间的前一天,用mongoexport导出,加-p参数按日期筛选,最后在shell里登录到ftp上,上传文件,结束
开始!
-- mongodb 查询:
查询collection名为:authlog202008 的所有数据
db.authlog202008.find()
一个时间范围查询
db.authlog202008.find({
"authTime" : { $gte : new Date("2021-08-05T00:00:00Z") }
})
加了and条件的时间范围查询
db.authlog202008.find({
$and : [{"authTime" : { $lte : ISODate("2020-08-05 23:59:59.999") }}, {"authTime" : { $gt : ISODate("2020-08-05 00:00:00.000") }}]
})
-- mongoexport语句编写:
试写第一条语句
mongoexport -h 127.0.0.1 -d bmsauth_log -c authlog202008 -q '{ $and : [{"authTime" : { $lte : ISODate("2020-08-05 23:59:59.999") }}, {"authTime" : { $gt : ISODate("2020-08-05 00:00:00.000") }}] }).sort({authTime: 1}) -o /home/lzttest/authlog202008_0805.json
试着执行发现报错:
error validating settings: query 'xx xx xx ... xx' is not valid JSON: unexpected ISODate format
mongoexport貌似不支持ISODate,所以转换成new Date的时间格式
最后语句定型:
mongoexport -h 127.0.0.1 -d bmsauth_log -c authlog202008 -q '{ $and : [{"authTime" : { $lte : new Date("'$Date'T23:59:59Z") }}, {"authTime" : { $gte : new Date("'$Date'T00:00:00Z") }}] }' -o /home/lzttest/authlog_"$Date".json
-- shell里日期变量:
shell 日期加减运算,比如今日是2012-04-22
$ date -d "+1 day" +%Y-%m-%d
2012-04-23
$ date -d "-1 day" +%Y-%m-%d
2012-04-21
需要用前一天的,so:
Date=`date -d "-1 day" +%Y-%m-%d`
变量的引用
直接引用到mongoexport语句中,$Date会出现问题,每个变量需要用单引号引起来,这样:
mongoexport -h 127.0.0.1 -d bmsauth_log -c authlog202008 -q '{ $and : [{"authTime" : { $lte : new Date("'$Date'T23:59:59Z") }}, {"authTime" : { $gte : new Date("'$Date'T00:00:00Z") }}] }' -o /home/lzttest/authlog_"$Date".json
-- 测试ftp脚本
ftp -v -n 192.168.xx.xx <<EOF
user ftpuser ftppasswd
binary
cd upload
lcd /home/lzttest/
prompt
put authlog_"$Date".json
bye
EOF
注意我踩过的坑:
1、报这个错误:
warning: here-document at line 2 delimited by end-of-file (wanted `EOF')
因为第一个EOF前后都不能有空格,<<和EOF要紧挨着。
2、这里引用变量$Date的方式
-- 2020.8.10 修改优化过的脚本
#!/bin/bash
#Declare
Date=`date -d "-1 day" +%Y-%m-%d`
#The time when we start mongoexport
Start=`date +"%Y-%m-%d %H:%M:%S"`
#Start mongoexport
/usr/local/mongodb/bin/mongoexport -h 127.0.0.1 -d bmsauth_log -c authlog202008 -q '{ $and : [{"authTime" : { $lte : new Date("'$Date'T23:59:59Z") }}, {"authTime" : { $gte : new Date("'$Date'T00:00:00Z") }}] }' -o /home/liangzt/authlog_"$Date".json
#The time when we finish mongoexport
End=`date +"%Y-%m-%d %H:%M:%S"`
#Output time record
echo "----------Begin:$Start---End:$End-----------Export complete!----------" >> /home/liangzt/backup_record.txt
#Put file to the ftp
ftp -v -n 192.168.40.239 <<EOF
user LT stbbcmmx
binary
cd upload60
lcd /home/liangzt/
prompt
put authlog_"$Date".json
bye
EOF
#The time when we finish ftp
End_ftp=`date +"%Y-%m-%d %H:%M:%S"`
echo -e "----------Time:$End_ftp---Commit to ftp successfully!----------\n" >> /home/liangzt/backup_record.txt
#Delete .json 5 days ago
#Declare
Date5=`date -d "-5 day" +%Y-%m-%d`
#Delete .json if exist
if [ -e /home/liangzt/authlog_"$Date5".json ];
then
rm -f /home/liangzt/authlog_"$Date5".json
fi;
-- 最后加入crontab,晚上凌晨2点执行,明早起来看下效果。
crontab -e
0 2 * * * /home/lzttest/export_by_day.sh
浙公网安备 33010602011771号