ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 몽고디비 인덱스 생성 확인 및 취소하기 - 인덱스 생성전에 미리 알자
    DB/MongoDB 2021. 2. 4. 18:49

    몽고디비 조회 속도가 너무 느려져서 인덱스를 추가했다.

     

    추가하는데 엄청난 시간이 들지 예상하지 못해, 생성문을 실행했는데, 이게 실행이 되지 않아 당연히 클라이언트에서 실행중 수행시간이 길어져 프로세스가 꺼진줄 알고 그냥 뒀다.

    robo 3T 라는 툴에서는 프로세스가 15초 이상 실행되어 실행되지 않는다~ 뭐 이런 식의 문구가 떠서 끄면 작업이 끝난줄 알았다.

     

    그런데 이게 최초에 foreground 로 돌리던게 돌아갔던건지 background 로 돌리던게 돌아가는건지 몽기DB 쓰기 수행작업이 lock 이 걸렸습다.

    백그라운드로 돌렸어도 전체에 락이 걸렸을거 같은데 확실치 않다.

     

    인덱스 생성 명령어를 수행한지 2시간이 지나도 lock 이 안풀려있엇어서 서비스 병목 현상때문에 알게 되었다. 

     

    나중이 되서야 인덱스 생성되는 프로세스를 끌 수 있다는걸 그 뒤에 알았다 ㅠㅠ.

    안일하게 생성명령어만 돌리고 생성안되었다고 방치하지만 않았어도 이슈가 발생하지 않았는데 말이다.

     

    최초에 금방 생성될 줄 알고 실수로 포그라운드에서 인덱스 생성을 날렸어서,

    클라이언트에서 중지됐다는 alert 문구와 별개로 계속 백그라운드에서 실행중이였나 보다.

     

    백그라운드로 돌려도 그런 형상이 나오는지는 잘 모르겠다.

     

    해서 현재 만들어지고 있는 인덱스 생성 오퍼레이션을 취소해줘야 한다.

     

    아래와 같은 방법이 있는지 알았으면.....

    killIndexMaking = function(a) {
        currOp = db.currentOp({"op": "command", 'query.createIndexes':'인덱스를 건 컬렉션명'})['inprog']
        //print(currOp) // 만들고있는 인덱스가 맞는지 check
        print("Killing opId: " + currOp[0].opid);
        //db.killOp(currOp[0].opid); // 죽인다.
    };
     
    killIndexMaking(1)

    db.currentOp명령어로 'query.createIndexes'컬럼을 필터로 걸어 해당 컬렉션에 걸리고있는 인덱스 목록을 가져온다. 위에서는 인덱스를 하나만 만들고 있다고 가정하고 첫번째(currOp[0].opid)를 죽인다. 

    일단 실행전에 인덱스 생성 리스트를 확인해본다.

     

    리스트를 확인해보는 방법은 여러개가 있다.

    db.currentOp(true).inprog.forEach(function(op){ if(op.msg!==undefined) print(op.msg) })
    db
      .currentOp({"command.createIndexes": { $exists : true } })
      .inprog
      .forEach(function(op){ print(op.msg) })
    db.currentOp({ 
        'msg' :{ $exists: true },
        'command': { $exists: true },
        $or: [ 
            { 'command.createIndexes': { $exists: true } }, 
            { 'command.reIndex': { $exists: true } }
        ]
    }).inprog.forEach(function(op) { 
        print(op.msg); 
    });

     

    op 를 찾아서 해당 오퍼레이션을 지워줘야 하는데 문서를 보다 보니

    Use the dropIndexes command or its shell helpers dropIndex() or dropIndexes() to terminate an in-progress index build. See Abort In-Progress Index Builds for more information.
    Do not use killOp to terminate an in-progress index builds in replica sets or sharded clusters.

     

    이런 말이 나왔다. 

    killOp 를 쓰지말고 dropIndex() 를 사용해라. 혹시나 이런 일이 생길 경우에 dropIndex 를 써봐야겠다.

     

    docs.mongodb.com/manual/core/index-creation/ [공식문서]
    qkqhxla1.tistory.com/998 [인덱스 생성 취소 스크립트]
    https://stackoverflow.com/questions/22309268/mongodb-status-of-index-creation-job [인덱스 생성 중인 상태보기]

     

     

    반응형

    'DB > MongoDB' 카테고리의 다른 글

    [MongoDB] 몽고디비 인덱스 설명 및 생성  (0) 2020.12.17

    댓글

Designed by Tistory.