MongoDB入门学习(一):MongoDB的安装和管理(四)

2015-07-24 08:55:59 · 作者: · 浏览: 1
WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead Successfully added user: { "user" : "test1", "roles" : [ "read" ] } > db.addUser("test2", "12345") WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead Successfully added user: { "user" : "test2", "roles" : [ "dbOwner" ] } > use admin switched to db admin > show collections system.indexes system.users system.version > db.system.users.find() { "_id" : "admin.tp", "user" : "tp", "db" : "admin", "credentials" : { "MONGODB-CR" : "e4aafd1c8d19d9e490192fe5bf43ffe0" }, "roles" : [ { "role" : "root", "db" : "admin" } ] } { "_id" : "test.test1", "user" : "test1", "db" : "test", "credentials" : { "MONGODB-CR" : "2da1438b5a04dd46cfdf97c40a3c6d71" }, "roles" : [ { "role" : "read", "db" : "test" } ] } { "_id" : "test.test2", "user" : "test2", "db" : "test", "credentials" : { "MONGODB-CR" : "4accbd2cb1dce25ed8b3b162103b0b87" }, "roles" : [ { "role" : "dbOwner", "db" : "test" } ] }

在admin中添加了一个用户tp,在test数据库中添加了两个用户test1和test2,addUser()有三个参数,第一个是用户名,第二个是密码,第三个是只读状态,设置true为只读。从用户集合system.users可以看出,tp是admin数据库中的超级用户,有root权限,test1只有read权限,test2是dbOwner,可以读也可以写。addUser还能修改用户密码和只读状态。下面重启MongoDB服务器,添加--auth命令选项来开启安全检查,然后再通过mongo来连接:

> show dbs
2014-06-05T17:59:57.519+0800 listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13
} at src/mongo/shell/mongo.js:47
> use test
switched to db test
> db.auth("test1", "12345")
1
> show collections
people
system.indexes
> db.people.find()
{ "_id" : ObjectId("53903f7af73bb0df22f8e4a6"), "name" : "Mary", "age" : 10 }
> db.people.insert({"name" : "join", "age" : 20})
WriteResult({
        "writeError" : {
                "code" : 13,
                "errmsg" : "not authorized on test to execute command { insert: \"people\", documents: [ { _id: ObjectId('53903fd6959e902814f56d8c'), name: \"join\", age: 20.0 } ], ordered: true }"
        }
})
> db.auth("test2", "12345")
1
> db.people.find()
{ "_id" : ObjectId("53903f7af73bb0df22f8e4a6"), "name" : "Mary", "age" : 10 }
> db.people.insert({"name" : "join", "age" : 20})
WriteResult({ "nInserted" : 1 })
> use admin
switched to db admin
> db.auth("tp", "12345")
1
> show dbs
admin  0.078GB
local  0.078GB
test   0.078GB

连接到MongoDB服务器后没有进行用户认证,所以什么都不能干,当使用test数据库并进行用户认证后,就可以查看test库中的集合,因为test1只能读不能写,所以find可以成功而insert失败,test2既能读也能写,使用admin数据库进行用户认证后就可以查看所有的数据库列表。其实这样的认证用途不是很大,只是一种方式而已,最安全的方式还是限制访问。

3).数据备份

①.数据文件备份

最简单的备份就是数据文件的备份,就是直接赋值data/db这个目录,因为我们前面已经指定了数据目录就是data/db,那么MongoDB多有的数据都在这里,但是有个问题就是最新的数据还在缓存中,没用同步到磁盘,可以先停止shutdownServer()再备份。但是这样会影响MongoDB正常的工作。

②.mongodump和mongorestore

bin中还有mongodump和mongorestore两个可执行文件,这个是对MongoDB的某个数据库进行备份,可以在MongoDB正在运行时进行备份,比如备份test数据库,然后将备份的数据库文件再倒入别的MongoDB服务器上。这种备份的方式备份的不是最新数据,只是已经写入MongoDB中的数据,可能还有的数据在缓存中没有写入,那么这部分数据就是备份不到的。mongodump和mongorestore也可以通过--help查询所有选项。

[tp0352@server0 bin]$ ./mongodump --port 9352 -d test -o test_data
connected to: 127.0.0.1
2014-06-05T19:00:03.381+0800 DATABASE: test      to     test_data/test
2014-06-05T19:00:03.411+0800    test.system.indexes to test_data/test/system.indexes.bson
2014-06-05T19:00:03.426+0800             1 documents
2014-06-05T19:00:03.426+0800    test.test to test_data/test/test.bson
2014-06-05T19:00:03.463+08