MongoDB安装

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

Package用途
mogosMongoDB shard缩写,分片使用
server通过包管理工具安装
shellMongoDB shell
tgz二进制包
Source源码包

下载地址

bash

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

创建日志目录和数据文件目录

bash

mkdir -p /usr/local/mongodb/data/{logs,db}
touch data/logs/mongodb.log

bash

#set mongo environment
export MONGO_HOME=/usr/local/mongodb
export PATH=${PATH}:${MONGO_HOME}/bin

source /etc/profile

配置文件选项

创建一个文件mongod.conf,添加以下内容

yaml

# 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:

启动 MongoDB 有2种方式,一是直接指定配置参数,二是指定配置文件。

启动mongo

bash

mongod --config /usr/local/mongodb/mongod.conf

关闭mongo

bash

mongod --shutdown --config /usr/local/mongodb/mongod.conf

bash

mongo --port=27017

这里说明一下,如果是27017默认端口号,则不需要指定,直接./mongo就可以进入交互控制台,如果配置文件的端口不是默认端口,启动终端要指定端口号。

接着你输入show dbs,就会看到以下默认集合:

sql

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

MongoDB 默认是没有开启安全认证的,对于部署在云上就显得及其不安全,下面我们为mongodb的admin数据库创建用户。

MongoDB数据库有以下特点:

  • 没有默认管理员账号,所以要先添加管理员账号,在开启权限认证。
  • 切换到admin数据库,添加的账号才是管理员账号。
  • 用户只能在用户所在数据库登录,包括管理员账号。
  • 管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。这一点比较特别。

在admin数据库中添加具有root角色的用户

使用db.createUser()函数在admin数据库下创建用户,老版本的MongodDB是db.addUser()函数

创建管理员用户

sql

> use admin
> db.createUser({
    user:"admin",
    pwd:"123456",
    roles:["root"] // 或者使用["userAdminAnyDatabase"]
}) 

成功的创建了用户和密码,将mongodb.conf文件中的开启安全认证项修改为 enabled

yaml

security:
   authorization: enabled

重启mongo

bash

mongod --shutdown --config /usr/local/mongodb/mongodb.conf
mongod --config /usr/local/mongodb/mongodb.conf

未登录下执行命令验证

bash

mongo --port=27017

sql

> use admin
> db.createUser(
  {
    user: "test",
    pwd: "test",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

我们可以看到结果显示失败未验证,说明我们刚才开启MongoDB密码登录成功。

下面我们需要验证,首先切换到admin数据库下,也就是说,验证步骤必须在admin数据库下面进行

sql

> use admin
> db.auth("admin","123456")

1

db.auth()函数是验证方法,可以看到显示结果1表示成功验证,这个时候我们再show dbs,就成功显示了。 这个时候我们就可以对数据库任意操作了。

先关闭服务

bash

mongod --shutdown --config /usr/local/mongodb/mongodb.conf

配置服务,使用systemctl管理

bash

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

启动服务

bash

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

sql

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" } ]})

sql

db.dropUser('test')

sql

db.updateUser("test",{roles:[ {role:"readWrite",db:"test"} ]})

从MongoDB 4.4开始,MongoDB现在与MongoDB服务器分开发布,并使用自己的版本控制,初始版本为100.0.0。在此之前,MongoDB与MongoDB服务器一起发布

下载地址

bash

mongodump -h <hostname><:port> -u 用户名 -p 密码 -d dbname -o dbdirectory

出现 Authentication failed

添加--authenticationDatabase admin选项

bash

mongodump -h -u -p --port 27017 --authenticationDatabase admin -o /tmp/backup

bash

mongodump -h -u admin -p 123456 --port 27017 --authenticationDatabase admin -d test -o test

bash

# 压缩备份单库
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

bash

mongorestore -h <hostname><:port> -d dbname <path>

bash

mongorestore -h -u -p --port 27017 --authenticationDatabase admin -d test /tmp/backup/test

bash

mongorestore -h -u -p --port 27017 --authenticationDatabase admin -d test -c customer /tmp/back

bash

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.

没有任何报错,但是也没有恢复任何数据。

bash

mongorestore -u admin -p 123456 --port 27017 --authenticationDatabase admin --nsInclude="*" test

可以看到恢复1个document

mongo不支持跨版本升级

升级过程4.2.3→4.4→5.0→6.0.2

查看当前功能兼容性版本

sql

db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

设置功能兼容性版本

sql

db.adminCommand( { setFeatureCompatibilityVersion: "4.2" } )

关闭MongoDB服务

将现有的 4.2 二进制文件替换为 4.4 二进制文件

sql

db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
db.adminCommand( { setFeatureCompatibilityVersion: "5.0" } )
db.adminCommand( { setFeatureCompatibilityVersion: "6.0" } )

参考链接:

将独立实例升级到 4.4

将独立运行版升级至 5.0

将独立运行版升级到 6.0

相关内容