一.mongodb介绍
MongoDB是一个基于分布式文件存储 [1] 的数据库。由C++语言编写。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。官方网址:
https://www.mongodb.com
mongodb和关系型数据库的对比:
mongodb的数据结构:
二.mongodb安装(当前最新4.2版本)
官方安装文档(失效的话可以自己在官方找):
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
下面参考官方提供的安装方式安装。
首先第一步搭建好官方的yum源:
cd /etc/yum.repos.d/
vim mongodb-org-4.2.repo
#添加下面的配置
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
#可以先清空yum缓存并重新生成
yum clean all
yum makecache
#查看yum仓库是否包含mongodb
yum list |grep mongodb
#安装mongodb
yum install -y mongodb-org
连接mongodb
先来看一下mongodb的配置文件内容:
vim /etc/mongod.conf
#下面是配置文件中默认未注释部分,并不是全部的
systemLog: #这个是日志文件
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
storage:
dbPath: /var/lib/mongo #这个是数据库的数据存放目录
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile #这个是进程文件路径
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27017 #默认端口
bindIp: 127.0.0.1 #绑定的ip,多个ip用逗号相隔
启动mongodb:
systemctl start mongod
查看端口:
netstat -lnpt |grep mon
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 1626/mongod
连接进入mongodb:
#默认端口和ip,可以直接mongo进入
mongo
#用ip和端口连接进入
mongo --port 27017 --host 127.0.0.1
#如果设置了用户和密码
[root@ligen ~]# mongo -u后面接用户名 -p后面接密码 --authenticationDatabase 后面接你加密的数据库
#这个和mysql类似,用户通常是限制于某一个数据库
三.mongodb用户管理
创建用户:
#首先一定要进入一个数据库,才能创建用户,数据库和用户是相关联的
#例如给admin数据库创建一个admin管理员用户,密码admin123
use admin #创建并且进入
db.createUser( { user:"admin",customData:{description:"superuser"},pwd:"admin123",roles:[ { role:"root",db:"admin" } ] } )
#命令说明:customData是关于用户的描述可省略,pwd是密码,role角色为root表示管理员,db表示授权给admin数据库
此时创建好用户后,可以查看,查看也是要在数据库里面的,并且在哪里创建的用户就只能是在哪里查看的到:
show users
#或者
db.system.users.find()
其中显示结果有这么个字段:"_id" : "admin.admin"表示在admin库里面创建的admin用户。
删除用户:
#例如再次在admin库下创建一个ligen用户,密码aa,授权给testdb库,权限是read
db.createUser( { user:"ligen",pwd:"aa",roles:[ { role:"read",db:"testdb" } ] } )
#查看是否创建成功
show users
#如果有"_id" : "admin.ligen"就没问题
#注意此时我们在testdb库里面是否可以查看ligen用户呢,试一下
use testdb #创建并进入
show users #结果为空,答案是否定的,只能在创建的库下面查看
#删除ligen用户,也是要回到admin库下面
use admin
db.dropUser("ligen")
通过创建的用户和密码登入mongodb对应的库,例如我们已经创建好的admin:
#我们需要先编辑一下启动脚本,在OPTIONS=后面加--auth,让用户生效
vim /usr/lib/systemd/system/mongod.service
#添加
Environment="OPTIONS=--auth -f /etc/mongod.conf"
#重启mongodb
systemctl restart mongod
#如果报错,没报错可以不用看下面的
#因为mongodb第一次启动的时候是通过root管理员启动的,需要把进程文件删除,然后启动了,这次启动它会以mongod用户启动
rm -f /tmp/mongodb-27017.sock
systemctl start mongod
#通过用户密码登入
mongo -u "admin" -p "admin123" --authenticationDatabase "admin"
#注意如果不是默认127.0.0.1和默认端口,就需要指定host和port
#验证
use admin
show users
身份权限验证
#上面举例用户ligen,有什么办法可以是它在testdb中有权限查看呢,需要先在admin中验证:
db.auth("ligen","aa") #这样就可以在testdb中查看了
roles角色说明
Read:读权限
readWrite: 读写
dbAdmin:允许用户在指定数据库中执行管理函数,如索引、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
clusteradmin:旨在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDateabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
useradminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的useradmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
root:只在admin数据库可用,超级权限