MongoDB安装
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
1 介绍
Package | 用途 |
---|---|
mogos | MongoDB shard缩写,分片使用 |
server | 通过包管理工具安装 |
shell | MongoDB shell |
tgz | 二进制包 |
Source | 源码包 |
2 二进制包安装
2.1 下载和解压
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
2.2 创建目录
创建日志目录和数据文件目录
mkdir -p /usr/local/mongodb/data/{logs,db}
touch data/logs/mongodb.log
2.3 配置环境变量
#set mongo environment
export MONGO_HOME=/usr/local/mongodb
export PATH=${PATH}:${MONGO_HOME}/bin
source /etc/profile
3 配置
创建一个文件mongod.conf
,添加以下内容
# 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: reopen #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: disabled # enabled/disabled 开启客户端认证
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
4 启动
4.1 启动MongoDB
启动 MongoDB 有2种方式,一是直接指定配置参数,二是指定配置文件。
启动mongo
mongod --config /usr/local/mongodb/mongod.conf
关闭mongo
mongod --shutdown --config /usr/local/mongodb/mongod.conf
4.2 进入终端操作数据库
mongo --port=27017
这里说明一下,如果是27017默认端口号,则不需要指定,直接./mongo
就可以进入交互控制台,如果配置文件的端口不是默认端口,启动终端要指定端口号。
接着你输入show dbs
,就会看到以下默认集合:
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
4.3 给MongoDB开启密码访问
MongoDB 默认是没有开启安全认证的,对于部署在云上就显得及其不安全,下面我们为mongodb的admin数据库创建用户。
MongoDB数据库有以下特点:
- 没有默认管理员账号,所以要先添加管理员账号,在开启权限认证。
- 切换到admin数据库,添加的账号才是管理员账号。
- 用户只能在用户所在数据库登录,包括管理员账号。
- 管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。这一点比较特别。
在admin数据库中添加具有root
角色的用户
使用db.createUser()
函数在admin数据库下创建用户,老版本的MongodDB是db.addUser()
函数
创建管理员用户
> use admin
> db.createUser({
user:"admin",
pwd:"123456",
roles:["root"] // 或者使用["userAdminAnyDatabase"]
})
成功的创建了用户和密码,将mongodb.conf
文件中的开启安全认证项修改为 enabled
security:
authorization: enabled
重启mongo
mongod --shutdown --config /usr/local/mongodb/mongodb.conf
mongod --config /usr/local/mongodb/mongodb.conf
未登录下执行命令验证
mongo --port=27017
> use admin
> db.createUser(
{
user: "test",
pwd: "test",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
我们可以看到结果显示失败未验证,说明我们刚才开启MongoDB密码登录成功。
下面我们需要验证,首先切换到admin数据库下,也就是说,验证步骤必须在admin数据库下面进行
> use admin
> db.auth("admin","123456")
1
db.auth()
函数是验证方法,可以看到显示结果1表示成功验证,这个时候我们再show dbs,就成功显示了。 这个时候我们就可以对数据库任意操作了。
5 创建 systemctl 服务
先关闭服务
mongod --shutdown --config /usr/local/mongodb/mongodb.conf
配置服务,使用systemctl
管理
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
启动服务
systemctl enable mongodb.service --now
6 用户权限
6.1 内建角色
数据库用户角色: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
6.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" } ]})
6.3 删除用户
db.dropUser('test')
6.4 修改用户权限
db.updateUser("test",{roles:[ {role:"readWrite",db:"test"} ]})
7 备份还原
从MongoDB 4.4开始,MongoDB现在与MongoDB服务器分开发布,并使用自己的版本控制,初始版本为100.0.0。在此之前,MongoDB与MongoDB服务器一起发布
7.1 mongodump
mongodump -h <hostname><:port> -u 用户名 -p 密码 -d dbname -o dbdirectory
出现 Authentication failed
添加--authenticationDatabase admin
选项
7.1.1 全库备份
mongodump -h -u -p --port 27017 --authenticationDatabase admin -o /tmp/backup
7.1.2 备份指定的库,test库
mongodump -h -u admin -p 123456 --port 27017 --authenticationDatabase admin -d test -o test
7.1.3 压缩备份
# 压缩备份单库
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
7.2 mongorestore
mongorestore -h <hostname><:port> -d dbname <path>
7.2.1 单库恢复
mongorestore -h -u -p --port 27017 --authenticationDatabase admin -d test /tmp/backup/test
7.2.2 恢复test库下的customer集合
mongorestore -h -u -p --port 27017 --authenticationDatabase admin -d test -c customer /tmp/back
7.2.3 –gzip参数实践恢复
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
7.2.4 恢复问题
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.
没有任何报错,但是也没有恢复任何数据。
mongorestore -u admin -p 123456 --port 27017 --authenticationDatabase admin --nsInclude="*" test
可以看到恢复1个document
8 版本升级
mongo不支持跨版本升级
升级过程4.2.3→4.4→5.0→6.0.2
查看当前功能兼容性版本
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
设置功能兼容性版本
db.adminCommand( { setFeatureCompatibilityVersion: "4.2" } )
关闭MongoDB服务
将现有的 4.2 二进制文件替换为 4.4 二进制文件
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
db.adminCommand( { setFeatureCompatibilityVersion: "5.0" } )
db.adminCommand( { setFeatureCompatibilityVersion: "6.0" } )
参考链接: