Windows 下 MongoDB 安装与数据迁移踩坑实录:mongodump 找不到命令怎么办?

摘要:Node.js 项目从 PostgreSQL 迁移到 MongoDB 后,本地服务能正常连库,但执行 mongodump 备份时报「不是内部或外部命令」。本文记录 Windows 环境下的完整排查过程、根因分析与可落地的迁移方案。

关键词:MongoDB、Windows、mongodump、mongorestore、Node.js、数据库迁移

适用读者:Windows 开发者、Node.js 后端、首次部署 MongoDB 的同学


目录


前言

最近在把一个 Node.js 后台项目从 PostgreSQL 迁移到 MongoDB。本地开发已经跑通,准备把 mard_bead 数据库备份后部署到公司服务器。

执行备份命令时却遇到经典报错:

mongodump --db mard_bead --out ./dump
'mongodump' 不是内部或外部命令,也不是可运行的程序或批处理文件。

更诡异的是:MongoDB 明明在跑netstat 能看到 27017 端口在监听,项目也能正常连库读写。

这篇文章记录这次安装、备份、迁移过程中遇到的几个典型问题,以及对应的解决办法。


背景:项目从 PostgreSQL 切到 MongoDB

项目原先使用 PostgreSQL,后来整体迁移到 MongoDB:

  • 运行时只通过 mongodb 驱动连接 MONGODB_URI
  • 初始化脚本改为 npm run init-mongo
  • 旧的 sql/ 目录、migrate-*.js 等 PostgreSQL 相关代码全部废弃

本地 .env 最小配置:

MONGODB_URI=mongodb://127.0.0.1:27017/mard_bead
DEV_MOCK_WECHAT=true
JWT_SECRET=随机字符串

服务器生产配置(精简后 7 项):

MONGODB_URI=mongodb://127.0.0.1:27017/mard_bead
DEV_MOCK_WECHAT=false
WECHAT_APPID=你的小程序AppId
WECHAT_SECRET=你的小程序密钥
JWT_SECRET=随机长字符串
PUBLIC_BASE_URL=https://api.你的域名.com
OSS_ENABLED=false

这说明:MongoDB 已经是项目运行的核心依赖,备份迁移也必须走 MongoDB 官方工具链。


问题 1:mongodump 命令不存在

现象

在 CMD 或 PowerShell 中执行:

mongodump --db mard_bead --out ./dump

或:

mongodump --uri="mongodb://localhost:27017/mydb" --out=D:\backup\mongodump-20260708

都会提示命令找不到。

排查过程

第一步:确认 MongoDB 服务是否在运行

netstat -ano | findstr :27017

如果看到类似输出:

TCP    127.0.0.1:27017    0.0.0.0:0    LISTENING    33156

说明 MongoDB Server 已启动,但并不代表 mongodump 已安装。

第二步:检查命令是否存在

where mongodump
where mongod
where mongosh

如果都为空,基本可以确定:只装了 MongoDB 服务,没装 Database Tools

根因

很多人(包括我这次)会误以为:

装了 MongoDB,就能直接用 mongodump / mongorestore

实际上这是两个东西:

组件 作用
MongoDB Server 数据库服务本身,监听 27017
MongoDB Database Tools 命令行工具:mongodumpmongorestoremongoexport

只安装 Server,不会自动带上 dump 工具。


问题 2:安装 Tools 后旧终端仍找不到命令

现象

通过 winget 安装 MongoDB Database Tools 后,当前 CMD 窗口执行 mongodump 仍然报错。

根因

Windows 的环境变量 PATH 是在新开的终端会话中生效的。
安装前已经打开的 CMD/PowerShell 不会自动刷新 PATH。

三种解决办法

方案 A:使用完整路径(最稳,推荐)
"C:\Program Files\MongoDB\Tools\100\bin\mongodump.exe" --db mard_bead --out D:\backup\mongodump-20260708
方案 B:给当前窗口临时加 PATH
set PATH=%PATH%;C:\Program Files\MongoDB\Tools\100\bin
mongodump --db mard_bead --out D:\backup\mongodump-20260708
方案 C:关闭终端重新打开

新开一个 CMD/PowerShell,再执行:

mongodump --version

如果能看到版本号,说明 PATH 已生效。


问题 3:备份命令库名写错

错误示例

mongodump --uri="mongodb://localhost:27017/mydb" --out=D:\backup\mongodump-20260708

这里库名写的是 mydb,但项目实际库名是 mard_bead

正确写法

方式 1:指定 db

mongodump --db mard_bead --out D:\backup\mongodump-20260708

方式 2:通过 URI 指定

mongodump --uri="mongodb://127.0.0.1:27017/mard_bead" --out=D:\backup\mongodump-20260708

建议

本地开发统一使用:

MONGODB_URI=mongodb://127.0.0.1:27017/mard_bead

备份时也保持一致,避免导错库。


完整解决步骤(Windows)

步骤 1:安装 MongoDB Server

如果本机还没有 MongoDB 服务:

winget install MongoDB.Server

安装后确认服务监听:

netstat -ano | findstr :27017

步骤 2:安装 MongoDB Database Tools

winget install MongoDB.DatabaseTools --accept-package-agreements --accept-source-agreements

安装完成后,工具默认路径:

C:\Program Files\MongoDB\Tools\100\bin\

验证安装:

& "C:\Program Files\MongoDB\Tools\100\bin\mongodump.exe" --version

预期输出类似:

mongodump version: 100.17.0

步骤 3:导出本机数据库

cd D:\project\agentProject\mard-bead-backend
& "C:\Program Files\MongoDB\Tools\100\bin\mongodump.exe" --db mard_bead --out .\dump

成功后目录结构:

dump/
└── mard_bead/
    ├── users.bson
    ├── users.metadata.json
    ├── admin_users.bson
    ├── app_config.bson
    ├── alert_configs.bson
    └── ...

本次实际导出结果(主要集合):

集合 文档数
users 3
admin_users 1
app_config 1
alert_configs 2
counters 3
scheduled_jobs 3

步骤 4:服务器恢复数据

dump 文件夹复制到服务器后执行:

mongorestore --db mard_bead .\dump\mard_bead

如果目标库已有旧数据,需要覆盖:

mongorestore --drop --db mard_bead .\dump\mard_bead

问题 4:MONGODB_URI 写 127.0.0.1 还是服务器 IP

这是很多部署时容易混淆的点。

场景 1:MongoDB 和后端在同一台服务器(最常见)

MONGODB_URI=mongodb://127.0.0.1:27017/mard_bead

这里的 127.0.0.1 指的是服务器自己,不是开发机。

场景 2:MongoDB 在另一台机器

# 内网另一台服务器
MONGODB_URI=mongodb://192.168.1.100:27017/mard_bead

# 带账号密码
MONGODB_URI=mongodb://用户名:密码@192.168.1.100:27017/mard_bead

# 云厂商连接串
MONGODB_URI=mongodb+srv://...

判断方法

在目标服务器执行:

netstat -ano | findstr :27017
结果 配置
有输出 本机 MongoDB 在跑,用 127.0.0.1
无输出 数据库不在本机,改成真实数据库地址

问题 5:只备份数据库还不够

如果项目使用本地文件上传(OSS_ENABLED=false),还需要同步:

public/uploads/

否则会出现:

  • 数据库里有图片 URL
  • 服务器磁盘上没有对应文件
  • 页面图片 404

数据库 + uploads 目录要一起迁移。


init-mongo 和 mongorestore 怎么选

方式 适用场景
npm run init-mongo 新环境初始化索引、默认配置、管理员账号
mongorestore 从旧环境迁移真实业务数据

推荐流程:

  1. 服务器安装 MongoDB
  2. 部署 Node 项目并配置 .env
  3. mongorestore 导入本机数据
  4. 如无历史数据,再执行 npm run init-mongo

如果已经有完整 dump,通常不需要重复 init-mongo,否则可能覆盖种子数据。


常见问题速查表

报错 / 现象 原因 解决办法
mongodump 不是内部或外部命令 未安装 Database Tools winget install MongoDB.DatabaseTools
安装后仍找不到命令 旧终端未刷新 PATH 重开终端或用完整路径
27017 在监听但无法备份 只有 Server,没有 Tools 单独安装 Tools
导出的库不对 URI / db 参数写错 确认库名为 mard_bead
服务器连不上数据库 MONGODB_URI 写错 同机用 127.0.0.1,异机用真实 IP
图片丢失 只迁了数据库 同步 public/uploads/

经验总结

这次踩坑最核心的认知是:

MongoDB 服务在运行 ≠ mongodump 已安装可用

另外还要注意 3 点:

  1. Server 和 Tools 要分开装
  2. Windows 安装后最好重开终端,或直接用 exe 全路径
  3. 数据库迁移不是只拷 BSON,文件上传目录也要一起迁

建议直接把 Database Tools 装上,并保留下面两条命令:

# 本机备份
mongodump --db mard_bead --out .\dump

# 服务器恢复
mongorestore --drop --db mard_bead .\dump\mard_bead
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐