注意
本文最后更新于 2023-03-08,文中内容可能已过时。
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
Community Server
Package | 用途 |
---|
mogos | MongoDB shard缩写,分片使用 |
server | 通过包管理工具安装 |
shell | MongoDB shell |
tgz | 二进制包 |
Source | 源码包 |
下载地址
1
2
3
| wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-5.0.9.tgz
tar -zxf mongodb-linux-x86_64-ubuntu2004-5.0.9.tgz
mv mongodb-linux-x86_64-ubuntu2004-5.0.9 /usr/local/mongodb
|
创建日志目录和数据文件目录
1
2
| mkdir -p /usr/local/mongodb/data/{logs,db}
touch data/logs/mongodb.log
|
1
2
3
4
5
| #set mysql environment
export MONGO_HOME=/usr/local/mongodb
export PATH=${PATH}:${MONGO_HOME}/bin
source /etc/profile
|
启动 MongoDB 有2种方式,一是直接指定配置参数,二是指定配置文件。
创建一个文件mongod.conf
,填写下列项:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| # mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file #日志输出方式。file/syslog,如果是file,需指定path,默认是输出到标准输出流中
logAppend: true #启动时,日志追加在已有日志文件还是创建新文件记录日志, 默认false
logRotate: rename #rename 重命名日志文件。reopen 按照Linux/Unix日志滚动行为关闭和重新打开日志文件。必须设置logAppend为true
path: /usr/local/mongodb/data/logs/mongod.log #日志路径。
# Where and how to store data.
storage:
dbPath: /usr/local/mongodb/data/db #数据目录
journal: #64位系统默认打开,32位关闭
enabled: true
# engine:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /usr/local/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
maxIncomingConnections: 65536 #最大连接数,默认65536
security:
authorization: enabled # enabled/disabled 开启客户端认证
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
|
官方说明Configuration File Options
启动mongo
1
| mongod --config /usr/local/mongodb/mongod.conf
|
关闭mongo
1
| mongod --shutdown --config /usr/local/mongodb/mongod.conf
|
这里说明一下,如果是27017默认端口号,则不需要指定,直接./mongo
就可以进入交互控制台,如果配置文件的端口不是默认端口,启动终端要指定端口号。
接着你输入show dbs
,就会看到以下默认集合:
1
2
3
4
| > show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
|

官方文档
MongoDB 默认是没有开启安全认证的,对于部署在云上就显得及其不安全,下面我们为mongodb的admin数据库创建用户。
MongoDB数据库有以下特点:
- 没有默认管理员账号,所以要先添加管理员账号,在开启权限认证。
- 切换到admin数据库,添加的账号才是管理员账号。
- 用户只能在用户所在数据库登录,包括管理员账号。
- 管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。这一点比较特别。
在admin数据库中添加具有userAdminAnyDatabase
角色的用户
使用db.createUser()
函数在admin数据库下创建用户,老版本的MongodDB是db.addUser()
函数
1
2
3
4
5
6
| > use admin
> db.createUser({
user:"admin",
pwd:"123456",
roles:["root"]
}) //创建超级管理员
|

userAdminAnyDatabase:授予在所有数据库上管理User的权限-意思是可以在所有的数据库管理User,但是没有操作权利,只有你在那个数据库验证了User,然后才能去操作数据库的读写。
现在我们成功的创建了用户和密码,将mongodb.conf
文件中的开启安全认证项修改为 true
1
2
| security:
authorization: enabled
|
重启mongo
1
2
| mongod --shutdown --config /usr/local/mongodb/mongodb.conf
mongod --config /usr/local/mongodb/mongodb.conf
|
验证
1
2
3
4
5
6
7
8
| > use admin
> db.createUser(
{
user: "test",
pwd: "test",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
|

我们可以看到结果显示失败未验证,说明我们刚才开启MongoDB密码登录成功。
下面我们需要验证,首先切换到admin数据库下,也就是说,验证步骤必须在admin数据库下面进行
1
2
3
4
| > use admin
> db.auth("root","root")
1
|
db.auth()
函数是验证方法,可以看到显示结果1表示成功验证,这个时候我们再show dbs,就成功显示了。 这个时候我们就可以对数据库任意操作了。

先关闭服务
1
| mongod --shutdown --config /usr/local/mongodb/mongodb.conf
|
配置服务,使用systemctl
管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| cat > /usr/lib/systemd/system/mongodb.service <<'EOF'
[Unit]
Description=MongoDB Service
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb/bin/mongod --shutdown --config /usr/local/mongodb/mongodb.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
|
启动服务
1
| systemctl enable mongodb.service --now
|
官方文档
数据库用户角色:read、readWrite;
数据库管理角色:dbAdmin、dbOwner、userAdmin;
集群管理角色: clusterAdmin、clusterManager、clusterMonitor、hostManager;
备份恢复角色: backup、restore;
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色: root; 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
内部角色: __system;
-—————————————————————————————–
角色说明:
Read: 允许用户读取指定数据库
readWrite: 允许用户读写指定数据库
dbAdmin: 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin: 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
dbOwner: 允许在当前DB中执行任意操作
readAnyDatabase: 赋予用户所有数据库的读权限,只在admin数据库中可用
readWriteAnyDatabase: 赋予用户所有数据库的读写权限,只在admin数据库中可用
userAdminAnyDatabase:赋予用户所有数据库管理User的权限,只在admin数据库中可用
dbAdminAnyDatabase: 赋予管理所有数据库的权限,只在admin数据库中可用
root: 超级账号,超级权限,只在admin数据库中可用。
-—————————————————————————————–
集群管理角色:
clusterAdmin: 赋予管理集群的最高权限,只在admin数据库中可用
clusterManager: 赋予管理和监控集群的权限
clusterMonitor: 赋予监控集群的权限,对监控工具具有readonly的权限
hostManager: 赋予管理Server
1
2
| db.createUser({user:"test",pwd:"test",roles:[ {role:"read", db:"test" }]})
db.createUser({user:"test",pwd:"test",roles:[ {role:"readAnyDatabase",db:"admin" }, {role:"readWrite",db:"test" } ]})
|
1
| db.updateUser("test",{roles:[ {role:"readWrite",db:"test"} ]})
|
从MongoDB 4.4开始,MongoDB现在与MongoDB服务器分开发布,并使用自己的版本控制,初始版本为100.0.0。在此之前,MongoDB与MongoDB服务器一起发布
下载地址
1
| mongodump -h <hostname><:port> -u 用户名 -p 密码 -d dbname -o dbdirectory
|
出现 Authentication failed
添加--authenticationDatabase admin
选项
1
| mongodump -h -u -p --port 27017 --authenticationDatabase admin -o /tmp/backup
|
1
| mongodump -h -u admin -p 123456 --port 27017 --authenticationDatabase admin -d test -o test
|
1
2
3
4
5
| # 压缩备份单库
mongodump -h -u -p --port 27017 --authenticationDatabase admin -d test -o /tmp/backup --gzip
# 压缩备份单表
mongodump -h -u -p --port 27017 --authenticationDatabase admin -d test -c customer -o /tmp/backup --gzip
|
1
| mongorestore -h <hostname><:port> -d dbname <path>
|
1
| mongorestore -h -u -p --port 27017 --authenticationDatabase admin -d test /tmp/backup/test
|
1
| mongorestore -h -u -p --port 27017 --authenticationDatabase admin -d test -c customer /tmp/back
|
1
2
| mongorestore -h -u -p --port 27017 --authenticationDatabase admin --gzip /tmp/backup
mongorestore -h 127.0.0.1 -u admin -p 123456 --port 27017 --authenticationDatabase admin -d test --gzip test
|
2022-07-07T16:01:44.751+0800 The –db and –collection flags are deprecated for this use-case; please use –nsInclude instead, i.e. with –nsInclude=${DATABASE}.${COLLECTION}
2022-07-07T16:01:44.751+0800 building a list of collections to restore from test dir
2022-07-07T16:01:44.751+0800 don’t know what to do with subdirectory “test/test”, skipping…
2022-07-07T16:01:44.752+0800 0 document(s) restored successfully. 0 document(s) failed to restore.
没有任何报错,但是也没有恢复任何数据。
1
| mongorestore -u admin -p 123456 --port 27017 --authenticationDatabase admin --nsInclude="*" test
|

可以看到恢复1个document
mongo不支持跨版本升级
升级过程4.2.3→4.4→5.0→6.0.2
查看当前功能兼容性版本
1
| db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
|
设置功能兼容性版本
1
2
3
| db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
db.adminCommand( { setFeatureCompatibilityVersion: "5.0" } )
db.adminCommand( { setFeatureCompatibilityVersion: "6.0" } )
|
参考链接:
Upgrade a Replica Set to 5.0
Upgrade a Replica Set to 6.0