Можно ли восстановить базы данных MongoDB из .ns и .0, .1,. ... файлы?

14

У меня есть установка MongoDB 2.0.4 на Ubuntu 12.10. Недавно у меня были некоторые проблемы с подключением к базе данных извне, и я обнаружил, что что-то мешало правильному запуску MongoDB. Как предложено в нескольких источниках (см. StackOverflow), я удалил /var/lib/mongodb/mongodb.lockи запустил mongod --repair. Это не решило проблему, MongoDB не запускался и продолжал создавать блокирующие файлы, которые он впоследствии не позаботился об удалении. Просматривая журналы, я понял, что у него нет доступа к какой-либо папке с именем $tmpSomething, поэтому (так как название предполагает временную папку), я удалил ее, а потом все заработало ... за исключением того факта, что у меня есть только одна из моих предыдущих баз данных в поле зрения, в то время как другие все еще там, потому что моя /var/lib/mongodb/папка все еще полна.ns .0 .1 .nфайлы, которые много весят. Есть ли способ восстановить их в базу данных? (Я пытался с mongorestore, но, как я и ожидал, он не обрабатывает эти файлы).

Благодарность

tunnuz
источник

Ответы:

19

Эти и .ns .0 .1т.д. файлы данных сами файлы. Если вы запустили mongodэкземпляр с --dbpathаргументом, указывающим на эту папку, или если вы переместили содержимое куда-то в другое место и использовали опцию, указывающую туда, mongod попытается прочитать их как обычно.

Поскольку ваши проблемы предполагают повреждение и / или mongodвозникновение какой-либо другой проблемы (вам действительно нужно опубликовать файлы журнала сообщений запуска, возможно, в отдельном вопросе для решения этой проблемы), существуют альтернативы. Для справки, наиболее распространенные проблемы связаны с разрешениями, особенно когда люди пытаются запустить mongod вручную (от своего имени) или с помощью sudo (от имени пользователя root) и создать проблемные разрешения в различных каталогах.

Вы правы, что mongorestoreне можете использовать эти файлы данных напрямую, но mongodumpможете читать их и выгружать данные из них в ожидаемые файлы BSON mongorestore.

Опция, которую вы хотите здесь, это dbpath . Вы упоминаете, что ваш путь есть /var/lib/mongo, так что вы можете запустить что-то вроде этого:

mongodump --dbpath /var/lib/mongo -d <database name> -o /path/to/put/files

При желании вы также можете использовать --repairздесь, чтобы исправить повреждение вместе с параметрами запроса в экстремальных обстоятельствах, чтобы обойти поврежденные разделы (редко, если вообще когда-либо это необходимо). Различные варианты описаны на mongodumpстранице:

http://docs.mongodb.org/manual/reference/mongodump/

После выгрузки файлов вы можете использовать их mongorestoreдля повторного импорта в другой mongodэкземпляр.

Адам С
источник
5
Mongodump 3.0+ больше не имеет флага --dbpath .
doub1ejack
2
В Mongo 3.0 можно запустить сервер mongo с указанными файлами, mongod --dbpath ./а затем продолжить работу с mongodump без--dbpath
Shwaydogg
3
Замечание: если вы используете Mongo 3.0 и mongod --dbpath ./не предоставляете базу данных в .ns .0файлах, возможно, механизм хранения по умолчанию использует новый механизм WiredTiger вместо старого модуля MMapV1. Попробуйте mongod --storageEngine mmapv1 --dbpath ./вместо этого подключиться, используя старый движок.
флейм
1
Может ли кто-нибудь помочь мне перенести данные из файлов .ns, .0 и .1 в mongo 3.0
Мандип Сингх
1
Как сказал @flamebaud, движок по умолчанию изменился. Пожалуйста, проверьте изменение механизма хранения по умолчанию в документации Mongo. Вы также можете посмотреть начало документа на WiredTiger Storage Engine
Ludovic Kuty