MongoDB 摆好正确操作数据库的姿势
上篇文章讲了如何安装MongoDB以及碰到的一些问题。
这次,讲一下MongoDB的一些常规操作。
设置可远程连接
服务开启后,查看设置的bind_ip是否可远程
总所周知,linux运维对端口信息的查看都是使用netstat
netstat -nltp
local:访问端口的方式,0.0.0.0是对外开放端口;127.0.0.1说明只对本机访问,外面访问不了
Address:端口
Foreign Address:对外开放,一般都是0.0.0.0:*
Program name:此端口是使用的程序挂载此端口
设置MongoDB用户和密码
使用mongo命令连接MongoDB客户端
mongo
# 切换admin
use admin
# 添加超级用户
db.createUser({user:‘用户名‘,pwd:‘密码‘,roles:[‘root‘]);
# 创建普通用户
db.createUser({user:‘用户名‘,pwd:‘密码‘,roles:[{role:‘userAdminAnyDatabase‘,db:‘admin‘}]);
一般情况下,mongoDB 数据库都要建立认证连接,这就需要用户对数据库创建管理员和用户认证,而对于mongoDB 而言,在创建管理员和用户时,分配的roles 是决定用户操作数据库权限的关键
role类型:
1. 数据库用户角色:read、readWrite
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin
3. 备份恢复角色:backup、restore
4. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
5. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
6. 超级用户角色:root
read:授予User只读数据的权限
readWrite:授予User读写数据的权限
dbAdmin:在当前db中执行管理操作
dbOwner:在当前db中指定任何操作
UserAdmin:在当前db中管理User
backup:备份
restore:还原
readAnyDatabase:授予在所有数据库上读取数据的权限
readWriteAnyDatabase:授予在所有数据库上读写数据的权限
userAdminAnyDatabase:授予在所有数据库上管理User的权限
dbAdminAnyDatabase授予管理所有数据库的权限
clusterAdmin:授予管理集群的最高权限
clusterManager:授予管理和监控集群的权限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
clusterMonitor:授予监控集群的权限,对监控工具具有readonly的权限
hostManager:管理Server
root:只在admin数据库中可用。超级账号,超级权限
# 查看当前数据库用户
show users
# 查看所有数据库
show dbs
报错:身份认证失败(说白了,就是没有登录呗)
解决办法:认证(就相当于登录了)
use admin
db.auth(‘用户名‘,‘密码‘)
总结:
增加用户
db.createUser({user:‘用户‘,pwd:‘密码‘,roles:[{role:‘用户角色‘,db:‘目标数据库‘}]})
删除用户(2种方法,db.system.users指的是所有数据库中的指定用户,db只删除本数据库中指定用户)
db.dropUser(‘用户‘)
db.system.users.remove({_id:‘用户id‘})
db.system.users.remove({user:‘用户名‘})
修改用户
(1)授予用户角色权限
使用db.grantRolesToUser(‘用户‘,[role:‘角色权限‘,db:‘对应数据库‘])
(2)撤销用户的角色权限
使用db.revokeRolesFromUser(‘操作用户‘,[{role:‘要移除的角色权限‘,db:‘对应数据库‘}])
(3)修改密码
db.changeUserPassword(‘要修改密码的用户‘,‘修改后的密码‘)
MongoDB常用命令:
show dbs 显示数据库列表
show collections 显示当前数据库中的集合(就是关系型数据库中的表)
show users 显示用户(当前数据库的)
use <db name> 切换当前数据库,如果当前数据库不存在则创建该数据库
db.help() 显示数据库操作命令
db.foo.help() 显示集合操作命令,foo指的是集合(表)
db.foo.find() 对于当前数据库的foo集合进行数据查找(没有条件,默认查找所有数据)
db.foo.find({a:1}) 对于当前数据库的foo集合进行查找,条件是数据中有一个属性是a,值是1
其他命令:
db.dropDatabase() 删除当前使用的数据库
db.cloneDatabase(‘ip‘) 将指定机器上的数据库的数据克隆岛当前数据库
db.copyDatabase(‘mydb‘,‘temp‘,‘127.0.0.1‘) 将本机上的mydb的数据复制到temp数据库
db.repairDatabase() 修复当前数据库
db.getName() 查看当前使用的数据库,也可以直接使用db
db.stats() 显示当前db状态
db.version() 查看当前的db版本
db.getMongo() 查看当前db的连接机器地址
db.serverStatus() 查看数据库服务器的状态
注意:
1.root用户
创建完超级管理员后,到数据库创建自己的用户时,一定要切换到所在数据库上去创建用户,不然创建创建用户还是属于admin
2.查看用户
show users是查看当前数据库所有用户,想要查看所有用户:
use admin
# 这时候需要验证先用户
db.auth(‘用户名‘,‘密码‘)
# 查看所有用户
db.system.users.find().pretty()
3.一些经典错误
(1)过多用户验证,这个需要退出命令行,重新认证,一次登录只认证一个用户
(2)对于使用密码、换端口登录的伙计,这里有必要讲一下授权和认证,这两概念也是有点东西的
创建所有用户都在admin库下的system.users集合下,有如下字段:
db字段是用于authentication用的,就是连接MongoDB的时候,指定--authenticationDatabase选项的值。
roles字段里面的db是指这个用户具体是在db中扮演着什么样的角色(读、写、只读、只写、授权等),所以这个db和外面的db要分清楚了。
mongo -u 用户 -p 密码 -authenticationDatabase ‘认证的数据库‘ -port 端口
可以去看看mongo --help哦
(3)上篇MongoDB安装的时候有个问题,现在是时候解决了!!!
使用命令行启动MongoDB的话,必须指定dbpath,我就是配置文件的dbpath路径有问题,所以运行报错,无法启动。
还有一点就是:MongoDB目录必须有执行权限哦,要不然mongod命令执行会出错,我现在命令行启动MongoDB碰到的最多的两个错误(后面会写一篇专门的错误解决方法)
对于在服务器上配置MongoDB的操作差不多就是这些了,对于深入学习MongoDB的话,后面看吧