MongoDB 使用技巧记录(十二)
一:sort()方法的size限制
当我对一个没有建索引的字段做find,然后做sort的时候,可能触发sort的size的32MB限制,例如:
cswuyg> db.stotal.find({}).sort({'type':-1})
Error: error: {
"$err" : "Executor error: Overflow sort stage buffered data usage of 33554493 bytes exceeds internal limit of 33554432 bytes",
"code" : 17144
}
有两种解决方法:
解决方法一:对需要排序的字段建索引 db.stotal.ensureIndex({'type': -1})
解决方法二:修改默认配置,把sort时可以用的内存设置大点:cswuyg> db.adminCommand({setParameter:1, internalQueryExecMaxBlockingSortBytes:335544320})
这两种解决方法各有利弊:(1)增加了索引会导致数据写入变慢,存储占用变多;(2)不建索引修改默认配置,会导致sort的时候占用更多的内存。
> db.InfoLog.remove({CreateDateTime:{$lt:"2016-08-24 00:00:00"}});
WriteResult({ "nRemoved" : 2814859 })
> db.adminCommand({setParameter:1, internalQueryExecMaxBlockingSortBytes:655544320})
{ "was" : 33554432, "ok" : 1 }
> db.adminCommand({setParameter:1, internalQueryExecMaxBlockingSortBytes:655544320})
{ "was" : 655544320, "ok" : 1 }
> db.adminCommand({setParameter:1, internalQueryExecMaxBlockingSortBytes:655544320})
二:索引
查索引
db.InfoLog.getIndexes()
建立索引
db.InfoLog.ensureIndex({"CreateDateTime":1})
删除索引
db.InfoLog.dropIndex({"CreateDateTime":1})
> use HospitalServiceLogging
switched to db HospitalServiceLogging
> show collections;
ErrorLog
InfoLog
WarningLog
system.indexes
> db.InfoLog.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "HospitalServiceLogging.InfoLog"
}
]
> db.InfoLog.ensureIndex({"CreateDateTime":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
>
> db.InfoLog.getIndexes()
[
{
"v" : 1,"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "HospitalServiceLogging.InfoLog"
},
{
"v" : 1,
"key" : {
"CreateDateTime" : 1
},"name" : "CreateDateTime_1",
"ns" : "HospitalServiceLogging.InfoLog"
}
]
三:mongodb-副本集-增量备份及恢复
MongoDB数据备份的增量备份和增强备份的增量恢复可以通过使用mongodump和mongorestore命令进行实现
如果是副本集:
--host replicaSetName/hostname:port
增量备份
mkdir -p /data/mongo/backup/`date +%Y-%m-%d`
docker exec -it 8fe8e2660999 mongodump -h mongo-rs/192.168.10.14:27018,192.168.10.14:27019,192.168.10.14:27020 -o /data/backup/`date +%Y-%m-%d` --oplog -u=root -p=Aa123456 --authenticationDatabase=admin
增量恢复
docker exec -it mongodb02 mongorestore -h mongo-rs/192.168.10.14:27018,192.168.10.14:27019,192.168.10.14:27020 --dir /data/backup/`date +%Y-%m-%d` --oplogReplay -u=root -p=Aa123456 --authenticationDatabase=admin
增量恢复前记录
模拟误操作删除一条记录
sh mongo_increment_restore.sh
增量恢复后记录(原有记录会提示ID重复)
#恢复单个集合
your_database_name 是要恢复的目标数据库的名称,your_collection_name 是要恢复的集合的名称,/path/to/backup/folder/your_collection.bson 是指定的备份文件路径和文件名
mongorestore --db your_database_name --collection your_collection_name /path/to/backup/folder/your_collection.bson
#备份指定集合下的单条记录
#单条记录
docker exec -it mongodb02 mongodump -h mongo-rs/192.168.10.14:27018,192.168.10.14:27019,192.168.10.14:27020 -d meng -c meng -q '{"_id":"64dae6fe6ce76861bbec69e4"}' -o /data/backup/`date +%Y-%m-%d` -u=root -p=Aa123456 --authenticationDatabase=admin
docker exec -it mongodb02 mongoexport -h mongo-rs/192.168.10.14:27018,192.168.10.14:27019,192.168.10.14:27020 -d meng -c meng -q '{"_id":{"$oid":"64dad5ea6ce76861bbec69bc"}}' -o /data/backup/`date +%Y-%m-%d`/meng.json -u=root -p=Aa123456 --authenticationDatabase=admin
删除后,尝试恢复
docker exec -it mongodb02 mongoimport -h mongo-rs/192.168.10.14:27018,192.168.10.14:27019,192.168.10.14:27020 -d meng -c meng --type json --file /data/backup/date +%Y-%m-%d/meng.json -u=root -p=Aa123456 --authenticationDatabase=admin
查看已经恢复
#增量
docker exec -it mongodb02 mongodump -h mongo-rs/192.168.10.14:27018,192.168.10.14:27019,192.168.10.14:27020 -d local -c oplog.rs -q '{"ts":{"$gt": {"$timestamp":{"t":1692175198, "i":1}}}}' -o /data/backup/date +%Y-%m-%d/oplog1.json -u=root -p=Aa123456 --authenticationDatabase=admin
#使用jq获取某个json下的多层级值
docker exec -it 53befdae9851 bsondump /data/backup/2023-12-07/oplog.bson |jq '.ts."$timestamp".t'|head -1
#取最大值
TimeValue=docker exec -it 53befdae9851 bsondump /data/backup/${Curdate}/oplog.bson |jq '.ts."$timestamp".t'|sort -r|head -1