Docs 主页 → 开发应用程序 → MongoDB Manual
dropDatabase
定义
dropDatabase
dropDatabase
命令会删除当前数据库,并删除关联的数据文件。
语法
该命令具有以下语法:
db.runCommand( { dropDatabase: 1, writeConcern: <document>, comment: <any> } )
命令字段
该命令采用以下可选字段:
字段 | 说明 | |
---|---|---|
writeConcern | 可选。 表达大于 时要使用的 写关注(write
省略使用 当在副本集上发出时,如果指定的写关注(write concern)导致成员确认少于写关注(write concern) 在分片集群上发出时,MongoDB 会将指定的写关注转换为 另请参阅行为。 | |
comment | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 |
mongosh
还提供了辅助方法db.dropDatabase()
。
行为
锁
从版本 4.2.2 开始,该操作仅采用独占 (X) 数据库锁。
在版本 3.6-4.2.1 中,该操作在删除数据库中的集合时采用独占 (X) 数据库锁,但在删除现在为空的数据库时采用全局锁。
用户管理
该命令不会删除与当前数据库相关联的用户。要删除相关用户,请在要删除的数据库中运行 dropAllUsersFromDatabase
命令。
索引
在删除数据库之前, db.dropDatabase()
方法和dropDatabase
命令会中止任何正在进行的基于目标数据库中集合的索引构建。中止索引构建与删除构建的索引具有相同的效果。
对于副本集或分片副本集,中止主节点上的索引不会同时中止从节点索引构建。MongoDB 尝试中止主节点上指定索引正在进行的构建。如果成功,则会创建关联的 abort
oplog 条目。从节点如果有正在进行的构建的副本,则在提交或中止索引构建之前会等待来自主节点的提交或中止 oplog 条目。
副本集和分片集群
- 副本集
dropDatabase
至少要等到数据库中的所有集合删除都已传播到大多数副本集成员(即使用写关注"majority"
)。如果您指定需要少数人确认的写关注,则该命令使用写关注
"majority"
。如果您指定需要大多数人确认的写关注(write concern),则该命令将使用指定的写关注(write concern)。
- 分片集群
在分片集群上发出时,MongoDB 会将指定的写关注转换为
"majority"
。如果打算创建与已删除的数据库同名的新数据库,则必须按照以下附加步骤使用
dropDatabase
命令(特定于您的 MongoDB 版本):对于 MongoDB 5.0 及更高版本,您必须:
dropDatabase
在mongos
上运行 命令,无需执行其他步骤。
对于MongoDB 4.2 ,您必须:
在
mongos
上运行dropDatabase
命令命令成功完成后,在
mongos
上再次运行dropDatabase
命令在读取或写入该数据库之前,对所有
mongos
实例使用flushRouterConfig
命令。
这些步骤确保所有集群节点刷新其元数据缓存,其中包括新数据库主分片的位置。否则,您可能会在读取时丢失数据,并且可能无法将数据写入正确的分片。要恢复,您必须手动干预。
从 MongoDB5 0开始。如果您尝试从 中删除 管理员数据库 或
db.dropDatabase()
配置数据库 , 、dropDatabase
命令和mongos
方法会返回错误。
Change Streams
db.dropDatabase()
方法和 为在已删除的数据库上打开或在已删除的数据库中的集合上打开的任何dropDatabase
变更流 创建 无效 。
例子
mongosh
中的以下示例使用use
<database>
操作将当前数据库切换到temp
数据库,然后使用dropDatabase
命令删除temp
数据库:
use temp db.runCommand( { dropDatabase: 1 } )