我在分片的四节点集群上有一个 200gb 的数据库,我想删除数据库并从节点中删除与其关联的所有文件。我正在连接到我的 mongos 并在其上调用 dropDatabase。系统返回ok,但是如果调用show dbs,它会再次显示数据库并显示它仍在占用200gb。我做错了什么?

最佳答案

我认为您遇到了这个问题:

https://jira.mongodb.org/browse/SERVER-4804

在大多数情况下,似乎数据库实际上已被删除,但 mongos 仍然报告它在那里。您可以通过尝试使用数据库并收到错误或直接登录分片并检查来验证它是否已消失。

该错误是指在迁移发生时删除数据库的问题。您可以通过执行以下操作(在您自己的 dbname 中使用 sub)来解决问题的原因:

mongos> use config
switched to db config

// 1. stop the balancer
mongos> db.settings.update({_id: "balancer"}, {$set: {stopped: true}}, true)

// 2. wait for in-progress migrations to finish, this may take a few seconds
mongos> while (db.locks.findOne({_id: "balancer", state: {$ne: 0}}) != null) { sleep(1000); }

// 3. now you can safely drop the database
mongos> use <dbname>
switched to db <dbname>
mongos> db.dropDatabase()
{ "dropped" : "<dbname>", "ok" : 1 }

您可能需要在蒙古猫上运行flushRouterConfig来刷新配置信息:
mongos> use config
switched to db config
mongos> var mongoses = db.mongos.find()
mongos> while (mongoses.hasNext()) { new Mongo(mongoses.next()._id).getDB("admin").runCommand({flushRouterConfig: 1}) }
{ "flushed" : true, "ok" : 1 }

当然,真正的修复只有在提交修复时才会出现 - 看起来它是针对 2.1

如果你处于 splinter 状态,你可以试试这个,但它很棘手:

要“重置”分片元数据以从此问题中恢复,请尝试执行以下操作

首先,停止平衡器(如上)并等待迁移完成(如上)
接下来,确保相关数据库上的应用服务器没有事件

现在,确保 config.collections 中没有以“TestCollection”开头的命名空间的集合条目。如果是这样,请通过 mongos 删除这些条目:
mongos> use config
mongos> db.collections.find({_id: /^TestCollection\./})
// if any records found, delete them
mongos> db.collections.remove({_id: /^TestCollection\./})

接下来,确保 config.databases 中没有“TestCollection”的数据库条目,如果有,请通过 mongos 将其删除:
mongos> use config
switched to db config
mongos> db.databases.find({_id: "TestCollection"})
// if any records found, delete them
mongos> db.databases.remove({_id: "TestCollection"})

现在,确保 config.chunks 中没有针对数据库中任何命名空间的条目(例如默认的测试命名空间)。如果有,请通过 mongos 删除:
mongos> use config
switched to db config
mongos> db.chunks.find({ns: /^test\./})
// if any records found, delete them
mongos> db.chunks.remove({ns: /^test\./})

然后,对所有蒙古包使用flushRouterConfig:
mongos> use config
switched to db config
mongos> var mongoses = db.mongos.find()
mongos> while (mongoses.hasNext()) { new Mongo(mongoses.next()._id).getDB("admin").runCommand({flushRouterConfig: 1}) }
{ "flushed" : true, "ok" : 1 }
...

最后,手动连接到每个分片主分片,并在分片上删除数据库(并非所有分片都可能有数据库,但最好彻底并在所有分片上发出 dropDatabase() 调用

关于正在进行的迁移,您可以使用以下代码段:
// 2. wait for in-progress migrations to finish, this may take a few seconds
mongos> while (db.locks.findOne({_id: "balancer", state: {$ne: 0}}) != null) { sleep(1000); }

完成后,不要忘记重新启用平衡器:
mongos> use config
switched to db config

mongos> db.settings.update({_id: "balancer"}, {$set: {stopped: false}}, true)

关于MongoDb DropDatabase 不工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9407838/

10-13 00:29