MongoDB 删除数据库
MongoDB 提供了删除数据库的功能,可以清理不再需要的数据库。删除操作是不可逆的,请谨慎操作。
删除当前数据库
基本语法
javascript
db.dropDatabase()示例
javascript
// 切换到要删除的数据库
use mydb
// 删除当前数据库
db.dropDatabase()
// 输出:
// { "dropped" : "mydb", "ok" : 1 }删除前确认
查看当前数据库
javascript
// 确认当前数据库
db
// 输出: mydb
// 查看数据库统计信息
db.stats()查看集合列表
javascript
show collections
// 或
db.getCollectionNames()完整确认流程
javascript
use mydb
// 1. 确认数据库名称
print("当前数据库:", db.getName())
// 2. 查看集合列表
print("包含集合:", db.getCollectionNames())
// 3. 查看文档数量
print("文档总数:", db.stats().objects)
// 4. 查看数据大小
print("数据大小:", db.stats().dataSize, "bytes")安全删除流程
步骤 1:备份数据
bash
# 使用 mongodump 备份
mongodump --db mydb --out /backup/$(date +%Y%m%d)
# 或使用带认证的备份
mongodump --db mydb --username admin --password xxx --authenticationDatabase admin --out /backup/步骤 2:验证备份
bash
# 查看备份目录
ls -la /backup/
# 验证备份文件
mongorestore --dryRun /backup/mydb/步骤 3:执行删除
javascript
use mydb
// 再次确认
if (db.getName() === "mydb") {
db.dropDatabase()
print("数据库已删除")
} else {
print("数据库名称不匹配,取消删除")
}删除特定数据库(非当前)
MongoDB 没有直接删除非当前数据库的命令,需要先切换:
javascript
// 方法:切换到目标数据库后删除
use targetdb
db.dropDatabase()删除多个数据库
批量删除示例
javascript
// 要删除的数据库列表
var dbsToDelete = ["testdb1", "testdb2", "tempdb"]
dbsToDelete.forEach(function(dbName) {
var currentDb = db.getSiblingDB(dbName)
// 检查数据库是否存在
var dbList = db.adminCommand({ listDatabases: 1 })
var exists = dbList.databases.some(function(d) {
return d.name === dbName
})
if (exists) {
print("正在删除数据库:", dbName)
currentDb.dropDatabase()
print("已删除:", dbName)
} else {
print("数据库不存在:", dbName)
}
})删除保护机制
防止误删生产数据库
1. 使用管理员权限控制
javascript
// 创建只有特定权限的用户
use admin
db.createUser({
user: "dbadmin",
pwd: "password",
roles: [
{ role: "dbAdmin", db: "testdb" }, // 只能管理测试库
{ role: "read", db: "productiondb" } // 生产库只读
]
})2. 脚本保护
javascript
// safe-drop.js
var targetDb = "mydb"
var confirmName = "mydb" // 需要手动确认
if (targetDb === confirmName) {
db.getSiblingDB(targetDb).dropDatabase()
print("数据库已删除:", targetDb)
} else {
print("确认名称不匹配,取消删除")
}删除前检查清单
javascript
function safeDropDatabase(dbName) {
var targetDb = db.getSiblingDB(dbName)
// 检查 1: 数据库是否存在
var dbList = db.adminCommand({ listDatabases: 1 })
var exists = dbList.databases.some(function(d) {
return d.name === dbName
})
if (!exists) {
print("错误: 数据库不存在")
return false
}
// 检查 2: 不是系统数据库
var systemDbs = ["admin", "local", "config"]
if (systemDbs.indexOf(dbName) !== -1) {
print("错误: 不能删除系统数据库")
return false
}
// 检查 3: 获取统计信息
var stats = targetDb.stats()
print("数据库:", dbName)
print("集合数:", stats.collections)
print("文档数:", stats.objects)
print("数据大小:", stats.dataSize, "bytes")
// 执行删除
var result = targetDb.dropDatabase()
return result.ok === 1
}
// 使用
safeDropDatabase("mydb")恢复已删除的数据库
从备份恢复
bash
# 使用 mongorestore 恢复
mongorestore --db mydb /backup/20240120/mydb/
# 恢复到不同名称的数据库
mongorestore --db mydb_new /backup/20240120/mydb/从副本集恢复
如果配置了副本集,可以从从节点恢复数据:
bash
# 停止从节点
# 复制数据文件
# 重新启动常见问题
Q: 删除数据库后空间没有释放?
A: MongoDB 不会立即释放磁盘空间,可以使用 compact 命令:
javascript
// 压缩集合释放空间
db.collection.compact()
// 或使用 repairDatabase(需要停机)
db.repairDatabase()Q: 如何删除所有用户数据但保留结构?
A: 删除所有集合而不是删除数据库:
javascript
db.getCollectionNames().forEach(function(col) {
if (!col.startsWith("system.")) {
db[col].drop()
}
})Q: 删除操作需要多长时间?
A: 取决于数据量:
- 小数据库(<1GB):几乎瞬间完成
- 大数据库(>100GB):可能需要几分钟
命令行删除
非交互式删除
bash
# 直接执行删除命令
mongosh --eval "db.getSiblingDB('mydb').dropDatabase()"
# 带认证
mongosh -u admin -p --authenticationDatabase admin --eval "db.getSiblingDB('mydb').dropDatabase()"脚本删除
bash
#!/bin/bash
# drop-db.sh
DB_NAME=$1
BACKUP_DIR="/backup/$(date +%Y%m%d)"
if [ -z "$DB_NAME" ]; then
echo "用法: $0 <数据库名>"
exit 1
fi
# 备份
echo "备份数据库..."
mongodump --db $DB_NAME --out $BACKUP_DIR
# 删除
echo "删除数据库..."
mongosh --eval "db.getSiblingDB('$DB_NAME').dropDatabase()"
echo "完成"总结
删除数据库注意事项:
- 操作不可逆:删除前务必备份
- 确认当前数据库:使用
db命令确认 - 保护系统数据库:不要删除 admin、local、config
- 监控磁盘空间:删除后可能需要压缩释放空间
在下一章中,我们将学习 MongoDB 创建集合。