You need to enable JavaScript to run this app.
导航
创建与已删除数据库同名的新数据库后,读写数据时为什么会失败?
最近更新时间:2024.10.11 16:42:24首次发布时间:2022.05.09 11:14:11

问题现象

创建一个与已删除数据库同名的新数据库后,无法从新数据库中读取到最新数据,或无法将数据写入新数据库。

受影响的实例

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 节点上执行刷新路由表的操作后,再创建同名的数据库或集合。