完整的 MongoDB 管理工具包,用于数据库管理、性能优化、备份/恢复操作和副本集管理。支持本地和远程 MongoDB 实例。
前置条件
- 已安装 MongoDB(服务器和/或客户端工具)
mongosh(MongoDB Shell)或传统 mongo 客户端
mongodump 和 mongorestore 工具
- 适当的数据库权限
- 目标 MongoDB 实例的网络访问权限
使用方法
连接管理
基本连接:
# 本地实例
mongosh
# 远程实例
mongosh "mongodb://localhost:27017/mydb"
mongosh "mongodb://user:pass@host:27017/mydb"
# 带认证
mongosh --host localhost --port 27017 --username admin --password --authenticationDatabase admin
# SSL/TLS 连接
mongosh "mongodb://host:27017/mydb?ssl=true"
连接字符串示例:
# 本地开发
mongosh "mongodb://localhost:27017/clawd_memory_db"
# 远程带认证
mongosh "mongodb://dbuser:password@10.0.0.100:27017/production_db?authSource=admin"
# 副本集
mongosh "mongodb://node1:27017,node2:27017,node3:27017/mydb?replicaSet=rs0"
# MongoDB Atlas
mongosh "mongodb+srv://username:password@cluster0.abcde.mongodb.net/mydb"
数据库操作
数据库管理:
// 列出数据库
show dbs
// 切换到数据库
use mydb
// 删除数据库
db.dropDatabase()
// 数据库统计信息
db.stats()
db.runCommand({dbStats: 1, scale: 10241024}) // MB 比例
集合操作:
// 列出集合
show collections
// 创建集合
db.createCollection("users")
db.createCollection("logs", {capped: true, size: 10000000, max: 1000})
// 删除集合
db.users.drop()
// 集合统计信息
db.users.stats()
备份和恢复
使用 mongodump/mongorestore:
# 备份整个数据库
mongodump --host localhost:27017 --db mydb --out /backup/$(date +%Y%m%d)
# 带认证备份
mongodump --host localhost:27017 --username admin --password --authenticationDatabase admin --db mydb --out /backup/
# 备份特定集合
mongodump --host localhost:27017 --db mydb --collection users --out /backup/
# 压缩备份
mongodump --host localhost:27017 --db mydb --gzip --out /backup/
# 恢复数据库
mongorestore --host localhost:27017 --db mydb /backup/mydb
# 恢复为不同名称
mongorestore --host localhost:27017 --db newdb /backup/mydb
# 恢复特定集合
mongorestore --host localhost:27017 --db mydb --collection users /backup/mydb/users.bson
自动化备份脚本:
#!/bin/bash
# mongodb-backup.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/var/backups/mongodb"
DB_NAME="clawd_memory_db"echo "Starting MongoDB backup: $DATE"
# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE
# 执行备份
mongodump --host localhost:27017 --db $DB_NAME --gzip --out $BACKUP_DIR/$DATE
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "✅ Backup completed: $BACKUP_DIR/$DATE"
# 创建指向最新备份的符号链接
ln -sfn $BACKUP_DIR/$DATE $BACKUP_DIR/latest
# 清理旧备份(保留 7 天)
find $BACKUP_DIR -type d -name "2" -mtime +7 -exec rm -rf {} \;
else
echo "❌ Backup failed!"
exit 1
fi
性能分析
查询性能:
// 启用性能分析
db.setProfilingLevel(2) // 分析所有操作
db.setProfilingLevel(1, {slowms: 100}) // 仅分析慢查询// 查看慢查询
db.system.profile.find().limit(5).sort({ts: -1}).pretty()
// 查找慢查询
db.system.profile.find({millis: {$gt: 100}}).sort({ts: -1}).pretty()
// 禁用性能分析
db.setProfilingLevel(0)
服务器状态和指标:
// 服务器状态
db.serverStatus()
// 当前操作
db.currentOp()
// 终止长时间运行的操作
db.killOp(opid)
// 数据库统计信息
db.stats()
// 集合统计信息
db.users.stats()
连接监控:
// 当前连接数
db.serverStatus().connections
// 活跃连接
db.runCommand({connPoolStats: 1})
// 列出当前会话
db.aggregate([{$listSessions: {}}])
索引管理
创建索引:
// 单字段索引
db.users.createIndex({email: 1})
// 复合索引
db.users.createIndex({email: 1, createdAt: -1})
// 全文搜索索引
db.articles.createIndex({title: "text", content: "text"})
// 部分索引
db.users.createIndex({email: 1}, {partialFilterExpression: {active: true}})
// TTL 索引(自动过期文档)
db.sessions.createIndex({expireAt: 1}, {expireAfterSeconds: 0})
// 后台创建索引
db.users.createIndex({email: 1}, {background: true})
索引分析:
// 列出索引
db.users.getIndexes()
// 索引使用统计
db.users.aggregate([{$indexStats: {}}])
// 解释查询执行
db.users.find({email: "test@example.com"}).explain("executionStats")
// 删除索引
db.users.dropIndex({email: 1})
db.users.dropIndex("email_1")
用户管理
数据库用户:
// 创建管理员用户
db.createUser({
user: "admin",
pwd: "securepassword",
roles: [{role: "userAdminAnyDatabase", db: "admin"}]
})// 创建数据库特定用户
db.createUser({
user: "appuser",
pwd: "apppassword",
roles: [
{role: "readWrite", db: "mydb"},
{role: "read", db: "analytics"}
]
})
// 更新用户
db.updateUser("appuser", { roles: [{role: "dbOwner", db: "mydb"}] })
// 更改密码
db.changeUserPassword("appuser", "newpassword")
// 列出用户
db.getUsers()
// 删除用户
db.dropUser("appuser")
自定义角色:
// 创建自定义角色
db.createRole({
role: "dataAnalyst",
privileges: [
{resource: {db: "analytics", collection: ""}, actions: ["find", "listIndexes"]},
{resource: {db: "logs", collection: ""}, actions: ["find"]}
],
roles: []
})// 授予用户角色
db.grantRolesToUser("analyst", ["dataAnalyst"])
副本集管理
初始化副本集:
// 初始化副本集
rs.initiate({
_id: "rs0",
members: [
{_id: 0, host: "mongo1:27017"},
{_id: 1, host: "mongo2:27017"},
{_id: 2, host: "mongo3:27017"}
]
})
副本集操作:
// 检查副本集状态
rs.status()
// 检查配置
rs.conf()
// 添加成员
rs.add("mongo4:27017")
// 移除成员
rs.remove("mongo4:27017")
// 降级主节点
rs.stepDown()
// 强制重新配置
rs.reconfig(config, {force: true})
数据导入/导出
JSON 导入/导出:
# 导出集合到 JSON
mongoexport --host localhost:27017 --db mydb --collection users --out users.json
# 带查询条件导出
mongoexport --host localhost:27017 --db mydb --collection users --query '{"active": true}' --out active_users.json
# 导入 JSON
mongoimport --host localhost:27017 --db mydb --collection users --file users.json
# 导入 CSV
mongoimport --host localhost:27017 --db mydb --collection users --type csv --headerline --file users.csv
维护任务
数据库维护:
// 压缩集合
db.users.compact()
// 修复数据库
db.repairDatabase()
// 验证集合
db.users.validate()
// 重新索引集合
db.users.reIndex()
清理操作:
# 清理孤立数据
mongosh --eval "db.runCommand({cleanupOrphaned: 'mydb.users'})"
# 压缩所有集合
mongosh mydb --eval "db.runCommand({compact: 'users', force: true})"
监控脚本
健康检查脚本:
#!/bin/bash
# mongodb-health.sh
echo "MongoDB Health Check - $(date)"
echo "=================================="# 检查 MongoDB 是否运行
if ! pgrep mongod > /dev/null; then
echo "❌ MongoDB is not running"
exit 1
fi
# 检查连接
mongosh --eval "db.adminCommand('ping')" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "✅ MongoDB connection: OK"
else
echo "❌ MongoDB connection: FAILED"
exit 1
fi
# 检查磁盘空间
DISK_USAGE=$(df -h /var/lib/mongodb | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 80 ]; then
echo "⚠️ Disk usage: ${DISK_USAGE}% (High)"
else
echo "✅ Disk usage: ${DISK_USAGE}%"
fi
# 检查内存使用
MEMORY_USAGE=$(mongosh --quiet --eval "JSON.stringify(db.serverStatus().mem)" | jq '.resident')
echo "📊 Memory usage: ${MEMORY_USAGE}MB"
# 检查活跃连接数
CONNECTIONS=$(mongosh --quiet --eval "db.serverStatus().connections.current")
echo "🔌 Active connections: $CONNECTIONS"
echo "Health check completed."
此技能为开发和生产环境提供全面的 MongoDB 管理能力。
Complete MongoDB administration toolkit for database management, performance optimization, backup/restore operations, and replica set management. Covers both local and remote MongoDB instances.
Prerequisites
- MongoDB installed (server and/or client tools)
mongosh (MongoDB Shell) or legacy mongo client
mongodump and mongorestore utilities
- Appropriate database permissions
- Network access to target MongoDB instance
Usage
Connection Management
Basic connection:
# Local instance
mongosh# Remote instance
mongosh "mongodb://localhost:27017/mydb"
mongosh "mongodb://user:pass@host:27017/mydb"
# With authentication
mongosh --host localhost --port 27017 --username admin --password --authenticationDatabase admin
# SSL/TLS connection
mongosh "mongodb://host:27017/mydb?ssl=true"
Connection string examples:
# Local development
mongosh "mongodb://localhost:27017/clawd_memory_db"# Remote with auth
mongosh "mongodb://dbuser:password@10.0.0.100:27017/production_db?authSource=admin"
# Replica set
mongosh "mongodb://node1:27017,node2:27017,node3:27017/mydb?replicaSet=rs0"
# MongoDB Atlas
mongosh "mongodb+srv://username:password@cluster0.abcde.mongodb.net/mydb"
Database Operations
Database management:
// List databases
show dbs// Switch to database
use mydb
// Drop database
db.dropDatabase()
// Database stats
db.stats()
db.runCommand({dbStats: 1, scale: 10241024}) // MB scale
Collection operations:
// List collections
show collections// Create collection
db.createCollection("users")
db.createCollection("logs", {capped: true, size: 10000000, max: 1000})
// Drop collection
db.users.drop()
// Collection stats
db.users.stats()
Backup and Restore
Using mongodump/mongorestore:
# Backup entire database
mongodump --host localhost:27017 --db mydb --out /backup/$(date +%Y%m%d)# Backup with authentication
mongodump --host localhost:27017 --username admin --password --authenticationDatabase admin --db mydb --out /backup/
# Backup specific collection
mongodump --host localhost:27017 --db mydb --collection users --out /backup/
# Compressed backup
mongodump --host localhost:27017 --db mydb --gzip --out /backup/
# Restore database
mongorestore --host localhost:27017 --db mydb /backup/mydb
# Restore with different name
mongorestore --host localhost:27017 --db newdb /backup/mydb
# Restore specific collection
mongorestore --host localhost:27017 --db mydb --collection users /backup/mydb/users.bson
Automated backup script:
#!/bin/bash
# mongodb-backup.shDATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/var/backups/mongodb"
DB_NAME="clawd_memory_db"
echo "Starting MongoDB backup: $DATE"
# Create backup directory
mkdir -p $BACKUP_DIR/$DATE
# Perform backup
mongodump --host localhost:27017 --db $DB_NAME --gzip --out $BACKUP_DIR/$DATE
# Check if backup successful
if [ $? -eq 0 ]; then
echo "✅ Backup completed: $BACKUP_DIR/$DATE"
# Create symlink to latest
ln -sfn $BACKUP_DIR/$DATE $BACKUP_DIR/latest
# Cleanup old backups (keep 7 days)
find $BACKUP_DIR -type d -name "2" -mtime +7 -exec rm -rf {} \;
else
echo "❌ Backup failed!"
exit 1
fi
Performance Analysis
Query performance:
// Enable profiling
db.setProfilingLevel(2) // profile all operations
db.setProfilingLevel(1, {slowms: 100}) // profile slow queries only// View slow queries
db.system.profile.find().limit(5).sort({ts: -1}).pretty()
// Find slow queries
db.system.profile.find({millis: {$gt: 100}}).sort({ts: -1}).pretty()
// Disable profiling
db.setProfilingLevel(0)
Server status and metrics:
// Server status
db.serverStatus()// Current operations
db.currentOp()
// Kill long-running operation
db.killOp(opid)
// Database statistics
db.stats()
// Collection statistics
db.users.stats()
Connection monitoring:
// Current connections
db.serverStatus().connections// Active connections
db.runCommand({connPoolStats: 1})
// List current sessions
db.aggregate([{$listSessions: {}}])
Index Management
Creating indexes:
// Single field index
db.users.createIndex({email: 1})// Compound index
db.users.createIndex({email: 1, createdAt: -1})
// Text search index
db.articles.createIndex({title: "text", content: "text"})
// Partial index
db.users.createIndex({email: 1}, {partialFilterExpression: {active: true}})
// TTL index (auto-expire documents)
db.sessions.createIndex({expireAt: 1}, {expireAfterSeconds: 0})
// Background index creation
db.users.createIndex({email: 1}, {background: true})
Index analysis:
// List indexes
db.users.getIndexes()// Index usage statistics
db.users.aggregate([{$indexStats: {}}])
// Explain query execution
db.users.find({email: "test@example.com"}).explain("executionStats")
// Drop index
db.users.dropIndex({email: 1})
db.users.dropIndex("email_1")
User Management
Database users:
// Create admin user
db.createUser({
user: "admin",
pwd: "securepassword",
roles: [{role: "userAdminAnyDatabase", db: "admin"}]
})// Create database-specific user
db.createUser({
user: "appuser",
pwd: "apppassword",
roles: [
{role: "readWrite", db: "mydb"},
{role: "read", db: "analytics"}
]
})
// Update user
db.updateUser("appuser", {
roles: [{role: "dbOwner", db: "mydb"}]
})
// Change password
db.changeUserPassword("appuser", "newpassword")
// List users
db.getUsers()
// Drop user
db.dropUser("appuser")
Custom roles:
// Create custom role
db.createRole({
role: "dataAnalyst",
privileges: [
{resource: {db: "analytics", collection: ""}, actions: ["find", "listIndexes"]},
{resource: {db: "logs", collection: ""}, actions: ["find"]}
],
roles: []
})// Grant role to user
db.grantRolesToUser("analyst", ["dataAnalyst"])
Replica Set Management
Initialize replica set:
// Initialize replica set
rs.initiate({
_id: "rs0",
members: [
{_id: 0, host: "mongo1:27017"},
{_id: 1, host: "mongo2:27017"},
{_id: 2, host: "mongo3:27017"}
]
})
Replica set operations:
// Check replica set status
rs.status()// Check configuration
rs.conf()
// Add member
rs.add("mongo4:27017")
// Remove member
rs.remove("mongo4:27017")
// Step down primary
rs.stepDown()
// Force reconfiguration
rs.reconfig(config, {force: true})
Data Import/Export
JSON import/export:
# Export collection to JSON
mongoexport --host localhost:27017 --db mydb --collection users --out users.json# Export with query
mongoexport --host localhost:27017 --db mydb --collection users --query '{"active": true}' --out active_users.json
# Import JSON
mongoimport --host localhost:27017 --db mydb --collection users --file users.json
# Import CSV
mongoimport --host localhost:27017 --db mydb --collection users --type csv --headerline --file users.csv
Maintenance Tasks
Database maintenance:
// Compact collection
db.users.compact()// Repair database
db.repairDatabase()
// Validate collection
db.users.validate()
// Re-index collection
db.users.reIndex()
Cleanup operations:
# Clean up orphaned data
mongosh --eval "db.runCommand({cleanupOrphaned: 'mydb.users'})"# Compact all collections
mongosh mydb --eval "db.runCommand({compact: 'users', force: true})"
Monitoring Scripts
Health check script:
#!/bin/bash
# mongodb-health.shecho "MongoDB Health Check - $(date)"
echo "=================================="
# Check if MongoDB is running
if ! pgrep mongod > /dev/null; then
echo "❌ MongoDB is not running"
exit 1
fi
# Check connection
mongosh --eval "db.adminCommand('ping')" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "✅ MongoDB connection: OK"
else
echo "❌ MongoDB connection: FAILED"
exit 1
fi
# Check disk space
DISK_USAGE=$(df -h /var/lib/mongodb | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 80 ]; then
echo "⚠️ Disk usage: ${DISK_USAGE}% (High)"
else
echo "✅ Disk usage: ${DISK_USAGE}%"
fi
# Check memory usage
MEMORY_USAGE=$(mongosh --quiet --eval "JSON.stringify(db.serverStatus().mem)" | jq '.resident')
echo "📊 Memory usage: ${MEMORY_USAGE}MB"
# Check active connections
CONNECTIONS=$(mongosh --quiet --eval "db.serverStatus().connections.current")
echo "🔌 Active connections: $CONNECTIONS"
echo "Health check completed."
This skill provides comprehensive MongoDB administration capabilities for both development and production environments.