需求
如题,只想迁移Collections
和Index
,不想迁移数据。
MongoDB官方提供了mongodump
工具。数据量小的情况下可以全部备份,然后手动删除bson,数据量大的前提下,可能存在效率问题。
思路
mongodump
工具不能单独导出Collections
和Index
,但是工具提供了一个-q
的参数,导出查询条件的数据,只要让这个条件为false
,就可以满足当前需求。但是使用这个参数必须要指定Collections
。
因此,第一步获取指定数据库的Collections
;第二步,备份Collections
;
方案
准备
安装 mongosh - MongoDB Shell
mongodump 示例 - MongoDB 数据库工具
步骤
- 使用
mongosh
配置JS脚本获取指定数据库的Collections
,输出到本地临时文件 - 读取本地的
collections
临时文件,使用mongodump
备份所有Collections
脚本
get_collections.js
js
// MongoDB shell script to get collection names
var dbName = process.argv[15];
var outputFilePath = process.argv[16];
print(dbName+"->"+outputFilePath)
var target = db.getSiblingDB(dbName);
var collections = target.getCollectionNames();
printjson(collections);
// Save the collections to a file
print("Collections have been written to '" + outputFilePath + "'.");
//printjson(collections).save(outputFilePath);
var ret = "";
collections.forEach(col => ret+=col+"\n" )
fs.writeFileSync(outputFilePath,ret)
back-collections.sh
,配置mongo的链接信息
bash
#!/bin/bash
HOST=""
PORT="27017"
USER_NAME=""
PASS_WORD=""
# 检查参数数量
if [ "$#" -ne 3 ]; then
echo "Usage: $0 <database_name> <collections_file> <bak_path>"
exit 1
fi
# 参数
DATABASE_NAME="$1"
OUTPUT_FILE="$2"
# 检查mongo命令是否存在
if ! command -v mongosh &> /dev/null; then
echo "mongo command not found. Please make sure MongoDB is installed and in your PATH."
exit 1
fi
# 获取数据库中的集合列表
echo "Getting collections for database '$DATABASE_NAME'..."
# 使用mongo命令执行shell脚本
mongosh --host $HOST --port $PORT --username $USER_NAME --password $PASS_WORD --authenticationDatabase admin --eval "load('$PWD/get_collections.js')" -- "$DATABASE_NAME" "$OUTPUT_FILE"
# 输出结果
echo "Collections have been written to '$OUTPUT_FILE'."
filename=$OUTPUT_FILE
# 检查文件是否存在
if [ ! -f "$filename" ]; then
echo "File not found: $filename"
exit 1
fi
# 逐行读取文件内容
while IFS= read -r collection_name; do
# 执行mongodump命令
mongodump \
-u $USER_NAME \
-p $PASS_WORD \
-h $HOST \
--port $PORT \
-d $1 \
-c "$collection_name" \
-q '{"a":{"$exists":true}}' \
--authenticationDatabase=admin \
-o ./$3
done < "$filename"
使用方法
- 将
get_collection.js
和back-collections.sh
放到同一目录下 - 修改
back-collections.sh
,添加mongo链接信息 ./back-collections.sh <数据库名> <本地临时文件名> <备份路径>
还原
既然是迁移,备份了就要还原,还原就比较简单了,使用mongodump
就可以了
例: mongorestore --uri="mongodb://username:password@10.26.18.17:27017,10.26.18.4:27017/sjl?replicaSet=cmgo-qrmlhglh_0&authSource=admin" ./mongo_bak/stlbill/