2012-06-29 4 views
1

j'ai couruEst-ce que convertToCapped de Mongo alloue plus d'espace à chaque fois qu'il est exécuté?

db.runCommand({"convertToCapped": "all", size: 268435456000})

pour couronner la collection en cours à 250Go. La session SSH a expiré, mais j'ai constaté une augmentation de 250 Go de l'utilisation du disque. J'ai vérifié les journaux et vu:

Thu Jun 28 23:41:18 [conn312] command logs.$cmd command: { convertToCapped: "all", size: 268435456000.0 } ntoreturn:1 reslen:37 4399826ms 
Thu Jun 28 23:41:20 [conn313] end connection 127.0.0.1:53704 

Qu'est ce que ntoreturn: 1?

J'ai réexécuté la commande. Je me suis dit que ce serait juste de voir qu'il était déjà 250Go et plafonné, mais il remplit un autre 250Go. Que fais-je exactement?

Répondre

2

Lorsque vous exécutez convertToCapped, MongoDB clone la collection d'origine pour créer une nouvelle collection avec la taille demandée avant de supprimer celle d'origine. Vous devriez voir cela dans les journaux de mongod avec une séquence qui ressemble à peu près comme:

Fri Jun 29 15:14:49 [FileAllocator] allocating new datafile ./capped.2, filling with zeroes... 
Fri Jun 29 15:14:54 [FileAllocator] done allocating datafile ./capped.2, size: 2047MB, took 4.984 secs 
Fri Jun 29 15:14:54 [conn1] command capped.$cmd command: { cloneCollectionAsCapped: "all", toCollection: ".tmp.convertToCapped.all", size: 1536870912.0 } ntoreturn:1 reslen:37 5134ms 
Fri Jun 29 15:14:54 [conn1] CMD: drop capped.all 
Fri Jun 29 15:14:54 [conn1] command capped.$cmd command: { convertToCapped: "all", size: 1536870912.0 } ntoreturn:1 reslen:37 5135ms 
  • Les nouveaux fichiers de données sont pré-allouées pour la collection plafonnés (« all » pour correspondre à votre exemple)
  • La collection existante est cloné à une collection temporaire plafonnée
  • la collection originale est tombé
  • la collection temporaire est renommé à l'original

Donc, si vous avez une collection plafonnée de 250 Go et que vous relancez convertToCapped avec 250 Go, vous doublerez temporairement l'espace utilisé (250 Go pour la collection plafonnée d'origine et 250 Go pour la nouvelle). Vous pouvez récupérer l'espace supplémentaire à l'aide de db.repairDatabase().

Questions connexes