sql >> データベース >  >> NoSQL >> MongoDB

MongoDB:警告のログ記録を無効にする方法:ClientCursor ::staticYieldは再帰ロックのb/cのロックを解除できませんか?

    mongod.logから月に25Gbが生成されているのを見て、最近このエラーを自分で調べています。 同様のメッセージで。ただし、ログメッセージにクエリが含まれていることに気付きました(この投稿に収まるようにメッセージをフォーマットしました。実際にはすべて1行でした):

    warning: ClientCursor::yield can't unlock b/c of recursive lock ns: my-database.users top:
    {
        opid: 1627436260,
        active: true,
        secs_running: 0,
        op: "query",
        ns: "my-database",
        query:
        {
            findAndModify: "users",
            query: { Registered: false, Completed: 0 },
            sort: { Created: 1 },
            update: { $set: { NextRefresh: "2014-12-07" } },
            new: true
        },
        client: "10.1.34.175:53582",
        desc: "conn10906412",
        threadId: "0x7f824f0f9700",
        connectionId: 10906412,
        locks: { ^: "w", ^my-database: "W" },
        waitingForLock: false,
        numYields: 0,
        lockStats: { timeLockedMicros: {}, timeAcquiringMicros: { r: 0, w: 3 } }
    }
    

    少しグーグルすると、このメッセージは、クエリがインデックスを使用できない場合に最も一般的に発生することがわかりました。 .explain()を使ってみました ログ内のクエリを使用すると、BasicCursor インデックスなしで使用されていました:

    db.users.find( { Registered: false, Completed: 0 } ).sort( { Created: 1 } ).explain()
    {
        "cursor" : "BasicCursor",
        "isMultiKey" : false,
        "n" : 0,
        "nscannedObjects" : 10453,
        "nscanned" : 10453,
        "nscannedObjectsAllPlans" : 10453,
        "nscannedAllPlans" : 10453,
        "scanAndOrder" : true,
        "indexOnly" : false,
        "nYields" : 1,
        "nChunkSkips" : 0,
        "millis" : 7,
        "indexBounds" : {
    
        },
        "server" : "mongodb-live.eu-west-1a.10_1_2_213:27017"
    }
    

    クエリに要素のインデックスを追加すると、問題が修正されました。ログは生成されなくなり、.explain()を実行すると ここでも、使用されているインデックスが示されています:

    {
        "cursor" : "BtreeCursor Registered_1_Completed_1",
        "isMultiKey" : false,
        "n" : 0,
        "nscannedObjects" : 0,
        "nscanned" : 0,
        "nscannedObjectsAllPlans" : 0,
        "nscannedAllPlans" : 1,
        "scanAndOrder" : true,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
            "Registered" : [
                [
                    false,
                    false
                ]
            ],
            "Completed" : [
                [
                    0,
                    0
                ]
            ]
        },
        "server" : "mongodb-live.eu-west-1a.10_1_2_213:27017"
    }
    



    1. MongoDBは、外部キーを使用してフィールドを別のコレクションにコピーします

    2. 日付フィールドでグループ化した後、2つの日付の間に欠落している月を追加するMongoDB集計

    3. 文字列からJavaを介して読み取ったのと同じ日付をmongodbに挿入するにはどうすればよいですか?

    4. Webmachineとeredisを連携させるにはどうすればよいですか?