写一个shell脚本,导出所有库的所有表为json文件, 对应库的表导出到对应目录
mongo --host 127.0.0.1:27017 -u username -p 'XXX' --authenticationDatabase admin
结合你提供的 MongoDB 登录信息,为你编写了一个完整的 Shell 脚本。
该脚本会自动获取所有数据库(排除系统自带库),遍历每个库下的所有集合(表),并使用 mongoexport 工具将数据导出为 JSON 文件,文件会按照 数据库名/集合名.json 的结构存放在你指定的目录中。
#!/bin/bash
# ================= 配置区域 =================
# MongoDB 连接配置(基于你提供的命令)
MONGO_HOST="127.0.0.1"
MONGO_PORT="27017"
MONGO_USER="username"
MONGO_PWD='XXX'
AUTH_DB="admin"
# 导出工具路径(根据你提供的 mongo 路径自动推算 mongoexport 路径)
MONGO_BIN="/path/to/mongo/bin"
MONGO_EXPORT="${MONGO_BIN}/mongoexport"
# 导出文件的根目录(请确保该目录存在,或有权限创建)
EXPORT_ROOT_DIR="/data/mongo/backup_json"
# ===========================================
# 创建导出根目录
mkdir -p "${EXPORT_ROOT_DIR}"
echo "开始连接 MongoDB 并获取数据库列表..."
# 1. 获取所有数据库名称(排除系统自带的库)
# 使用 --quiet 参数只输出结果,不输出连接日志
DATABASES=$(${MONGO_BIN}/mongo --host ${MONGO_HOST}:${MONGO_PORT} -u ${MONGO_USER} -p ${MONGO_PWD} --authenticationDatabase ${AUTH_DB} --quiet --eval "db.getMongo().getDBNames().join('\n')" | grep -vE "admin|local|config")
# 2. 遍历每一个数据库
for DB_NAME in $DATABASES; do
echo "正在处理数据库: [${DB_NAME}]"
# 创建对应数据库的文件夹
DB_DIR="${EXPORT_ROOT_DIR}/${DB_NAME}"
mkdir -p "${DB_DIR}"
# 3. 获取当前数据库下的所有集合(表)名称
COLLECTIONS=$(${MONGO_BIN}/mongo --host ${MONGO_HOST}:${MONGO_PORT} -u ${MONGO_USER} -p ${MONGO_PWD} --authenticationDatabase ${AUTH_DB} --quiet --eval "db.getSiblingDB('${DB_NAME}').getCollectionNames().join('\n')")
# 4. 遍历每一个集合并执行导出
for COLL_NAME in $COLLECTIONS; do
echo " -> 正在导出集合: [${COLL_NAME}] ..."
# 执行导出命令
# --jsonArray 参数会将导出的内容包装成一个标准的 JSON 数组,方便后续程序读取
${MONGO_EXPORT} \
--host ${MONGO_HOST} \
--port ${MONGO_PORT} \
-u ${MONGO_USER} \
-p "${MONGO_PWD}" \
--authenticationDatabase ${AUTH_DB} \
--db ${DB_NAME} \
--collection ${COLL_NAME} \
--type json \
--out "${DB_DIR}/${COLL_NAME}.json"
if [ $? -eq 0 ]; then
echo " -> [成功] ${DB_NAME}.${COLL_NAME} 导出完成!"
else
echo " -> [失败] ${DB_NAME}.${COLL_NAME} 导出出错,请检查日志!"
fi
done
done
echo "所有数据库导出任务已全部完成!"
echo "文件保存在: ${EXPORT_ROOT_DIR}"
️ 注意事项:
-
密码特殊字符:你的密码
XXX如果包含特殊字符(如@,!,$等),在 Shell 脚本中最好用单引号' '包裹起来,防止被系统错误解析。 -
权限问题:确保执行该脚本的系统用户,对导出目录(
/data/mongo/backup_json)拥有写入权限。 - 磁盘空间:导出全库 JSON 可能会占用较大磁盘空间,请提前确认服务器有足够的存储空间。
-
工具路径:脚本中默认
mongoexport与你的mongo命令在同一目录(/path/to/mongo/bin/)下。如果提示找不到mongoexport,请检查该路径下是否存在此文件。
mongoexport --type json 导出数据时,加不加 --jsonArray 的区别是什么?
mongoexport 加上 --jsonArray 和不加的主要区别在于导出的 JSON 文件结构:
-
不加
--jsonArray(默认行为)- 结构: 每一行(record)是一个独立的、完整的 JSON 对象(document)。
- 特点: 这种格式被称为 JSON Lines 或 Newline Delimited JSON (NDJSON)。每一行都是一个有效的 JSON,互不干扰。
-
优点:
- 文件体积相对较小(没有外层的大数组结构)。
- 适合流式处理,可以逐行读取,内存效率高,即使文件很大也不容易卡顿。
- 适用于
mongoimport默认的导入模式(不需要--jsonArray)。
-
缺点:
- 不是标准的 JSON 数组格式,某些需要完整 JSON 数组的工具或库可能无法直接识别。
-
示例:
{"_id": {"$oid": "xxx"}, "name": "Alice", "age": 30} {"_id": {"$oid": "yyy"}, "name": "Bob", "age": 25} {"_id": {"$oid": "zzz"}, "name": "Charlie", "age": 35}
-
加上
--jsonArray-
结构: 将所有导出的文档放入一个外层的 JSON 数组
[]内。 - 特点: 这是标准的 JSON 数组格式。
-
优点:
- 符合标准的 JSON 数组规范,可以用标准的 JSON 解析器加载,兼容性好。
- 对于需要一次性加载所有数据到内存或进行数组操作的场景更方便。
-
缺点:
- 文件体积稍大(增加了开头的
[和结尾的],以及中间的逗号分隔符)。 - 文件较大时,加载到内存可能会比较吃力,因为需要一次性加载整个数组。
- 使用
mongoimport导入时,必须加上--jsonArray参数。
- 文件体积稍大(增加了开头的
-
示例:
[ {"_id": {"$oid": "xxx"}, "name": "Alice", "age": 30}, {"_id": {"$oid": "yyy"}, "name": "Bob", "age": 25}, {"_id": {"$oid": "zzz"}, "name": "Charlie", "age": 35} ]
-
结构: 将所有导出的文档放入一个外层的 JSON 数组
总结与建议
| 场景 | 推荐选项 | 原因 |
|---|---|---|
通用导出 & 后续用 mongoimport 恢复 |
不加 --jsonArray |
文件更紧凑,mongoimport 默认能识别,无需额外参数。 |
| 需要标准 JSON 数组格式供其他程序处理 | 加 --jsonArray |
输出是标准的 JSON 数组,易于解析。 |
| 导出大量数据 | 不加 --jsonArray |
逐行格式更适合大数据量的流式读写,内存友好。 |
因此,对于备份和恢复场景,尤其是使用 MongoDB 自带工具链时,通常不加 --jsonArray 是更常见的选择。只有当你明确需要一个标准 JSON 数组文件时,才加上它。