迁移MongoDB的Collections和Index

需求

如题,只想迁移CollectionsIndex,不想迁移数据。

MongoDB官方提供了mongodump工具。数据量小的情况下可以全部备份,然后手动删除bson,数据量大的前提下,可能存在效率问题。

思路

mongodump工具不能单独导出CollectionsIndex,但是工具提供了一个-q的参数,导出查询条件的数据,只要让这个条件为false,就可以满足当前需求。但是使用这个参数必须要指定Collections

因此,第一步获取指定数据库的Collections;第二步,备份Collections;

方案

准备

安装 mongosh - MongoDB Shell
mongodump 示例 - MongoDB 数据库工具

步骤

  1. 使用mongosh配置JS脚本获取指定数据库的Collections,输出到本地临时文件
  2. 读取本地的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"

使用方法

  1. get_collection.jsback-collections.sh放到同一目录下
  2. 修改back-collections.sh,添加mongo链接信息
  3. ./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/

相关推荐
开心就好20251 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
悟空码字1 小时前
告别“屎山代码”:AI 代码整洁器让老项目重获新生
后端·aigc·ai编程
小码哥_常1 小时前
大厂不宠@Transactional,背后藏着啥秘密?
后端
奋斗小强1 小时前
内存危机突围战:从原理辨析到线上实战,彻底搞懂 OOM 与内存泄漏
后端
小码哥_常2 小时前
Spring Boot接口防抖秘籍:告别“手抖”,守护数据一致性
后端
心之语歌2 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
None3212 小时前
【NestJs】基于Redlock装饰器分布式锁设计与实现
后端·node.js
初次攀爬者2 小时前
Kafka + KRaft模式架构基础介绍
后端·kafka
洛森唛2 小时前
Elasticsearch DSL 查询语法大全:从入门到精通
后端·elasticsearch
拳打南山敬老院3 小时前
Context 不是压缩出来的,而是设计出来的
前端·后端·aigc