Mongodb 数据库的简单使用

Posted 我只想躺平

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongodb 数据库的简单使用相关的知识,希望对你有一定的参考价值。

一、 Mongodb 的认证

一、启用认证

  # 默认情况下,mongodb是没有使用认证功能的,在配置文件中添加  auth=true  开启认证功能,开启后要重启下 Mongodb

   [root@test220 ~]# /usr/local/mongodb/bin/mongod --shutdown -f /usr/local/mongodb/config/mongodb.conf

   [root@test220 ~]# echo "auth=true" >> /usr/local/mongodb/config/mongodb.conf

   [root@test220 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f  /usr/local/mongodb/config/mongodb.conf

二、配置账号进行验证

   #  设置两个用户账号 admin 、 testuser 用来测试

   [root@test220 ~]# mongo 10.6.2.220:27017

   > use admin
   switched to db admin

   > db.createUser(user:"admin",pwd:"123456",roles:[ role:"root", db:"admin"  ] )
   Successfully added user: 
    "user" : "admin",
    "roles" : [
        
            "role" : "root",
            "db" : "admin"
        
      ]
    

    > use test
    switched to db test

     > db.createUser(user:"testuser",pwd:"123456",roles:[ role:"readWrite", db:"test"  
     ] )
     Successfully added user: 
    "user" : "testuser",
    "roles" : [
        
            "role" : "readWrite",
            "db" : "test"
        
       ]
     

三、进行验证登录

  #  登录两种验证方法,第一种是登录时验证,第二种是在mongodb的shell控制台验证

  1、第一种方法

  #  语法格式: mongo -u 用户名 -p 用户密码 数据库服务器地址:端口号/数据库名

  [root@test220 ~]# mongo -u admin -p 123456 10.6.2.220:27017/admin 
  [root@test220 ~]# mongo -u testuser -p 123456 10.6.2.220:27017/test

  2、第二种方法

  [root@test220 ~]# mongo 10.6.2.220:27017      ##  貌似登入进去了,实则啥也干不了
  > use admin                   
  switched to db admin
  > show dbs                         #  此时还没认证,就算是 admin 用户也无法查看任何信息
  > db.auth("admin","123456")
  1                                  #  返回为 1 就是验证通过
  > show dbs
  admin   0.000GB
  config  0.000GB
  local   0.000GB 

  > use test
  switched to db test
  > show dbs                         #  这里报错是提示没有权限查看,上面定义的是 test 库读写权限   
  E  QUERY    [js] uncaught exception: Error: Failed to acquire database information from privileges 

  > db.auth("testuser","123111")     #  验证错误的情况,下面返回值为 0 
  Error: Authentication failed.
  0

  > db.auth("testuser","123456")
  1

  > db.class.insert("name":"zhangsan")     #  在test库内 可以写入数据、查询数据
   WriteResult( "nInserted" : 1 )

  > db.class.find()
   "_id" : ObjectId("61dd25b187f250afc6d4f3e2"), "name" : "zhangsan" 

四、修改用户登录口令

 #  两种修改方法

1、第一种方法:  db.changeUserPassword("用户名","新密码")

终端 A :
[root@test220 ~]# mongo 10.6.2.220:27017
> use admin
  switched to db admin
> db.auth("rose","123123")      #  使用原账号口令验证通过
1

终端 B :
> use admin
switched to db admin
> db.changeUserPassword("rose","abc123")   #  更改原账号口令

终端 A 验证:
> use admin
switched to db admin
> db.auth("rose","123123")        #  原账号口令登录验证不通过
Error: Authentication failed.
0
> db.auth("rose","abc123")        #  新的账号口令登录验证通过
1

2、第二种方法:  db.updateUser("用户名",pwd:"新密码")

终端 B :
> use admin
 switched to db admin
> db.updateUser("rose",pwd:"123456")

终端 A :
[root@test220 ~]# mongo 10.6.2.220:27017
> use admin
 switched to db admin

> db.auth("rose","123123")
 Erro: Authentication failed.
 0

> db.auth("rose","123456")
 1

五、删除用户

> use admin
switched to db admin

> db.dropUser("rose")
true

二、Mongodb 的权限


一、mongodb 角色和权限

#  role: 
数据库用户角色:read、readwrite
数据库管理角色:dbAdmin、dbOwner、userAdmin
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色:backup、restore
跨数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色:root 
内部角色:__system

#  常用权限   
read:       允许用户读取指定数据库
readwrite:  允许用户读写指定数据库
userAdmin:  允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
dbAdmin:    允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问

readAnyDatabase:      只在admin数据库中可用 赋予用户所有数据库的读权限
readWriteAnyDatabase: 只在admin数据库中可用 赋予用户所有数据库的读写权限
userAdminAnyDatabase: 只在admin数据库中可用 赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:   只在admin数据库中可用 赋予用户所有数据库的dbAdmin权限

root:                 只在admin数据库中可用 超级账号,超级权限
clusterAdmin:         只在admin数据库中可用 赋予用户所有分片和复制集相关函数的管理权限 

二、关于权限的理解

1、mongodb是没有默认管理员账号,所以要先添加管理员账号,在开启权限认证。
2、切换到admin数据库,添加的账号才是管理员账号。
3、用户只能在用户所在数据库登录,包括管理员账号。
4、管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以

三、配置用户权限
   操作步骤:
   1、切换到换到相关数据库下
   2、添加账号(账号、密码、角色)

  配置说明: 1、添加管理员用户账号,切换到admin 数据库下操作
            2、添加普通用户账号,切换到相应的数据库下操作
            3、roles 里面可以指定多个权限和多个数据库对象
            4、customData 存放一些用户相关的自定义数据库,是可选项,其他的都是必须的选项

   添加用户语法:
   db.createUser(user:"xxx",pwd:"xxx",customData:  <any information> ,roles:  
   [role:"xxx",db:"xxx"])
    添加的用户名  用户密码  用户角色:具体那个角色,授权的数据库库名 

   示例:
   [root@test220 ~]# mongo 10.6.2.220:27017

    > use test
    switched to db test

     > db.createUser(user:"testuser",pwd:"123456",roles:[ role:"readWrite", db:"test"  
     ] )
     Successfully added user: 
    "user" : "testuser",
    "roles" : [
        
            "role" : "readWrite",
            "db" : "test"
        
       ]
     

四、登录验证
   建议另外开启一个终端进行测试

  [root@test220 ~]# mongo 10.6.2.220:27017    #  貌似登入进去了,实则啥也干不了

  > use admin                   
  switched to db admin
  > show dbs                        #  此时还没认证,就算是 admin 用户也无法查看
  > db.auth("admin","123456")
  1                                 #  返回为 1 就是验证通过
  > show dbs
  admin   0.000GB
  config  0.000GB
  local   0.000GB 

  > use test
  switched to db test
 > show dbs                        #  这里报错是提示没有权限查看,上面定义的是 test 库读写权限   
  E  QUERY    [js] uncaught exception: Error: Failed to acquire database information from   privileges 

 > db.auth("testuser","123111")    #  验证错误的情况,下面返回值为 0 
 Error: Authentication failed.
 0

 > db.auth("testuser","123456")
 1

 > show users                     #  没有show 权限 
  E  QUERY    [js] uncaught exception: Error: logical sessions can not have multiple authenticated users

 > db.class.insert("name":"zhangsan")     #  在test库内 可以写入数据、查询数据
 WriteResult( "nInserted" : 1 )
 > db.class.find()
  "_id" : ObjectId("61dd25b187f250afc6d4f3e2"), "name" : "zhangsan" 

五、更新权限

 #  更新用户涉及到 ---- 新角色权限、删除用户

 1、添加权限示例

 1) 创建一个用户 rose ,设置 test 库的  readWrite 权限

 #  打开一个终端,这里且称为 ---  终端 A 
 > use admin
 switched to db admin
 > db
 admin

 > show dbs
 admin     0.000GB
 config    0.000GB
 local     0.000GB
 test      0.000GB
 testmore  0.000GB

 > db.createUser(user:"rose",pwd:"123456",roles:[ role:"readWrite", db:"test" ] )
 Successfully added user: 
    "user" : "rose",
    "roles" : [
        
            "role" : "readWrite",
            "db" : "test"
        
    ]
 

2)查看验证下上面设置的权限
  #  另开一个终端查看  这里称之为--- 终端 B

 > use admin
 switched to db admin
 > db.auth("admin","123456")
 1

 > show users
 
    "_id" : "admin.rose",
    "userId" : UUID("339082ab-10f8-44ca-a759-b218eab64614"),
    "user" : "rose",
    "db" : "admin",
    "roles" : [
        
            "role" : "readWrite",
            "db" : "test"
        
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
 

2、更改权限示例
 1)更改权限

  #  更改权限分为两种情况:
      一种是在以前权限上增加其他的权限
      另外一种是将现在的权限更改为另外一种权限

  #  增加权限使用命令: db.grantRolesToUser
  #  更改权限使用命令: db.updateUser

 2) 增加权限示例:
   终端 A:
   > db.grantRolesToUser("rose",[role:"readWrite",db:"testmore"])

   终端 B:
   > show users
   
    "_id" : "admin.rose",
    "userId" : UUID("339082ab-10f8-44ca-a759-b218eab64614"),
    "user" : "rose",
    "db" : "admin",
    "roles" : [
        
            "role" : "readWrite",
            "db" : "test"
        ,
        
            "role" : "readWrite",
            "db" : "testmore"
        
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
   
   #  这里可以看到用户 rose 现在的权限是 对两个库都有读写权限了

 3) 更改上面的 rose 权限

   终端 A:
   > updateUser("rose",pwd:123456,roles:[role:"read",db:"test"])

   终端 B:
   > show users
   
    "_id" : "admin.rose",
    "userId" : UUID("339082ab-10f8-44ca-a759-b218eab64614"),
    "user" : "rose",
    "db" : "admin",
    "roles" : [
        
            "role" : "read",
            "db" : "test"
        
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
   
   #  发现  rose 对 test 库的权限变了,并且原来对 testmore 库的权限没有了,说明 update是权限取代

   #  假如上述更改权限命令换成
   #  db.updateUser("rose",pwd:123123,roles:[role:"read",db:"test"])
   开启第三终端登录验证下,会发现此时 rose 的密码也随之修改了,这也算是 updateUser 的另一功能吧

 3、删除权限示例:
    删除 rose 对 test 库的权限

    终端 A :
    > db.revokeRolesFromUser("rose",[role:"readWrite",db:"test"])

    终端 B:
    > show users
    
    "_id" : "admin.rose",
    "userId" : UUID("339082ab-10f8-44ca-a759-b218eab64614"),
    "user" : "rose",
    "db" : "admin",
    "roles" : [
        
            "role" : "readWrite",
            "db" : "testmore"
        
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
   

三、Mongodb 的备份与恢复


一、备份恢复工具介绍

   1、mongodb自带的有两款备份恢复工具,分别是
     1)mongoexport/mongoimport:导入/导出的是JSON格式或者CSV格式
     2)mongodump/mongorestore :导入/导出的是BSON格式。

     二者区别:   
     1)JSON的优劣:
       JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性
       JSON虽然具有较好的跨版本通用性,但其只保留了数据部分,不保留索引,账户等其他基础信息

      2)BSON的优劣:
       不同版本之间用 mongodump/mongorestore可能不会成功
       当无法使用BSON进行跨版本的数据迁移的时候,可使用JSON格式

   2、第三方连接工具自带的备份和恢复功能
      具体就看每个工具具体的使用方法了,当然也不是所有工具都有这样的动能,具体情况再看了

二、数据的备份

 1、 备份前数据查看

    [root@test220 ~]# mongo -u admin -p 123456 10.6.2.220:27017/admin

    > use admin
    switched to db admin
    > show dbs
    admin     0.000GB
    config    0.000GB
    local     0.000GB
    test      0.000GB
    testmore  0.000GB

    > use test
    switched to db test
    > show collections
    class
    fruit
    game
    info

    > db.fruit.find()
     "_id" : ObjectId("61de7780f2cb355cb7a46a1c"), "name" : "apple", "price" : 8.5 
     "_id" : ObjectId("61de77a1f2cb355cb7a46a1d"), "name" : "banana", "price" : 3.5 
     "_id" : 80, "name" : "orange", "price" : 6.5 
     "_id" : 70, "name" : "pear", "price" : 6.8 
     "_id" : ObjectId("61de786ef2cb355cb7a46a1f"), "name" : "peach", "price" : 11.5 
     "_id" : ObjectId("61de78d9f2cb355cb7a46a20"), "name" : "grapes", "price" : 11.5 
     "_id" : ObjectId("61de7931f2cb355cb7a46a22"), "name" : "plum", "price" : 5.5 

    > db.class.find()
     "_id" : ObjectId("61dd25b187f250afc6d4f3e2"), "name" : "zhangsan" 
     "_id" : ObjectId("61de53da57216ed19d04e4b1"), "name" : "kite", "age" : 20 
     "_id" : ObjectId("61de543e57216ed19d04e4b3"), "name" : "tim", "age" : 10 
     "_id" : ObjectId("61de543e57216ed19d04e4b4"), "name" : "jack", "age" : 10 
     "_id" : ObjectId("61de54dc57216ed19d04e4b6"), "name" : "tim", "age" : 55 

    > db.info.find()
     "_id" : ObjectId("61de6c004f8fa3f11da6cdce"), "name" : "rose", "age" : 60 
     "_id" : ObjectId("61e10f3d0ab2cab372251a11"), "name" : "tim" 
     "_id" : ObjectId("61e10f620ab2cab372251a12"), "name" : "tim", "age" : 30 

 2、 进行备份操作

 1) 使用 mongodump  进行备份
 [root@test220 ~]# mkdir -p /backup/backup01,02.03,04

 #  全部数据库备份
 [root@test220 ~]# mongodump -uadmin -p123456 --port 27017 --authenticationDatabase admin   -o /backup/backup01

 #  备份指定的数据库
 [root@test220 ~]# mongodump -uadmin -p123456 --port 27017 --authenticationDatabase admin   -d test -o /backup/backup02

 #  备份指定数据库的指定集合
 [root@test220 ~]# mongodump -uadmin -p123456 --port 27017 --authenticationDatabase admin   -d test -c class -o /backup/backup03

 #  备份后对文件进行压缩
 [root@test220 ~]# mongodump -uadmin -p123456 --port 27017 --authenticationDatabase admin   -d test -c class -o /backup/backup04 --gzip

 2)使用 mongoexport 进行备份

  [root@test220 ~]# mkdir -p /backup/backup11,22

  备份为 JSON 格式
  [root@test220 ~]# mongoexport -uadmin -p123456 --port 27017 --authenticationDatabase          admin -d test -c class -o /backup/backup11/class.json

  备份为 csv 格式
  [root@test220 ~]# mongoexport -uadmin -p123456 --port 27017 --authenticationDatabase          admin -d test -c class --type=csv -f name,age -o /backup/backup22/class.csv

3、备份后查看备份文件

  [root@test220 ~]# ll /backup/backup01
  drwxr-xr-x 2 root root 128 Jan 14 14:00 admin
  drwxr-xr-x 2 root root 182 Jan 14 14:00 test
  drwxr-xr-x 2 root root 145 Jan 14 14:00 testmore

  [root@test220 ~]# ll /backup/backup02
  drwxr-xr-x 2 root root 182 Jan 14 14:01 test

  [root@test220 ~]# ll /backup/backup03/test/
  -rw-r--r-- 1 root root 685 Jan 14 14:13 class.bson
  -rw-r--r-- 1 root root 158 Jan 14 14:13 class.metadata.json

  [root@test220 ~]# ll /backup/backup04/test/
  -rw-r--r-- 1 root root 284 Jan 14 14:02 class.bson.gz
  -rw-r--r-- 1 root root 146 Jan 14 14:02 class.metadata.json.gz

  [root@test220 ~]# ll /backup/backup11
  -rw-r--r-- 1 root root 956 Jan 14 14:24 class.json

  [root@test220 ~]# ll /backup/backup22/
  -rw-r--r-- 1 root root 120 Jan 14 14:25 class.csv

  #  其实可以发现,这种方式备份好的文件是可以直接看懂的,不论是 JSON 或者 CSV 
  [root@test220 ~]# cat /backup/backup11/class.json 
  "_id":"$oid":"61dd25b187f250afc6d4f3e2","name":"zhangsan"
  "_id":"$oid":"61de53da57216ed19d04e4b1","name":"kite","age":20.0
  "_id":"$oid":"61de543e57216ed19d04e4b3","name":"tim","age":10.0
  "_id":"$oid":"61de543e57216ed19d04e4b4","name":"jack","age":10.0
  "_id":"$oid":"61de54dc57216ed19d04e4b6","name":"tim","age":55.0

  [root@test220 ~]# cat /backup/backup22/class.csv 
  name,age
  zhangsan,
  kite,20
  tim,10
  jack,10
  tim,55

 #  反观 BSON 格式的,则是到乱码类的密文,无法读出来,安全性上比用 mongoexport 要好
  [root@test220 ~]# cat /backup/backup03/test/class.bson 
  )_idaۥ±ఆճname zhangsan2_idaݓٗ!nѝ䯂namekiteage4@1_idaݔ>W!nѝ䱂nametimage$@2_idaݔ>W!nѝ䲂       namejackage$@1_idaݔۗ!nѝ䴂nametimageK@2_idaݔۗ!nѝ䵂  namejackageN@3_idaݧO£�3namemlikeage$@1_idaݨ6O£�Bnamebobage>@1_idaݨ¿O£�_namecccageI@1_idaݩ¢O£�onameabc

4、将上面的备份文件进行恢复测试

  1) mongodump 备份的恢复工具是 mongorestore

   单库恢复,恢复到指定一个新库
   [root@test220 ~]# mongorestore -uadmin -p123456 --port 27017 --authenticationDatabase admin -d test01 /backup/backup02/test

   单库恢复,恢复之前把原来库的集合 drop 掉
   [root@test220 ~]# mongorestore -uadmin -p123456 --port 27017 --authenticationDatabase admin -d test --drop /backup/backup02/test

   单表恢复,恢复到指定一个新表
   [root@test220 ~]# mongorestore -uadmin -p123456 --port 27017 --authenticationDatabase admin -d test01 -c class02 /backup/backup02/test/class.bson

  2) mongoexport 备份的恢复工具是 mongoimport

   [root@test220 ~]# mongoimport -uadmin -p123456 --port 27017 --authenticationDatabase admin -d test -c class11 /backup/backup11/class.json 

   [root@test220 ~]# mongoimport -uadmin -p123456 --port 27017 --authenticationDatabase admin -d test -c class22 --type=csv --headerline --file /backup/backup22/class.csv

  3) 去数据库里面查看验证

   [root@test220 ~]# mongo -u admin -p 123456 10.6.2.220:27017/admin

   > show dbs
    admin     0.000GB
    config    0.000GB
    local     0.000GB
    test      0.000GB
    test01    0.000GB
    testmore  0.000GB

   > use test01
   switched to db test01
   > show collections
    class
    class02
    fruit
    game
    info

    > db.class.find()
     "_id" : ObjectId("61dd25b187f250afc6d4f3e2"), "name" : "zhangsan" 
     "_id" : ObjectId("61de53da57216ed19d04e4b1"), "name" : "kite", "age" : 20 
     "_id" : ObjectId("61de543e57216ed19d04e4b3"), "name" : "tim", "age" : 10 
     "_id" : ObjectId("61de543e57216ed19d04e4b4"), "name" : "jack", "age" : 10 
     "_id" : ObjectId("61de54dc57216ed19d04e4b6"), "name" : "tim", "age" : 55 

     db.class02.find()
     "_id" : ObjectId("61de53da57216ed19d04e4b1"), "name" : "kite", "age" : 20 
     "_id" : ObjectId("61de543e57216ed19d04e4b3"), "name" : "tim", "age" : 10 
     "_id" : ObjectId("61de543e57216ed19d04e4b4"), "name" : "jack", "age" : 10 
     "_id" : ObjectId("61de54dc57216ed19d04e4b6"), "name" : "tim", "age" : 55 
     "_id" : ObjectId("61dd25b187f250afc6d4f3e2"), "name" : "zhangsan" 

    > use test
    switched to db test
    > show collections
    class
    class11
    class22
    fruit
    game
    info

    > db.class11.find()
     "_id" : ObjectId("61dd25b187f250afc6d4f3e2"), "name" : "zhangsan" 
     "_id" : ObjectId("61de53da57216ed19d04e4b1"), "name" : "kite", "age" : 20 
     "_id" : ObjectId("61de543e57216ed19d04e4b3"), "name" : "tim", "age" : 10 
     "_id" : ObjectId("61de54dc57216ed19d04e4b6"), "name" : "tim", "age" : 55 
     "_id" : ObjectId("61de543e57216ed19d04e4b4"), "name" : "jack", "age" : 10 

    > db.class22.find()
     "_id" : ObjectId("61e118b48f280e2260ed80f2"), "name" : "zhangsan", "age" : "" 
     "_id" : ObjectId("61e118b48f280e2260ed80f3"), "name" : "kite", "age" : 20 
     "_id" : ObjectId("61e118b48f280e2260ed80f4"), "name" : "tim", "age" : 10 
     "_id" : ObjectId("61e118b48f280e2260ed80f5"), "name" : "tim", "age" : 55 

   #  总结: 通过恢复后的对比喝上面种种发现
    1、 mongoexport 备份的 CSV 格式,恢复时可能存在问题
        "_id" : ObjectId("61e118b48f280e2260ed80f2"), "name" : "zhangsan", "age" : "" 
        无故多出来 age 字段,原来的文档里面实则没有

    2、 mongoexport和mongoimport 只能够针对集合(表)操作
        而mongodump和mongorestore则对数据库(全库和单库)、集合都可以操作

    3、 安全性上, mongodump和mongorestore 也要安全很多
        而且,mongodump和mongorestore支持备份时进行压缩操作,提高了速度

以上是关于Mongodb 数据库的简单使用的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb使用总结

MongoDB的简单操作

高可用的MongoDB集群

MongoDB数据库简单操作

每天一篇,学习业内领先的NoSQL数据库=》MongoDB

Mongodb使用