Apakah mungkin untuk memulihkan database MongoDB dari .ns dan .0, .1,. ... file?

14

Saya memiliki instalasi MongoDB 2.0.4 di Ubuntu 12.10. Baru-baru ini saya memiliki beberapa masalah koneksi ke database dari luar, dan menemukan ada sesuatu yang mencegah MongoDB memulai dengan benar. Seperti yang disarankan pada beberapa sumber (lihat StackOverflow) saya dihapus /var/lib/mongodb/mongodb.lockdan berlari mongod --repair. Ini tidak menyelesaikan masalah, MongoDB tidak akan berjalan dan terus membuat file kunci yang tidak perlu dihapus setelahnya. Dengan melihat log, saya menyadari bahwa itu tidak memiliki akses ke beberapa folder bernama $tmpSomething, jadi (karena namanya menyarankan folder sementara) saya menghapusnya, dan setelah itu semuanya bekerja ... kecuali fakta bahwa saya hanya punya satu dari database saya sebelumnya yang terlihat, sedangkan yang lain masih ada karena /var/lib/mongodb/folder saya masih penuh.ns .0 .1 .nfile yang berat banyak. Apakah ada cara untuk mengembalikannya ke database? (Saya sudah mencoba dengan mongorestore, tetapi seperti yang saya harapkan, itu tidak menangani file-file itu).

Terima kasih

tunnuz
sumber

Jawaban:

19

File .ns .0 .1dll. Adalah file data itu sendiri. Jika Anda memulai sebuah mongodinstance dengan --dbpathargumen yang menunjuk pada folder itu, atau jika Anda memindahkan konten ke tempat lain dan menggunakan opsi untuk menunjuk ke sana, mongod akan berusaha membacanya seperti biasa.

Karena masalah Anda menyarankan korupsi dan / atau beberapa masalah lain mulai mongod(Anda harus benar-benar memposting file log pesan startup, mungkin dalam pertanyaan terpisah untuk mengatasi masalah itu), maka ada alternatif. Sebagai referensi, masalah yang paling umum adalah perizinan terkait, terutama ketika orang mencoba untuk memulai mongod secara manual (seperti diri mereka sendiri) atau dengan sudo (sebagai root) dan membuat izin bermasalah di berbagai direktori.

Anda benar yang mongorestoretidak bisa menggunakan file data ini secara langsung, tetapi mongodumpbisa membacanya dan membuang data dari mereka ke file BSON yang mongorestoremengharapkan.

Opsi yang Anda inginkan di sini adalah dbpath . Anda menyebutkan jalur Anda /var/lib/mongo, sehingga Anda dapat menjalankan sesuatu seperti ini:

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

Secara opsional Anda dapat menggunakan di --repairsini juga untuk memperbaiki korupsi bersama dengan opsi kueri dalam keadaan ekstrem untuk menyiasati bagian yang rusak (jarang, jika pernah, diperlukan). Berbagai opsi dijelaskan pada mongodumphalaman:

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

Setelah Anda membuang file, Anda dapat menggunakannya mongorestoreuntuk mengimpornya kembali ke mongodinstance lain .

Adam C
sumber
5
Mongodump 3.0+ tidak lagi memiliki flag --dbpath .
doub1ejack
2
Dengan Mongo 3.0 sebuah opsi adalah memulai server mongo dengan file yang ditentukan: mongod --dbpath ./dan kemudian melanjutkan dengan mongodump tanpa--dbpath
Shwaydogg
3
Hanya sebuah catatan, jika Anda menjalankan Mongo 3.0 dan mongod --dbpath ./tidak memberikan Anda database dalam .ns .0file, bisa jadi mesin penyimpanan default ke mesin WiredTiger baru, bukan mesin MMapV1 lama. mongod --storageEngine mmapv1 --dbpath ./Sebagai gantinya cobalah menghubungkan menggunakan mesin lama.
flamebaud
1
Adakah yang bisa membantu saya memigrasi data dari file .ns, .0 dan .1 ke mongo 3.0
Mandeep Singh
1
Seperti yang dikatakan @flamebaud, mesin default telah berubah. Silakan periksa Perubahan Mesin Penyimpanan Default di dokumentasi Mongo. Anda mungkin juga ingin melihat pada awal dokumen di WiredTiger Storage Engine
Ludovic Kuty