- 文档首页
文档数据库 MongoDB 版
常见问题
报错和异常
创建与已删除数据库同名的新数据库后,读写数据时为什么会失败?
报错和异常
创建与已删除数据库同名的新数据库后,读写数据时为什么会失败?
创建与已删除数据库同名的新数据库后,读写数据时为什么会失败?
问题现象
创建一个与已删除数据库同名的新数据库后,无法从新数据库中读取到最新数据,或无法将数据写入新数据库。
受影响的实例
4.0 或 4.2 版本的 MongoDB 分片集群实例。
可能原因
由于 MongoDB 4.4 之前版本的实例使用 dropDatabase 命令删除目标数据库后,没有自动执行 flushRouterConfig 命令,导致分片集群实例中的节点可能并没有刷新元数据缓存。更多详情,请参见 MongoDB issues。 说明
从 MongoDB 4.4 版本起,执行dropDatabase 命令时系统会根据需要自动刷新分片集群的路由表。因此针对 MongoDB 4.4 及之后版本的 MongoDB 分片实例,使用 dropDatabase 命令删除目标数据库后无需再运行 flushRouterConfig。更多详情,请参见 flushRouterConfig。 处理方法
您可以参考如下建议规避上述问题:
- 删除目标数据库后,务必先在 Mongos 节点上执行 flushRouterConfig 命令后再执行读写操作,以确保分片集群中的所有节点都已刷新了元数据缓存。MongoDB 数据库完整删除操作步骤,请参见 db.dropDatabase()。
- 通过 sh.enableSharding 命令开启分片集群实例数据库的分片功能,并通过 sh.shardCollection 命令将未分片的集合转为分片集合。
- 删除目标数据库后,先重启 MongoDB 实例再进行数据读写操作。实例重启操作步骤,请参见重启实例。
- 对于未开启分片功能的数据库,在删除数据库或集合之后,建议不要创建同名的数据库或集合。
- 如果一定要创建同名数据库或集合,请务必在 Mongos 节点上执行刷新路由表的操作后,再创建同名的数据库或集合。
最近更新时间:2026.01.04 20:19:27