다른 서버에서 운용하고 있는 mongoDB data를 백업할 때 생겼던 이슈와 그 해결 방법을 적어본다.
remote mongodb dump 명령어는 $ mongodb --help
를 통해서도 참고할 수 있다.
$ mongodump -h <db ip:port> -d <db이름> -c <collection이름> --out <dump할 디렉토리>
에러 1
Failed: error writing data for collection `dumpdb.fs.chunks` to disk: error reading collection: Failed to parse: { find: "fs.chunks", skip: 0, snapshot: true, $readPreference: { mode: "secondaryPreferred" }, $db: "dumpdb" }. Unrecognized field 'snapshot'.
mongodump를 실행하는 mongo 서버와, dump할 데이터를 갖고 있는 mongo 서버의 버전이 다르기 때문에 생기는 에러라고 한다.
확인해보니
local에 있는 mongo 버전은 3.6.3
remote mongo 버전은 4.4.0 이었다.
해결 1
이럴 경우, 도커를 이용하여 간단하게 해결할 수 있다.
$ sudo docker run --rm -v ~/<dump받을 local디렉토리>:/<dump받을 container디렉토리> mongo:4.0 mongodump -h <ip:port> -d <db이름> --out <dump받을 container디렉토리>
에러 2
Failed: error dumping metadata: error creating directory for metadata file /dump: mkdir /dump: permission denied
docker를 실행하면 다음과 같은 에러가 날 수 있다.
볼륨된 local의 디렉토리에 쓰기 권한이 없을 경우다.
해결 2
mkdir -m 777 dump
디렉토리에 권한을 주면 정상적으로 dump가 진행된다.
dump를 하고나면 docker -rm
명령으로 인해 container는 mongodump를 수행한 뒤 바로 삭제된다.
볼륨된 디렉토리에는 dump된 데이터가 생성돼 있다.
복구는 별거 없이 mongorestore로 하면 버전 차이 따지지 않고 잘 된다.
mongorestore -h <db ip:host> -d <새로 복구되는 db이름> <dump 디렉토리이름>/<dump한 db이름>
mongorestore -h 127.0.0.1:27017 -d newdb dump/dumbdb