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

运行:

mongodb 权限常用操作_数据

mongodb 权限常用操作_用户名_02

结果:

执行耗时:约18分钟;导出数据: 68,668,050 条;导出文件:4,159,994KB;测试服务器:2核8G。

导出的文件数据示例:

mongodb 权限常用操作_数据_03

还原(导入)
命令:
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,而对于导出的数据,我不想要第一行,因为它是标题行。那么有两种方法:一,直接导入,然后删除;二,删除标题,然后导入。

方法一:

mongodb 权限常用操作_数据库_04

方法二:

mongodb 权限常用操作_数据库_05

解译:

数据导入工具 mongoexport

运行:

mongodb 权限常用操作_数据_06

mongodb 权限常用操作_mongodb 权限常用操作_07

结果:

执行耗时:约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

运行:

mongodb 权限常用操作_数据_08

mongodb 权限常用操作_数据_09

因为耗时比较长,所以就不写结果了。

以下数据是我之前做的测试结果,提供参考:

去重前:1263765 条
去重后:1258414 条
总耗时:53.151 s
过滤掉:5351 条

笔记本:4核8G,i5处理器。