MongDB で頻繁にデータを書き込んだり削除したりすると、フラグメンテーションが発生します。 これらのフラグメントはディスクスペースを占有し、ディスク使用量を削減します。 Collection 内のすべてのデータと Index を書き換えてデフラグし、未使用のスペースを解放して、ディスクの使用率とクエリのパフォーマンスを向上させることができます。
注意事項
- この操作を実行する前に、データベースをバックアップすることをお勧めします。
- デフラグ中はデータベースがロックされ、読み取り/書き込み操作はブロックされます。 そのため、ピーク時間外に操作を実行することを推奨します。
- この操作を頻繁に実行することはお勧めしません。
スタンドアロンインスタンスまたはレプリカセットインスタンスの操作例
- mongo shell を介して ApsaraDB for MongoDB の primary ノードに接続します。 詳細は、 mongo shell を介したインスタンスへの接続 をご参照ください。
- 次のコマンドを実行して、Collection が保存されているデータベースに切り替えます。
use <database_name>
コマンドの説明:
<database_name>:データベースの名前。
- 次のコマンドを実行して Collection に対するデフラグを開始します。
db.runCommand({compact:"<collection_name>",force:true})
コマンドの説明:
<collection_name>:Collection の名前。
注 force パラメーターは省略可能です。- 値が true の場合、compact コマンドはレプリカセットの primary ノードで実行できます。
- 値が false の場合、primary ノードで実行された compact コマンドはエラーを返します。
- コマンドの実行が完了するまで待ちます。
{"OK": 1}
が返された場合、コマンドが実行されました。注 compact 操作はセカンダリノードに渡されません。 インスタンスがレプリカセットインスタンスである場合、上記の手順を繰り返して、mongo shell を介して secondary ノードに接続し、compact コマンドを実行します。
デフラグが完了したら、db.stats()
コマンドを実行して、データベースのディスク占有量を表示できます。
シャードクラスターインスタンスの操作例
- mongo shell を介して、シャードクラスターインスタンス内のすべての mongos に接続します。 詳細は、mongo shell を介した ApsaraDB for MongoDB シャードクラスターインスタンスへの接続 をご参照ください。
- 次のコマンドを実行して、シャードの primary ノードで Collection をデフラグします。
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>",force:true}})
コマンドの説明:
<Shard ID>:shard の ID。
<collection_name>:Collection の名前。
- 次のコマンドを実行して、shard の secondary ノードで collection をデフラグします。
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>"},queryOptions: {$readPreference: {mode: 'secondary'}}})
コマンドの説明:
<Shard ID>:shard の ID。
<collection_name>:Collection の名前。
デフラグが完了したら、db.runCommand({dbstats:1})
コマンドを実行して、デフラグ後にデータベースの占有量を表示できます。