Mongodbdump 도중 오류 해결 ~ Failed: error writing data for collection `디비명.컬렉션명` to disk: error reading collection: Failed to parse: { find: “컬렉션명”, skip: 0, snapshot: true, $readPreference: { mode: “secondaryPreferred” }, $db: “디비명” }. Unrecognized field ‘snapshot’.

더 보기 “Mongodbdump 도중 오류 해결 ~ Failed: error writing data for collection `디비명.컬렉션명` to disk: error reading collection: Failed to parse: { find: “컬렉션명”, skip: 0, snapshot: true, $readPreference: { mode: “secondaryPreferred” }, $db: “디비명” }. Unrecognized field ‘snapshot’.”

몽고디비 서버가 구동되지 않는 오류 해결하기

개발중인 프로젝트에 도커를 도입하려고 하는데 몽고디비까지 추가해보려고 하다가 원래대로 되돌리려는 중 오류가 발생했습니다.

몽고디비를 아래과 같이 시작해보면 아무런 반응이 없네요.

$ sudo systemctl start mongod

현재 서비스 상태를 확인해 봅니다.

$ sudo systemctl status mongod
● mongod.service - MongoDB Database Server
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2019-04-19 14:00:59 KST; 3min 45s ago
     Docs: https://docs.mongodb.org/manual
  Process: 7925 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=100)
 Main PID: 7925 (code=exited, status=100)
      CPU: 21ms

 4월 19 14:00:59 doogle-ubuntu systemd[1]: Started MongoDB Database Server.
 4월 19 14:00:59 doogle-ubuntu systemd[1]: mongod.service: Main process exited, code=exited, status=100/n/a
 4월 19 14:00:59 doogle-ubuntu systemd[1]: mongod.service: Unit entered failed state.
 4월 19 14:00:59 doogle-ubuntu systemd[1]: mongod.service: Failed with result 'exit-code'.

서비스가 실패상태입니다. 당연히 몽고디비 서버는 떠있지 않네요.

로그 기록을 확인해 보면…

$ sudo tail mongod.log 
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] build environment:
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten]     distmod: ubuntu1604
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten]     distarch: x86_64
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten]     target_arch: x86_64
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] options: { config: "/etc/mongod.conf", net: { bindIp: "127.0.0.1", port: 27017 }, processManagement: { timeZoneInfo: "/usr/share/zoneinfo" }, storage: { dbPath: "/var/lib/mongodb", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongod.log" } }
2019-04-19T14:00:59.937+0900 I STORAGE  [initandlisten] exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory: /var/lib/mongodb, terminating
2019-04-19T14:00:59.937+0900 I NETWORK  [initandlisten] shutdown: going to close listening sockets...
2019-04-19T14:00:59.937+0900 I NETWORK  [initandlisten] removing socket file: /tmp/mongodb-27017.sock
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] now exiting
2019-04-19T14:00:59.937+0900 I CONTROL  [initandlisten] shutting down with code:100

밑에서 5번째 줄을 보면 원인을 확인 할 수 있습니다.

Attempted to create a lock file on a read-only directory: /var/lib/mongodb, terminating

/var/lib/mongodb 디렉토리가 읽기만 가능해서 lock 파일을 생성할 수 없는거 같네요.

경로 권한을 확인해 봅니다.

$ sudo ls -al
... (중략)...
drwxr-xr-x  4           999 mongodb       32768  4월 19 13:34 mongodb/
... (중략)...

보시는 바와 같이 디렉토리 및 하위 파일들 포함 모두 사용자가 바뀌었습니다. 아무래도 도커버전의 몽고디비가 한 짓(?)인거 같네요.

다음과 같이 권한을 복구해 줍니다.

$ sudo chown -R mongodb:mongodb mongodb

이제 다시 서비스를 시작하면 되겠습니다.

$ sudo systemctl start mongod

서비스 상태를 봐보면 정상적으로 구동중이라는 것을 확인할 수 있습니다.

$ sudo systemctl status mongod
● mongod.service - MongoDB Database Server
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-04-19 14:20:36 KST; 13s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 9963 (mongod)
    Tasks: 27
   Memory: 148.4M
      CPU: 926ms
   CGroup: /system.slice/mongod.service
           └─9963 /usr/bin/mongod --config /etc/mongod.conf

 4월 19 14:20:36 doogle-ubuntu systemd[1]: Started MongoDB Database Server.

리눅스에서는 항상 파일 권한 문제가 생길 수 있습니다. 주의하시기 바랍니다.

[링크] MongoDB 텍스트 검색 속도 향상 시키기

아직 한글에서도 제대로 되는지는 테스트해보지 못했다.

현재 MongoDB 는 풀텍스트 검색(Full-text search)에서 한국어 지원을 하고 있지 않다. ㅜㅜ

아래 링크 내용의 결론은 풀텍스트 검색과 regex 검색을 같이 해서 검색속도록 향상시키는 방식이다.. 문제는 몽고디비에서 한글을 풀텍스트 검색을 하는 경우 매우 제한적인 결과만 나오기 때문에 크게 의미가 없다.. 차라리 쓸데없는 것까지 검색된다면 regex 검색으로 걸러줄 수 있을 텐데..

https://medium.com/statuscode/how-to-speed-up-mongodb-regex-queries-by-a-factor-of-up-to-10-73995435c606