You need to enable JavaScript to run this app.
导航

创建与已删除数据库同名的新数据库后,读写数据时为什么会失败?

最近更新时间2023.04.12 15:40:22

首次发布时间2022.05.09 11:14:11

问题现象

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

受影响的实例

分片集群类型的 MongoDB 实例。

原因

使用 dropDatabase 命令删除目标数据库后,没有在读取或写入数据前执行 flushRouterConfig 命令,导致分片集群实例中的节点可能并没有刷新元数据缓存。

建议

您可以参考如下建议规避上述问题:

  • 删除目标数据库后,务必先在 Mongos 节点上执行 flushRouterConfig 命令后再执行读写操作,以确保分片集群中的所有节点都已刷新了元数据缓存。MongoDB 数据库完整删除操作步骤,请参见 db.dropDatabase()
  • 通过 sh.enableSharding 命令开启分片集群实例数据库的分片功能,并通过 sh.shardCollection 命令将未分片的集合转为分片集合。
  • 删除目标数据库后,先重启 MongoDB 实例再进行数据读写操作。实例重启办法,请参见重启实例
  • 对于未开启分片功能的数据库,在删除数据库或集合之后,建议不要创建同名的数据库或集合。
    如果一定要创建同名数据库或集合,请务必在 Mongos 节点上执行刷新路由表的操作后,再创建同名的数据库或集合。