やりたいこと
MongoDBの特定のデータベース内で遅いトランザクションが発生している時間帯やクエリの中身を突き止める。
環境情報
- Mongo v4.0
やり方
対象のデータベースを選定した後に
rs0:PRIMARY> use testdb switched to db testdb
以下コマンドを押下すればそれ以降の処理にて100ms以上かかったクエリがsystem.profileにログとして保管されるようになる。
rs0:PRIMARY> db.setProfilingLevel(1,100) { "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1, "operationTime" : Timestamp(xx, 1), "$clusterTime" : { "clusterTime" : Timestamp(xx, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } }
同クエリは以下のように時刻データ付きで確認が可能。
rs0:PRIMARY> db.system.profile.find() { "op" : "update", "ns" : "xx", "command" : { "q" : { "_id" : "..." }, "u" : { "$currentDate" ... [ ], "user" : "" }
以下補足です。
補足
現在スロークエリログを保管する設定になっているか否かは
rs0:PRIMARY> db.getProfilingLevel()
で確認でき、0であれば保管せずに1であれば保管されています。
また、1の場合は以下にてslowmsのms秒が確認できて
rs0:PRIMARY> db.getProfilingStatus() { "was" : 0, "slowms" : 100, "sampleRate" : 1, ....
保管が不要になれば
rs0:PRIMARY> db.setProfilingLevel(0)
で元のスロークエリを保管しない状態に戻せます。
以上です。