本文目录导读:

- 自动化备份与恢复
- 自动化索引管理
- 自动清理过期数据(TTL 或定时任务)
- 监控与告警脚本
- 自动用户权限管理
- 定期数据压缩(Power of 2 或 collMod)
- 自动化调度(Crontab 示例)
- 最佳实践建议
是的,可以通过编写实用脚本来自动化管理 MongoDB 的许多日常任务,MongoDB 提供了丰富的命令行工具和驱动程序接口,使得自动化运维成为可能。
以下是几个常见的自动化管理场景及对应的实用脚本示例:
自动化备份与恢复
使用 mongodump 和 mongorestore 工具。
备份脚本 (Shell):
#!/bin/bash
# 备份所有数据库到带日期的目录
BACKUP_DIR="/backups/mongodb"
DATE=$(date +%Y%m%d_%H%M%S)
DB_HOST="localhost"
DB_PORT="27017"
# 创建备份
mongodump --host $DB_HOST --port $DB_PORT --out "$BACKUP_DIR/$DATE"
# 保留最近7天的备份,删除更早的
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;
echo "Backup completed: $BACKUP_DIR/$DATE"
恢复脚本 (Shell):
#!/bin/bash # 从指定备份目录恢复 RESTORE_DIR="/backups/mongodb/20250326_120000" mongorestore --drop --dir $RESTORE_DIR
自动化索引管理
使用 mongosh 脚本监控和创建索引。
创建索引脚本 (JavaScript for mongosh):
// ensure_indexes.js
db = db.getSiblingDB('myapp');
// 为常用查询创建索引
db.users.createIndex({ email: 1 }, { unique: true });
db.orders.createIndex({ status: 1, date: -1 });
db.products.createIndex({ category: 1, price: 1 });
// 检查缺失索引(需要开启 profiling)
// db.setProfilingLevel(2);
// 分析慢查询日志...
print('Indexes created successfully');
执行: mongosh --quiet ensure_indexes.js
自动清理过期数据(TTL 或定时任务)
方案 A:利用 MongoDB TTL 索引(推荐)
// 自动删除 24 小时前的日志
db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 86400 });
不需要额外脚本,MongoDB 后台线程会自动清理。
方案 B:定时清理脚本 (Shell + mongosh)
#!/bin/bash
# 删除旧数据
mongosh --quiet <<EOF
use your_database;
db.collection.deleteMany({
status: "temporary",
createdAt: { \$lt: new Date(Date.now() - 2 * 3600 * 1000) }
});
EOF
配合 cron 定时执行:crontab -e 添加 0 */6 * * * /path/to/cleanup.sh
监控与告警脚本
检查副本集健康状态 (Python 示例)
#!/usr/bin/env python3
from pymongo import MongoClient
import smtplib
client = MongoClient('mongodb://localhost:27017/')
repl_status = client.admin.command('replSetGetStatus')
# 检查每个成员状态
for member in repl_status['members']:
if member['stateStr'] != 'PRIMARY' and member['stateStr'] != 'SECONDARY':
print(f"ALERT: Member {member['name']} in state {member['stateStr']}")
# 发送告警邮件
# send_alert(f"Node {member['name']} is unhealthy")
print(f"Replica set has {len(repl_status['members'])} members, ok.")
自动用户权限管理
创建/轮换用户密码脚本:
use admin;
// 创建应用只读用户(Idempotent 写法)
if (!db.getUser('app_readonly')) {
db.createUser({
user: 'app_readonly',
pwd: 'secure_password_here', // 建议从环境变量读取
roles: [{ role: 'read', db: 'myapp' }]
});
print('User created');
}
定期数据压缩(Power of 2 或 collMod)
压缩集合脚本:
// run_compact.js
use myapp;
db.runCommand({ compact: 'orders' }); // 会阻塞操作,建议维护窗口执行
或使用碎片整理:db.collection.aggregate([{$merge: {into: "orders"}}])
自动化调度(Crontab 示例)
# 每天凌晨2点备份 0 2 * * * /opt/scripts/mongo_backup.sh >> /var/log/mongo_backup.log 2>&1 # 每6小时清理一次临时数据 0 */6 * * * /opt/scripts/mongo_cleanup.sh # 每5分钟检查副本集健康状态 */5 * * * * /opt/scripts/mongo_health_check.py
最佳实践建议
- 使用配置管理工具:对于复杂部署(如 Kubernetes),推荐使用 Operator 或 Ansible/Chef 进行声明式管理。
- 安全考虑:不要在脚本中硬编码密码,使用环境变量、Vault 或 MongoDB Atlas/AWS Secrets Manager。
- 幂等性:确保脚本可以重复安全执行(如创建索引时检查是否存在)。
- 日志记录:给脚本添加详细的日志输出,便于问题排查。
- 错误处理:添加
set -e(Shell)或 try-catch(Python)确保失败时退出或告警。
简单的备份/清理任务用 Shell 脚本配合 cron 最快捷,复杂的运维逻辑推荐用 Python(pymongo)或 Go(mongo-go-driver)编写,这些脚本可以很好地将 MongoDB 管理从手工操作转化为自动化流程。