本文目录导读:

- 使用 mongorestore 命令(基本脚本)
- 带身份验证和选项的恢复脚本
- Python 脚本版本
- 带进度条和日志的恢复脚本
- 使用 mongodump/mongorestore 的定时恢复脚本
- 使用注意事项
- 执行恢复
我来介绍几种恢复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
使用注意事项
- 备份文件权限:确保脚本有权限读取备份目录
- 网络连接:确保 MongoDB 服务正在运行
- 空间检查:恢复前检查磁盘空间是否充足
- 索引重建:恢复后可能需要重建索引
执行恢复
# 给脚本执行权限 chmod +x restore_mongodb.sh # 执行恢复 ./restore_mongodb.sh
根据你的具体需求选择合适的脚本方式,对于生产环境,建议先在小范围测试恢复流程。