怎样用脚本恢复MongoDB备份?

wen 实用脚本 2

本文目录导读:

怎样用脚本恢复MongoDB备份?

  1. 使用 mongorestore 命令(基本脚本)
  2. 带身份验证和选项的恢复脚本
  3. Python 脚本版本
  4. 带进度条和日志的恢复脚本
  5. 使用 mongodump/mongorestore 的定时恢复脚本
  6. 使用注意事项
  7. 执行恢复

我来介绍几种恢复MongoDB备份的脚本方法:

使用 mongorestore 命令(基本脚本)

Bash 脚本 - 恢复整个数据库

#!/bin/bash
# MongoDB 恢复脚本
BACKUP_DIR="/path/to/backup/folder"
DB_NAME="your_database_name"
MONGO_URI="mongodb://localhost:27017"
# 恢复整个数据库
mongorestore --uri="$MONGO_URI" \
    --db="$DB_NAME" \
    --drop \
    "$BACKUP_DIR/$DB_NAME"
echo "恢复完成!"

恢复单个集合

#!/bin/bash
# 恢复特定集合
mongorestore --uri="mongodb://localhost:27017" \
    --db="your_database" \
    --collection="your_collection" \
    --drop \
    "/path/to/backup/your_collection.bson"

带身份验证和选项的恢复脚本

#!/bin/bash
# 配置参数
MONGO_HOST="localhost"
MONGO_PORT="27017"
MONGO_USER="admin"
MONGO_PASS="password"
DB_NAME="mydb"
BACKUP_DIR="/backups/mongodb"
# 检查备份文件是否存在
if [ ! -d "$BACKUP_DIR/$DB_NAME" ]; then
    echo "错误: 备份目录不存在: $BACKUP_DIR/$DB_NAME"
    exit 1
fi
# 执行恢复
mongorestore \
    --host="$MONGO_HOST" \
    --port="$MONGO_PORT" \
    --username="$MONGO_USER" \
    --password="$MONGO_PASS" \
    --authenticationDatabase="admin" \
    --db="$DB_NAME" \
    --drop \
    --verbose \
    "$BACKUP_DIR/$DB_NAME"
if [ $? -eq 0 ]; then
    echo "数据库 $DB_NAME 恢复成功!"
else
    echo "数据库恢复失败!"
    exit 1
fi

Python 脚本版本

#!/usr/bin/env python3
import os
import subprocess
import sys
from datetime import datetime
class MongoDBRestore:
    def __init__(self, uri="mongodb://localhost:27017"):
        self.uri = uri
        self.backup_dir = "/backups/mongodb"
    def restore_database(self, db_name, backup_path=None):
        """恢复整个数据库"""
        if not backup_path:
            backup_path = f"{self.backup_dir}/{db_name}"
        # 检查备份文件
        if not os.path.exists(backup_path):
            print(f"错误: 备份路径不存在: {backup_path}")
            return False
        # 构建 mongorestore 命令
        cmd = [
            "mongorestore",
            f"--uri={self.uri}",
            f"--db={db_name}",
            "--drop",
            "--verbose",
            backup_path
        ]
        try:
            result = subprocess.run(cmd, check=True, capture_output=True, text=True)
            print(f"数据库 {db_name} 恢复成功")
            print(result.stdout)
            return True
        except subprocess.CalledProcessError as e:
            print(f"恢复失败: {e.stderr}")
            return False
    def restore_collection(self, db_name, collection_name, backup_file):
        """恢复特定集合"""
        cmd = [
            "mongorestore",
            f"--uri={self.uri}",
            f"--db={db_name}",
            f"--collection={collection_name}",
            "--drop",
            backup_file
        ]
        try:
            subprocess.run(cmd, check=True)
            print(f"集合 {collection_name} 恢复成功")
            return True
        except subprocess.CalledProcessError as e:
            print(f"恢复失败: {e}")
            return False
# 使用示例
if __name__ == "__main__":
    restorer = MongoDBRestore("mongodb://admin:password@localhost:27017")
    # 恢复数据库
    if restorer.restore_database("mydb", "/backups/mongodb/mydb"):
        print("恢复完成")
    else:
        sys.exit(1)

带进度条和日志的恢复脚本

#!/bin/bash
# 高级恢复脚本
LOG_FILE="/var/log/mongodb_restore.log"
BACKUP_BASE="/backups/mongodb"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
# 日志函数
log_message() {
    echo "[$DATE] $1" | tee -a "$LOG_FILE"
}
# 恢复函数
restore_database() {
    local db_name=$1
    local backup_path="$BACKUP_BASE/$db_name"
    log_message "开始恢复数据库: $db_name"
    if [ ! -d "$backup_path" ]; then
        log_message "错误: 备份目录不存在: $backup_path"
        return 1
    fi
    # 显示恢复进度
    log_message "正在恢复 $db_name..."
    # 执行恢复
    mongorestore \
        --uri="mongodb://localhost:27017" \
        --db="$db_name" \
        --drop \
        --numParallelCollections=4 \
        --stopOnError \
        --verbose \
        "$backup_path" 2>&1 | tee -a "$LOG_FILE"
    if [ ${PIPESTATUS[0]} -eq 0 ]; then
        log_message "数据库 $db_name 恢复成功"
        return 0
    else
        log_message "数据库 $db_name 恢复失败"
        return 1
    fi
}
# 主流程
main() {
    log_message "=== MongoDB 恢复脚本开始 ==="
    # 恢复所有数据库
    for db in "mydb" "testdb" "productiondb"; do
        restore_database "$db"
        if [ $? -ne 0 ]; then
            log_message "警告: 数据库 $db 恢复时出现问题"
        fi
    done
    log_message "=== MongoDB 恢复脚本完成 ==="
}
# 执行主函数
main

使用 mongodump/mongorestore 的定时恢复脚本

#!/bin/bash
# 基于时间的自动恢复脚本
LATEST_BACKUP=$(ls -td /backups/mongodb/*/ | head -1)
if [ -z "$LATEST_BACKUP" ]; then
    echo "没有找到备份文件"
    exit 1
fi
echo "从最新备份恢复: $LATEST_BACKUP"
# 恢复到临时数据库进行验证
mongorestore --uri="mongodb://localhost:27017" \
    --nsFrom="*" \
    --nsTo="temp_restore.*" \
    "$LATEST_BACKUP"
# 验证恢复的数据
mongosh --quiet --eval "db.getSiblingDB('temp_restore').getCollectionNames()"
# 如果验证通过,正式恢复
if [ $? -eq 0 ]; then
    echo "验证通过,执行正式恢复..."
    mongorestore --uri="mongodb://localhost:27017" \
        --drop \
        "$LATEST_BACKUP"
fi

使用注意事项

  1. 备份文件权限:确保脚本有权限读取备份目录
  2. 网络连接:确保 MongoDB 服务正在运行
  3. 空间检查:恢复前检查磁盘空间是否充足
  4. 索引重建:恢复后可能需要重建索引

执行恢复

# 给脚本执行权限
chmod +x restore_mongodb.sh
# 执行恢复
./restore_mongodb.sh

根据你的具体需求选择合适的脚本方式,对于生产环境,建议先在小范围测试恢复流程。

抱歉,评论功能暂时关闭!