Skip to content

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 创建集合