Я думаю, что вы столкнулись с этой проблемой:
https://jira.mongodb.org/browse/SERVER-4804
В большинстве случаев кажется, что база данных на самом деле удалена, но монги по-прежнему сообщают об этом как о находящейся там. Вы можете убедиться, что он исчез, либо попытавшись использовать БД и получив ошибку, либо напрямую войдя в осколки и проверив.
Ошибка относится к проблемам с удалением баз данных во время миграции. Вы можете обойти причину проблемы, выполнив что-то вроде этого (sub в вашем собственном dbname):
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 для mongoses, чтобы обновить информацию о конфигурации:
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
Если вы в сломанном состоянии, вы можете попробовать это, но это сложно:
Чтобы «сбросить» метаданные сегментирования для устранения этой проблемы, попробуйте выполнить следующее
Сначала остановите балансировщик (как указано выше) и дождитесь окончания миграции (также, как указано выше)
Затем убедитесь, что на рассматриваемой базе данных нет активности с серверов приложений
Теперь убедитесь, что в 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.database отсутствует запись базы данных для "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> 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 для всех mongoses:
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)