2012-12-03 4 views
2

Auparavant, je n'avais plus d'espace disque et mongodb a cessé de fonctionner. Ensuite, j'ai augmenté la taille du disque, mais mongodb ne commence pas à fonctionner.La commande de réparation MongoDB a échoué

Bien que j'ai activé la journalisation, je dois exécuter la commande suivante
sudo -u mongodb mongod --dbpath/var/lib/MongoDB/--repair

Mais cette commande de réparation a une exception et arrêter la réparation et puis quittez.

Fri Nov 30 13:29:36 [initandlisten] build index bd_production.news { _id: 1 } 

    Fri Nov 30 13:29:36 [initandlisten]  fastBuildIndex dupsToDrop:0 

    Fri Nov 30 13:29:36 [initandlisten] build index done. scanned 2549 total 
    records. 0.008 secs 

    Fri Nov 30 13:29:36 [initandlisten] bd_production.change_sets 
    Assertion failure isOk() src/mongo/db/pdfile.h 360 

    0x879d86a 0x85a9835 0x85e441e 0x84caa02 0x84c7d19 0x8229b5a 0x822bfd8 
0x875bd51 0x875f0c7 0x8760df4 0x83e6523 0x83b6c3b 0x8753b07 0x83b92bf 
0x8827ab7 0x882a53b 0x882d4bf 0x882d691 0x85ed280 0x81719dc 

mongod(_ZN5mongo15printStackTraceERSo+0x2a) [0x879d86a] 

mongod(_ZN5mongo10logContextEPKc+0xa5) [0x85a9835] 
... 
... 
... 
    ... some error msg 

    Fri Nov 30 13:29:36 [initandlisten] assertion 0 assertion 
    src/mongo/db/pdfile.h:360 ns:bd_production.change_sets 
    query:{} 

    Fri Nov 30 13:29:36 [initandlisten] problem detected during query over 
    bd_production.change_sets : { $err: "assertion 
    src/mongo/db/pdfile.h:360" } 

    Fri Nov 30 13:29:36 [initandlisten] query 
    bd_production.change_sets ntoreturn:0 keyUpdates:0 exception: 
    assertion src/mongo/db/pdfile.h:360 reslen:71 197ms 

    Fri Nov 30 13:29:36 [initandlisten] exception in initAndListen: 13106 
    nextSafe(): { $err: "assertion src/mongo/db/pdfile.h:360" }, terminating 

    Fri Nov 30 13:29:36 dbexit: 
    ... 
    ... 

La collecte de nouvelles a été réparée avec succès, mais le 'change_set' n'est pas réparé correctement. Comment puis-je réparer la collection (change_set) ou la base de données en question?

MISE À JOUR: Quand je lance mongodump avec --repair pour cette collection change_set je suis message d'erreur:

Tue Dec 4 10:45:21 [tools]   backwards extent pass 
Tue Dec 4 10:45:21 [tools]    extent loc: 5:1181e000 
Tue Dec 4 10:45:21 [FileAllocator] allocating new datafile /home/suvankar/dd/bd_production.5, filling with zeroes... 
Tue Dec 4 10:45:21 [FileAllocator] creating directory /home/suvankar/dd/_tmp 
Tue Dec 4 10:45:21 [FileAllocator] done allocating datafile /home/suvankar/dd/bd_production.5, size: 511MB, took 0.042 secs 
Tue Dec 4 10:45:21 [tools]     warning: Extent not ok magic: 0 going to try to continue 
Tue Dec 4 10:45:21 [tools]     length:0 
Tue Dec 4 10:45:21 [tools]      ERROR: offset is 0 for record which should be impossible 
Tue Dec 4 10:45:21 [tools]      wrote 1 documents 
Tue Dec 4 10:45:21 [tools]    extent loc: 0:0 
Tue Dec 4 10:45:21 [tools]     ERROR: invalid extent ofs: 0 
Tue Dec 4 10:45:21 [tools]     5 objects 
Tue Dec 4 10:45:21 dbexit: 
Tue Dec 4 10:45:21 [tools] shutdown: going to close listening sockets... 
Tue Dec 4 10:45:21 [tools] shutdown: going to flush diaglog... 
Tue Dec 4 10:45:21 [tools] shutdown: going to close sockets... 
Tue Dec 4 10:45:21 [tools] shutdown: waiting for fs preallocator... 
Tue Dec 4 10:45:21 [tools] shutdown: lock for final commit... 

Répondre

4

Si mongod la réparation ne le fait pas, alors il est en cours d'exécution à un niveau de la corruption qu'il ne peut pas réparer ou contourner en termes d'avoir un ensemble valide et correct de fichiers de base de données pour démarrer.

Vous pouvez exécuter mongodump with repair, ce qui est plus agressif pour essayer de contourner la corruption, et ne démarre pas une instance mongod (donc ne nécessite pas les fichiers pour être correct afin de continuer).

mongodump --repair --dbpath /var/lib/mongodb/ <other options here> 

Sachez cependant, qu'en raison de la façon dont il tente de contourner la corruption, vous pouvez vous retrouver avec plusieurs copies d'un document. Avec mongorestore fonctionne ce n'est pas un problème, mais en fonction du niveau de corruption, vous pouvez vous retrouver avec des fichiers de vidage beaucoup plus grand que vous attendez. Dans un cas très extrême, j'ai vu une fois 10x données produites, bien que ce fût l'exception plutôt que la règle. Une fois que vous avez tout jeté à votre satisfaction, démarrez mongod et réimportez pour revenir à un bon état.

+0

lorsque j'ai exécuté la commande suivante j'ai eu l'erreur suivante msg: $ sudo mongodump --répair --dbpath/var/lib/mongodb 'Si vous utilisez un mongod sur le même chemin, vous devez vous connecter à ce lieu au lieu de direct accès aux fichiers de données lun 3 déc 21:53:14 dbexit: lun déc 3 21:53:14 [outils] arrêt: aller fermer les prises d'écoute ... lun déc 3 21:53:14 [tools] shutdown : va rincer diaglog ... . Lun Dec 3 21:53:14 [outils] shutdown: fermeture de tous les fichiers ... Lun Dec 3 21:53:14 [outils] closeAllFiles() terminé Lun Dec 3 21:53:14 dbexit: vraiment sortir maintenant ' – suvankar

+1

Ok, donc un certain nombre de choses - 1. MongoDB ne devrait pas être en cours d'exécution lorsque vous essayez ceci - je ne pense pas que ce soit, mais juste pour être sûr; 2. Vous devriez probablement spécifier notre répertoire de sortie (voir les options sur la page de commande que j'ai liée); 3. Vous devez spécifier la base de données que vous essayez de sauvegarder (avec '--db') et optionnellement la collection (' --collection') - en gros ma commande exemple était juste cela, un exemple, vous devez fournir une commande complète en fonction de vos besoins pour que cela fonctionne –

+0

J'ai corrigé la commande pour faire réparer avec mongodump ... mais pas de chance !! le message d'erreur que j'ai reçu est dans la section mise à jour de ma question. Après l'exécution de la commande, créez un fichier change_set.bson vide, mais aucun fichier de métadonnées n'est créé.d'autres collections fonctionnent correctement. – suvankar

Questions connexes