Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

MongoDB 백업하고 복구하기

사용하던 MongoDB를 백업받아서 다른 서버로 이전해야할 일이 있었습니다. 어떤 게시판같은 서비스에 사용하는 것은 아니기 때문에 데이터를 실시간으로 유지해야할 건 아니었고 그냥 덤프떠서 복구하면 되는 거였고 건수도 몇건 안되긴 했습니다.(당연히 샤딩을 사용하지 않은 단일 디비입니다.)



mongodump
MongoDB가 설치된 bin디렉토리에 가면 mongodump라는 명령어가 존재합니다. 이 명령어를 사용하면 MongoDB 전체나 특정 DB, 컬렉션을 바이너리 형태로 덤프받을 수 있습니다. 즉 BSON형태로 내려받게 됩니다.

$ mongodump --host 127.0.0.1
connected to: 127.0.0.1
all dbs
DATABASE: dbname       to      dump/dbname
.....

위와같이 mongodump 명령어를 사용하면 MongoDB에 접속해서 전체 디비의 덤프를 dump라는 폴더아래 내려받게 됩니다. 디비별로 디렉토리가 하나씩 생기가 그 아래 컬랙션 별로 BSON 파일이 생성됩니다. 인증이 필요한 경우는 -u 아이디 -p 비밀번호 와 같은 옵션을 사용할 수 있고 -d 디비명 -c 컬렉션명 으로 특정 디비의 컬렉션만 덤프받을 수도 있습니다. 좀더 자세한 옵션에 대한 것은 가이드문서에 잘 나와있습니다. (예를 들면 ObjectID 대신 커스텀 id를 사용할 경우 속도문제를 해결하기 위한 방법 등)



mongorestore
mongodump 명령어가 존재하므로 당연히 mongorestore 명령어가 존재하고 이는 dump받은 BSON파일에서 데이터를 복구해주는 역할을 합니다.

$ mongorestore -h 127.0.0.1 ~/dump/
connected to: 127.0.0.1
....

위와 같이 몽고디비를 지정하고 덤프파일이 있는 디렉토리를 지정해 주면 됩니다. 덤프받을 때 index도 같이 덤프받기 때문에 복구과정에서 인덱스도 같이 생성이 됩니다.(index를 생성하지 않으려면 index 컬렉션의 BSON파일을 제거하면 됩니다.) mongorestore는 단순히 insert과정이 있기 때문에 겹치는 데이터가 있을 경우 해당 값을 덮어쓰지 않습니다. 복구 전에 존재하는 컬렉션을 없애고 싶다면 --drop 옵션을 사용합니다.

데이터를 복구하는 가운데 assertion: 13111 field not found, expect type 2가 날 수 있는데 이는 덤프받은 MongoDB와 복구하려는 MongoDB의 버전이 다른 경우에 발생합니다. 이 문제는 인덱스를 인서트 하는 과정에서 발생하는 듯 한데 -d, -c 옵션으로 디비와 컬렉션을 지정해서 인덱스를 제외한채로 복구하거나 앞에서 얘기한것처럼 index 덤프파일을 제거하고 데이터를 복구한 뒤에 ensureIndex로 인덱스를 다시 생성해 주면 됩니다.
2012/05/29 21:59 2012/05/29 21:59