◆

MongoDB Mac 下载安装与创建用户使用教程

2023-02-02 01:370

这篇记的是在 mac 上用压缩包手动装 MongoDB 的完整过程,包括启动服务和创建用户。选手动装而不是用 brew,是因为手动装能清楚看到数据目录、日志目录、启动参数分别在哪,出问题时知道该查什么;brew 把这些都藏在它自己的配置里了。

先说 MongoDB 跟关系型数据库在使用上的几个差别,理解了下面的步骤才好懂。它是文档数据库,存的是类似 JSON 的结构,不需要预先定义表结构。库和集合都不需要显式创建——写入数据的时候如果不存在就自动建,所以下面创建用户时 use 一个不存在的库不会报错。

另外它的服务进程叫 mongod,客户端才是 mongo(新版本换成了 mongosh),这两个名字差一个字母,看错了会一头雾水。

下载安装

下面这一串命令做四件事:下载解压到 /usr/local、把二进制目录加进 PATH、建数据和日志目录、把目录的所有者改成当前用户。

有几个地方要按自己的情况调整。压缩包名字里的 x86_64 是 Intel 芯片的,苹果自研芯片的机器要下 arm64 的包,装错架构跑不起来。版本号也建议去官网确认当前的稳定版,别照抄 5.0.6。

cd /usr/local
# 下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-5.0.6.tgz

# 解压
sudo tar -zxvf mongodb-macos-x86_64-5.0.6.tgz

# 重命名为 mongodb 目录
sudo mv mongodb-macos-x86_64-5.0.6/ mongodb

# 安装完成后,我们可以把 MongoDB 的二进制命令文件目录(安装目录/bin)添加到 PATH 路径中:
export PATH=/usr/local/mongodb/bin:$PATH

# 创建日志及数据存放的目录
# 数据存放路径
sudo mkdir -p /usr/local/var/mongodb
# 日志文件路径
sudo mkdir -p /usr/local/var/log/mongodb

# 接下来要确保当前用户对以上两个目录有读写的权限:以下 wfly 是我电脑上对用户,你这边需要根据你当前对用户名来修改。
sudo chown wfly /usr/local/var/mongodb
sudo chown wfly /usr/local/var/log/mongodb

这里面有两个点值得单独说。

一是 export PATH=... 这行只对当前终端会话有效,关掉窗口就没了。要长期生效得把它写进 ~/.zshrc(mac 新版默认是 zsh)然后 source 一下,否则下次开终端又找不到 mongod 命令。

二是最后那两条 chown 很关键,别跳过。前面建目录用了 sudo,目录的所有者会是 root,而 mongod 是以当前用户身份启动的,没有写权限就会启动失败,报错信息还比较隐晦。所以要把所有权改回来。命令里的 wfly 是我的用户名,照抄记得换成自己的,可以用 whoami 查。

本地文件下载地址:https://www.mongodb.com/try/download/community

使用以下命令在后台启动 mongodb

装完之后服务不会自动跑起来,需要手动启动,并且告诉它数据往哪儿放、日志往哪儿写。

mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork
  1. --dbpath 设置数据存放目录
  2. --logpath 设置日志存放目录
  3. --fork 在后台运行

--fork 让进程脱离终端在后台跑,这样关掉终端窗口服务也不会停。代价是启动过程的输出看不见了,全部写进日志文件,所以启动失败时要去 --logpath 指定的那个文件里找原因。调试阶段可以先不加 --fork,让日志直接打在终端上,看清楚了再改成后台运行。注意 --fork 必须配合 --logpath 使用,只写 --fork 不给日志路径会直接报错。

默认监听 27017 端口,只绑定本机地址。想换端口用 --port 参数。

需要说明的是这个启动命令没有开启访问控制,也就是说此时连上来的客户端不需要认证就有完整权限。本机开发环境这样最省事,但绝对不要在能被外网访问的机器上这么跑——MongoDB 因为默认无认证被扫库的事故非常多。开了认证之后启动命令要加 --auth 参数,客户端连接时才需要用户名密码。

查看 mongod 服务是否启动:

后台启动之后终端不会有任何提示,得自己确认进程在不在。

使用以下命令如果看到有 mongod 的记录表示运行成功。

ps aux | grep -v grep | grep mongod

命令里两个 grep 串起来是为了把 grep 自身的进程过滤掉,grep -v grep 就是干这个的,否则总会看到一条自己搜索命令的记录,容易误判成服务在跑。

如果没有输出,说明启动失败了,去日志文件里看具体原因。最常见的两种是数据目录权限不对(回去检查 chown 那步)和端口被占用。

使用 mongo 命令打开一个终端

服务起来之后用客户端连上去操作。这里用的是绝对路径调用,如果前面 PATH 配好了,直接敲 mongo 就行。

cd /usr/local/mongodb/bin
./mongo

进去之后是一个交互式的 JavaScript 环境,可以直接写 JS 语法,所以下面的命令看起来像在调用对象方法,那不是特殊的查询语言。新版本的客户端换成了 mongosh,命令名字变了但用法基本一致。

创建用户相关

MongoDB 的权限模型是基于角色的,而且有个容易踩的特点:用户是隶属于某个数据库的,不是全局的。同一个用户名在不同库下可以各建一个,互不相干。认证时必须指定用户所属的那个库,指定错了会认证失败。

# 查看所有数据库
show dbs

# 进入admin数据库
use admin

# 创建管理员账户
# mongodb中的用户是基于身份role的,该管理员账户的 role是 userAdminAnyDatabase。admin用户用于管理账号,不能进行关闭数据库等操作。
db.createUser({ user: "mio", pwd: "123", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })

# 创建root
# 创建完admin管理员,创建一个超级管理员root。角色:root。root角色用于关闭数据库。
db.createUser({user: "root",pwd: "123", roles: [ { role: "root", db: "admin" } ]})

# 创建用户自己的数据库的管理角色
# role: "dbOwner"代表数据库所有者角色,拥有最高该数据库最高权限。比如新建索引等当账号管理员和超级管理员,可以为自己的数据库创建用户了。(坑)这时候一定,一定要切换到所在数据库上去创建用户,不然创建的用户还是属于admin。
# 如果是读写角色的话,权限设置为role: "readWrite"
use wfly
db.createUser({user: "wfly",pwd: "123456",roles: [ { role: "dbOwner", db: "wfly" } ]})

# 插入一条数据
db.wfly.insert({"name":"菜鸟教程"})

这段命令的顺序是有讲究的,我按它的逻辑再串一遍。

先 use admin 切到系统库,因为管理类的用户必须建在这里。第一个建的是账号管理员,角色 userAdminAnyDatabase 的能力范围仅限于管理用户——建用户、改密码、授权,但它不能读写业务数据,也不能关库。这种职责分离是有意的设计。

接着建 root 角色的超级管理员,它才有完整权限,包括执行关闭数据库这类操作。日常不该用它连业务,只在需要管理操作时用。

第三步是业务库的用户,注释里标了「坑」的那句是重点:必须先 use wfly 切到目标库再执行 createUser,否则用户会被建到当前所在的库(也就是 admin)下面。这个错误很隐蔽,因为命令会执行成功不报错,等到应用去连的时候才认证失败,然后就会怀疑是密码写错了。前面说的「用户隶属于某个库」就是这个意思。

dbOwner 是这个库的最高权限角色,能建索引、改集合结构。如果应用只需要读写数据,用 readWrite 更合适,权限给到刚够用就好。

最后那条 insert 是验证性质的写入。这里能体现前面说的自动创建:wfly 这个库和 wfly 这个集合都没有预先建过,直接写入就有了。命令里 db.wfly 的 wfly 是集合名,跟库名重了但两者是不同层级的东西。顺带一提,insert 在新版本里已经标记为废弃,推荐用 insertOne 或 insertMany。

下图是这些命令执行后的终端输出,可以对照确认每一步是否成功,重点看 createUser 返回的成功标志。

MongoDB 客户端中创建用户与插入数据的执行结果

用户建好之后,如果要真正启用认证,需要重启 mongod 并加上 --auth 参数,然后连接时用 mongo -u 用户名 -p 密码 --authenticationDatabase 用户所属的库 这种形式。最后那个参数经常被漏掉,而它恰恰是认证成败的关键。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEMongoDB Mac 下载安装与创建用户使用教程加载中