安装
yum安装
官方教程
编辑/etc/yum.repos.d/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 install -y mongodb-org
即可
安装成功后会被安装为service
- 通过
systemctl enable mongod
设置开机自启动 - 通过
systemctl start mongod
启动mongo服务 - 通过
systemctl stop mongod
关闭mongo服务 - 通过
systemctl disable mongod
关闭开机自启动
yum卸载
查看安装了哪些程序
yum list installed | grep mongo
根据以上结果进行卸载
yum remove -y mongodb-org-mongos.x86_64 mongodb-org-server.x86_64 mongodb-org-shell.x86_64 mongodb-org-tools.x86_64
二进制安装
官方下载地址
win所有版本
rhel70所有版本,适用Centos7
# 下载
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.12.tgz
# 解压
tar zxvf mongodb-linux-x86_64-rhel70-3.2.12.tgz
# 移动到你想的位置
mv mongodb-linux-x86_64-rhel70-3.2.12 /home/data/
cd /home/data/mongodb-linux-x86_64-rhel70-3.2.12
# 创建一个配置文件,示例:
cat mongo.conf
systemLog:
destination: file
logAppend: true
path: /home/data/mongodb-linux-x86_64-rhel70-3.2.12/27017/mongod_27017.log
storage:
dbPath: /home/data/mongodb-linux-x86_64-rhel70-3.2.12/27017
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
journalCompressor: snappy
cacheSizeGB: 2
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /home/data/mongodb-linux-x86_64-rhel70-3.2.12/27017/mongod_27017.pid
net:
port: 27017
bindIp: 192.168.0.100,127.0.0.1
# 配置文件中的路径不存在的话需要手动创建
mkdir 27017
# 启动
./bin/mongod -f mongo.conf
# PS. 我这边启动顺利,可能是环境比较完整,没有出现缺失lib的现象
集群搭建
我还不会
备份
使用root账号操作其他库
--authenticationDatabase admin
备份整个database
mongodump -h 127.0.0.1:27017 -d dbName -o . -u user -p password
不加-p的话,以交互式方式输入密码(当密码因含有特殊字符,无法直接写在shell中时,如带小括号的密码,可以采用这种方式)
mongodump -h 127.0.0.1:27017 -d dbName -o . -u user
备份具体Collection
mongodump -h 127.0.0.1:27017 -d dbName -c collectionName -o . -u user -p password
不加-p同上
恢复
mongorestore -h 127.0.0.1:27017 -d dbName --drop dumpFolder -u user -p password
当用户名和密码不是当前库的用户名密码时(比如admin里面的root账号),需要加上authenticationDatabase,否则会auth fail
mongorestore -h 127.0.0.1:27017 -d dbName --drop dumpFolder -u user -p password --authenticationDatabase admin
角色
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
- root:只在admin数据库中可用。超级账号,超级权限
- __system:内部角色
用户
创建用户
注意,roles中的db只说明有哪些db的权限而已,但是在账号密码登录的时候,还是需要在创建用户时的db下
db.createUser(
{
user: "user",
pwd: "password",
roles: [ { role: "readWrite", db: "dbName" } ]
}
)
查看用户
db.system.users.find().pretty()
db.system.users.find({"user":"username"}).pretty()
修改用户
删除用户
常用操作
批量修改
第一个参数是过滤条件,第二个参数是动作
db.collName.updateMany({}, {"$set":{"key":"value"}})
查询集合大小
db.collName.find().size()
数据库监控
mongostat --host 192.168.106.147:27017 -uroot -p'auto_test@123' --authenticationDatabase admin
通过profile监控性能
开启/设置
ps. 如果在admin中开启监控,所有的库都会被监控;如果在特定库开启监控,只会记录当前库的信息。
# 查看级别
# 值为0|1|2,分别代表意思:0代表关闭,1代表记录慢命令,2代表全部
auto_test:PRIMARY> db.getProfilingLevel()
0
# 查看状态:级别和时间
auto_test:PRIMARY> db.getProfilingStatus()
{ "was" : 0, "slowms" : 500 }
# 修改当前数据库的分析级别
auto_test:PRIMARY> db.setProfilingLevel(2)
{ "was" : 0, "slowms" : 500, "ok" : 1 }
# 设置级别和时间(有时候一次执行不行,需要两次)
auto_test:PRIMARY> db.setProfilingLevel(2, 100)
{ "was" : 2, "slowms" : 100, "ok" : 1 }
# 这个表貌似没索引,放心删
db.system.profile.drop()
常用命令
# 返回最近的10条记录
db.system.profile.find().limit(10).sort({ts: -1}).pretty()
#返回所有的操作,除command类型的
db.system.profile.find({op: {$ne: 'command'}}).pretty()
#返回特定集合
db.system.profile.find({ns: 'mydb.test'}).pretty()
# 查询执行时间大于500ms的记录
db.system.profile.find({millis: {$gt: 500}}).pretty()
#从一个特定的时间范围内返回信息
db.system.profile.find(
{
ts: {
$gt: new ISODate("2012-12-09T03:00:00Z") ,
$lt: new ISODate("2012-12-09T03:40:00Z")
}
}
).pretty()
#特定时间,限制用户,按照消耗时间排序
db.system.profile.find(
{
ts: {
$gt: new ISODate("2011-07-12T03:00:00Z") ,
$lt: new ISODate("2011-07-12T03:40:00Z")
}
},
{user: 0}
).sort({millis: -1})
性能问题
geoNear两种方式性能差异 todo
{
"aggregate":"__collection__",
"pipeline":[
{
"$geoNear":{
"maxDistance":0.005487495800105893,
"minDistance":0.004703567828662194,
"distanceMultiplier":6378.137,
"num":{
"$numberLong":"500"
},
"near":[
113.251335,
23.168062
],
"spherical":true,
"distanceField":"distance"
}
},
{
"$match":{
"role":2000
}
},
{
"$limit":{
"$numberLong":"500"
}
}
]
}
{
"$geoNear":{
"near":{
"type":"Point",
"coordinates":[
113.838711,
22.695883
]
},
"distanceField":"dis",
"spherical":true,
"minDistance":0,
"maxDistance":5000,
"num":500,
"query":{
"address_id":{
"$in":[
45,
95,
33
]
},
"age":{
"$gte":18
}
}
}
}
...