MongoDB 权限、备份、还原、去重
权限
数据安全是数据库至关重要的一部分,那么下面是设置MongoDB的用户权限的大致过程。
首先,在无授权模式下新建数据库管理员:
启动数据库服务:
mongod
启用命名行工具:
mongo
use admin
db.createUser({user:"gly",pwd:"P@ssword",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
然后,为指定数据库新建用户:
db.createUser({user:"testdb",pwd:"P@ssword",roles:[{role:"readWrite",db:"testdb"},{role:"userAdmin",db:"testdb"},{role:"dbAdmin",db:"testdb"}]})
最后,在授权模式下访问数据:
mongod -auth
启用命名行工具:
mongo
use testdb
db.auth("testdb","P@ssword")
db.CompanyCards.find({}).limit(1)
注意:
设置密码时,字符中尽量不要使用‘@’,否则在配置数据库连接字符串时会无法正常连接,比如连接字段串mongodb://testdb:P@ssword!@139.219.231.46:27017/testdb?authSource=testdb
,‘@’作为数据库用户名:密码与数据库主机地址之间的分隔符,故不能使用’@’;正确的连接字符串可以配置为:mongodb://testdb:Password!@139.219.231.46:27017/testdb?authSource=testdb
。以上连接字符串中数据和用户名称都为testdb。
备份(导出)
命令:
mongoexport -u UName -p P@ssword -h 127.0.0.1:27017 -d DBName -c CName --type csv -o C:\DBak\CName_201708.csv -f Name,Code,Status
解译:
数据导出工具 mongoexport
运行:
结果:
执行耗时:约18分钟;导出数据: 68,668,050 条;导出文件:4,159,994KB;测试服务器:2核8G。
导出的文件数据示例:
还原(导入)
命令:
mongoimport -h 127.0.0.1:27017 -d DBName -c CName --type csv --file C:\DBak\CName_20170800.csv -u UName -p P@ssword --fields Name.string(),Code.string(),Status.int32() --columnsHaveTypes
在导入时,我显示指定了Document的Fields,而对于导出的数据,我不想要第一行,因为它是标题行。那么有两种方法:一,直接导入,然后删除;二,删除标题,然后导入。
方法一:
方法二:
解译:
数据导入工具 mongoexport
运行:
结果:
执行耗时:约27分钟;导入数据: 68,668,050 条;导入文件:4,227,053KB;测试服务器:2核8G。
去重
索引:
use testdb
db.auth("testdb","P@ssword")
db.CompanyCards.createIndex( { Name: 1 } )
命令:
db.CompanyCards.aggregate([{ $group: { _id: {Name: '$Name'}, count: {$sum: 1}, dups: {$addToSet: '$_id'}}},{ $match: {count: {$gt: 1}}}],{ allowDiskUse: true }).forEach( function(doc){ doc.dups.shift(); db.CompanyCards.remove({_id: {$in: doc.dups}});});
注意:因为我们操作的数据集合比较大,所以允许使用磁盘存储 allowDiskUse:true
。
运行:
因为耗时比较长,所以就不写结果了。
以下数据是我之前做的测试结果,提供参考:
去重前:1263765 条
去重后:1258414 条
总耗时:53.151 s
过滤掉:5351 条
笔记本:4核8G,i5处理器。