MongoDB通过Shell 实现集合的日常归档

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: MongoDB通过Shell 实现集合的日常归档 1.MongoDB数据归档的意义和其他类型的数据库一样,归档对MongoDB同样重要。通过归档,可以保持集合中合适的数据量,对数据库的性能是一种保障,也就是大家常说的数据冷热分离。

MongoDB通过Shell 实现集合的日常归档
1.MongoDB数据归档的意义
和其他类型的数据库一样,归档对MongoDB同样重要。通过归档,可以保持集合中合适的数据量,对数据库的性能是一种保障,也就是大家常说的数据冷热分离。

同时,归档对数据库的管理也带来了很大方便性,例如日常的备份、灾难恢复等。

在此,不再展开叙述了。

2.集合数据归档流程图

3.归档实现代码
复制代码

The file is used by cron to Archive the data of NeedArchiveColName_Archive collection,the collection is part of NeedArchiveDBColName DB.

The file is writed by DBA Carson Xu.If you find any error, please connect with me,thanks.

The version is defined V.001

Version ModifyTime ModifyBy Desc

Ver001 2019-02-22 14:20 Carson Xu Create the Scripts File

!/bin/bash

mongodb可执行文件所在文档路径,此例为4.04 ,同时支持3.4.4

command_linebin="/QQMSG/mongo_db/mongobin404/bin/mongo"
command_linebinT="/QQMSG/mongo_db/mongobin404/bin/mongo"

存放导出过渡文件的文档路径和文件名字,ColA可用你的集合名字替代

targetpath='/data/mongodb_back/ArchiveDB_端口号'
bakcollectionname=NeedArchiveColName_$(date "+%Y%m%d%H%M")

登入账号信息

username="账号"
password="账号密码"

start 设置备份集合的开始日期和结束日期

ParamBakStartDate=$(date -d '-46 days' "+%Y-%m-%d")
echo "备份NeedArchiveColName时间参数中的开始时间为:" $ParamBakStartDate

ParamBakEndDate=$(date -d '-45 days' "+%Y-%m-%d")
echo "备份NeedArchiveColName时间参数中的结束时间为:" $ParamBakEndDate

ParamBakStartTimeS="$(date -d $ParamBakStartDate +%s)"

ParamBakEndTimeS="$(date -d $ParamBakEndDate +%s)"

echo "备份集合的时间转换为UTC时间秒数为:" $ParamBakStartTimeS 和 $ParamBakEndTimeS

ParamBakStartTimeMS=$[$ParamBakStartTimeS 1000+860601000]
ParamBakEndTimeMS=$[$ParamBakEndTimeS 1000+860601000]

echo "备份集合的时间转换为UTC时间毫秒数为:" $ParamBakStartTimeMS 和 $ParamBakEndTimeMS

end
start 连接源Server DB ,检查此次集合备份的文档数

command_line="${command_linebin} localhost:端口号/NeedArchiveDBColName -u$username -p$password"
export docQty=$(/bin/echo 'db.NeedArchiveColName.find({NeedArchiveByField:{$gte:new Date('"$ParamBakStartDate\"'),$lt:new Date('"$ParamBakEndDate\"')}}).count()' | $command_line --quiet)
echo "备份前集合NeedArchiveColName的文档数据为:" $docQty

End
Start 定义每次备份归档的最大阈值,防止意外情况的发生,例如:参数输入错误

if [ $docQty -gt 2000000 ];then
echo "MongoDB-Archive-Exception:NeedArchiveDBColName库NeedArchiveColName集合指定时间段内的文档数过大,超过定义的安全阈值 2000000,归档终止,请检查!"
exit
fi

end
start 连接目标Server DB ,检查target DB 上是否已经存在此时间内的文档

command_lineT="${command_linebinT} 归档实例IP:归档实例端口/归档数据库Name -u$username -p$password"
export docQtyT=$(/bin/echo 'db.NeedArchiveColName.find({NeedArchiveByField:{$gte:new Date('"$ParamBakStartDate\"'),$lt:new Date('"$ParamBakEndDate\"')}}).count()' | $command_lineT --quiet)
echo "备份目标BKDB集合NeedArchiveColName备份归档前的文档数据为:" $docQtyT
if [ $docQtyT -gt 0 ];then
echo "MongoDB-Archive-Exception:NeedArchiveDBColName库NeedArchiveColName集合检查发现指定时间段内目标数据库目标集合存在异常文档数,归档终止,请检查!"
exit
fi

end
start mongoexport 指定集合指定时间段内的文档,输出到指定路径下;并执行检查命令是否正常执行

start()
{
echo "NeedArchiveDBColName库NeedArchiveColName集合备份输出开始"
/QQMSG/mongo_db/mongobin404/bin/mongoexport --port 端口号 -u $username -p $password -d NeedArchiveDBColName --authenticationDatabase NeedArchiveDBColName -c NeedArchiveColName -q ' { NeedArchiveByField: { $gte:new Date('$ParamBakStartTimeMS'),$lt:new Date('$ParamBakEndTimeMS') } } ' -o ${targetpath}/${bakcollectionname}
echo "NeedArchiveDBColName库NeedArchiveColName集合备份输出完毕"
}
start
execute()
{
if [ $? -eq 0 ]
then
echo "The MongoDB 集合 NeedArchiveColName 文档mongoexport完成!"
else
echo "The MongoDB 集合 NeedArchiveColName 文档mongoexport失败"
exit
fi
}

end
Start mongomongoimport 将导出的备份集合导入到指定的BKDB 指定的集合中

echo "备份输入开始"
/QQMSG/mongo_db/mongobin404/bin/mongoimport -h 归档实例IP --port 归档实例端口 -u $username -p $password -d 归档数据库Name --authenticationDatabase 归档数据库Name -c NeedArchiveColName --file ${targetpath}/${bakcollectionname}
echo "备份输入完毕"

End
start 连接目标Server DB ,检查target DB 上是否已经存在此时间内的文档

export docQtyT2=$(/bin/echo 'db.NeedArchiveColName.find({NeedArchiveByField:{$gte:new Date('"$ParamBakStartDate\"'),$lt:new Date('"$ParamBakEndDate\"')}}).count()' | $command_lineT --quiet)
echo "备份目标BKDB集合NeedArchiveColName备份归档后的文档数据为:" $docQtyT2

echo "比较docQty 和 docQtyT2 的大小"
if [ $docQty == $docQtyT2 ]; then

 echo "正常:时间段内源数据库集合中的文档数  和 目标数据库集合中还原后的文档数据 相等";

elif [ $docQty -gt $docQtyT2 ]; then

echo "MongoDB-Archive-Exception:时间段内源数据库集合中的文档数  大于  目标数据库集合中还原后的文档数据";
exit

else
echo "MongoDB-Archive-Exception:时间段内源数据库集合中的文档数 小于 目标数据库集合中还原后的文档数据";
exit
fi

End
Start Remove 源数据库源集合指定时间内的记录

docQtyR=$(/bin/echo 'db.NeedArchiveColName.remove({NeedArchiveByField:{$gte:new Date('$ParamBakStartTimeMS'),$lt:new Date('$ParamBakEndTimeMS')}}).nRemoved' | $command_line --quiet)
echo "本次操作Remove集合NeedArchiveColName的文档数据为:" $docQtyR

End
检查 Remove 后集合的文档数

docQty=$(/bin/echo 'db.NeedArchiveColName.find({NeedArchiveByField:{$gte:new Date('"$ParamBakStartDate\"'),$lt:new Date('"$ParamBakEndDate\"')}}).count()' | $command_line --quiet)
echo "NeedArchiveDBColName库NeedArchiveColName集合 此次 Remove 后指定时间剩余的文档数据为:" $docQty

End
删除导出的文件

rm -rf ${targetpath}/${bakcollectionname}
if [ $? -eq 0 ]
then
echo "正常:NeedArchiveDBColName库NeedArchiveColName集合导出的文件被删除:" ${targetpath}/${bakcollectionname}
else
echo "MongoDB-Archive-Exception:NeedArchiveDBColName库NeedArchiveColName集合导出的文件未被正常删除" ${targetpath}/${bakcollectionname}
fi

End

复制代码

  1. 代码说明
    4.1 配置基本信息

主要包括:mongo bin 可执行文件所在路径;导出过渡文件的定义;归档账号和密码;集合数据保留天数。

4.2 代码中关键词
明白关键字的含义,可在部署运行前,批量替换

代码中关键词 关键词意义
NeedArchiveDBColName
需要归档的集合所在数据库;
NeedArchiveColName
需要归档的集合名字;
归档数据库Name
归档数据库Name
NeedArchiveByField
归档依据的字段;此例中是Date类型的字段,其他类型还要调试。
/QQMSG/mongo_db/mongobin404/bin Mongo 可执行文件所在路径
2000000 归档的最大阈值
ArchiveDB_端口号 过渡文件所放的位置,一个数据库一个文档。不用细化到集合
端口号 端口号分为源库所在实例端口,和目标库所在实例端口
4.3 在本例中,源库和目标库设置了相同的归档账号和对应密码
4.4 通过crontab 实现日常归档,执行信息(异常错误)重定向到log文件
归档实现代码保存到文件中,通过crontab设置文件的定时任务,实现日常归档。

执行情况 重定向( >>)到指定文件。通过指定文件的监视可实现监控归档的执行情况。
原文地址https://www.cnblogs.com/xuliuzai/p/10698241.html

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
1月前
|
安全 Shell Linux
【Shell 命令集合 系统管理 】Linux 锁定终端 vlock命令 使用指南
【Shell 命令集合 系统管理 】Linux 锁定终端 vlock命令 使用指南
36 1
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
43 1
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示目前登入系统的用户信息 w命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示目前登入系统的用户信息 w命令 使用指南
45 2
|
1月前
|
存储 Unix Shell
【Shell 命令集合 系统管理 】⭐⭐Linux 显示系统的基本信息 uname命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐Linux 显示系统的基本信息 uname命令 使用指南
35 1
|
1月前
|
存储 Shell Linux
【Shell 命令集合 系统管理 】Linux 修改用户的属性和配置 usermod命令 使用指南
【Shell 命令集合 系统管理 】Linux 修改用户的属性和配置 usermod命令 使用指南
32 1
|
1月前
|
搜索推荐 Shell Linux
【Shell 命令集合 系统管理 】Linux 管理用户配置文件 userconf命令 使用指南
【Shell 命令集合 系统管理 】Linux 管理用户配置文件 userconf命令 使用指南
38 2
|
1月前
|
Shell Linux 数据库
【Shell 命令集合 系统管理 】Linux 创建新用户的命令 useradd命令 使用指南
【Shell 命令集合 系统管理 】Linux 创建新用户的命令 useradd命令 使用指南
48 1
|
1月前
|
存储 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示当前登录用户的用户 whoami命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示当前登录用户的用户 whoami命令 使用指南
49 1
|
1月前
|
存储 Shell Linux
【Shell 命令集合 系统管理 】Linux 删除用户 userdel 命令 使用指南
【Shell 命令集合 系统管理 】Linux 删除用户 userdel 命令 使用指南
63 2
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 实时监控系统性能 top命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 实时监控系统性能 top命令 使用指南
40 2