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

简介: 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

相关文章
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
505 45
|
缓存 Shell Linux
【Shell 命令集合 链接器(linker)工具】Linux ld命令 将目标文件与库链接为可执行文件或库文件
【Shell 命令集合 链接器(linker)工具】Linux ld命令 将目标文件与库链接为可执行文件或库文件
613 0
|
NoSQL MongoDB 数据库
MongoDB 删除集合
10月更文挑战第14天
395 1
|
9月前
|
NoSQL 关系型数据库 MongoDB
微服务——MongoDB常用命令——集合操作
本节主要介绍MongoDB中的集合操作,包括显式与隐式创建集合的方法。显式创建使用`db.createCollection(name)`,需遵循命名规范(如不能以"system."开头或包含`\0`字符)。隐式创建则通过直接向不存在的集合插入文档实现,更为常用。此外,还介绍了集合删除方法`db.collection.drop()`及其返回值规则,帮助用户管理数据库中的集合资源。
348 0
|
9月前
|
NoSQL JavaScript Shell
微服务2——MongoDB单机部署2——Shell连接
本节介绍如何通过Shell连接MongoDB数据库,使用`mongo`命令登录,默认连接本地127.0.0.1的27017端口。可查看数据库列表(`show databases`),退出shell(`exit`),或通过`--help`获取更多参数。MongoDB Shell基于JavaScript解释器,支持运行JS程序。
255 0
|
存储 NoSQL Shell
02 MongoDB数据类型、重要概念以及shell常用指令
文章详细解释了MongoDB中的数据类型、重要概念,并提供了常用的MongoDB Shell操作指令,帮助用户更好地管理和操作MongoDB数据库。
214 0
02 MongoDB数据类型、重要概念以及shell常用指令
|
缓存 NoSQL MongoDB
|
存储 NoSQL MongoDB
MongoDB 创建集合
10月更文挑战第13天
241 1
|
NoSQL Shell MongoDB
MongoDB Shell
10月更文挑战第11天
229 0
|
存储 NoSQL 数据管理
揭秘MongoDB时间序列集合:这个超级功能将如何彻底改变你的数据管理?
【8月更文挑战第8天】时间序列数据记录随时间变化的信息,在数据库管理中至关重要。MongoDB自4.0版起引入时间序列集合,专为这类数据优化存储与查询。通过问答形式介绍其特点:自动数据过期、高效存储机制及快速查询操作。创建时需指定时间字段及可选元数据字段。支持设置数据过期时间,采用粗粒度索引减少I/O操作。查询时可通过时间范围筛选数据,并利用聚合框架进行数据分析。随着实时分析需求的增长,时间序列集合的应用将更加广泛。
797 1

推荐镜像

更多