MongoDB 백업(Backup) & 복원(Restore) (With Docker)

Posted by , January 18, 2023
MongoDB
Series ofMongoDB

thumbnail

슬슬 데이터를 이동해볼까...

기존 개발 서버에서 쓰던 디비를 몇 가지 옮겨서 쓸 일이 있어서 찾아보다가...
또 잊을까봐 정리해두려고 쓰는 포스팅..

구성은 Aws Ubuntu의 Docker 환경에서 진행하였다.


MongoDb Backup

일단 Docker 안의 MongoDB에 접근해야 한다.
접근 명령어는 아래와 같이...
저 뒤의 mongo는 docker 컨테이너 이름인데 각자 알맞게 적어준다.

$ sudo docker exec --it mongo /bin/bash

Shell에 접근 후 전체 디비를 뜨는 경우 옵션을 안줘도 되지만,
나는 특정 디비만 백업하면 되는 것이라서 아래와 같이 명령어를 수행했다.

그리고 out뒤의 인자는 덤프를 뜬 뒤의 디렉토리를 정해주는건데 Shell 내부 디렉토리를 가리킨다.

# mongodump --out /backup/ --db mydb

만약 디비가 없는 경우 아래와 같이 에러가 나므로 주의

# mongodump --out /backup/ --db mydb
2023-01-18T11:49:23.716+0900	Failed: error creating intents to dump: error getting collections for database `mydb`: (Unauthorized) command listCollections requires authentication

내 디비의 경우 계정 비밀번호가 있었는데 이 경우 아래와 같이 옵션을 주면 된다.

 -u : 디비 접근 가능 id
 -p : 계정 암호
 --db : 대상 디비

정상적으로 덤프를 따면 아래와 같이 덤프가 생성되고 담기게 된다.

# mongodump --out /backup/ -u mydbuser -p 12345 --db mydb
2023-01-18T02:56:20.823+0000	writing mydb.a_data to /backup/mydb/a_data.bson
2023-01-18T02:56:20.828+0000	writing mydb.a_data to /backup/mydb/a_data.bson
2023-01-18T02:56:20.829+0000	writing mydb.a_data to /backup/mydb/a_data.bson
2023-01-18T02:56:20.837+0000	done dumping mydb.a_data (0 documents)
2023-01-18T02:56:20.839+0000	done dumping mydb.a_data (153 documents)
2023-01-18T02:56:20.842+0000	done dumping mydb.a_data (0 documents)
2023-01-18T02:56:20.852+0000	writing mydb.a_data to /backup/mydb/a_data.bson
2023-01-18T02:56:21.042+0000	done dumping mydb.a_data (1051 documents)

이렇게 하면 백업 데이터가 backup 디렉토리에 저장이 된다.
이것을 이제 밖으로 빼려면 아래와 같이 수행한다.
실행은 shell 밖에서 해준다.

# sudo docker cp [docker 내 컨테이너 이름]:[아까 백업 담겼던 디렉토리] [저장할 디렉토리]

$ sudo docker cp mongo:/backup/ ./my_backup

MongoDb Resotre

위에서는 백업을 했으니 이제는 다시 복원시킬 차례다.
옮길 곳이 나는 로컬에서 Aws에서 도는 ubuntu였다.

백업 디렉토리는 파일질라 등으로 옮겨주고...

이제 대상지도 같은 환경이라 가정하고...
대상 도커 컨테이너 내에 넣어준다.

# sudo docker cp [현재 백업파일이 있는 디렉토리] [docker 내 컨테이너 이름]:[docker 내 저장할 디렉토리]

$ sudo docker cp ./my_backup mongo:/backup

그리고 MongoDB에 접속해 준다.

sudo docker exec -it mongo /bin/bash

그리고 해당 백업 디렉토리가 존재하는지 확인 후 아래의 명령어대로 리스토어를 실행한다.

# mongorestore -u tester -p 12345 --db mydb ./backup
2023-01-18T12:05:40.287+0900	The --db and --collection flags are deprecated for this use-case; please use --nsInclude instead, i.e. with --nsInclude=${DATABASE}.${COLLECTION}
2023-01-18T12:05:40.292+0900	building a list of collections to restore from backup dir
2023-01-18T12:05:40.293+0900	reading metadata for mydb.a.data from backup/data.metadata.json
.....
2023-01-18T12:05:40.490+0900	1204 document(s) restored successfully. 0 document(s) failed to restore.
#

이렇게 하면 백업 & 복원이 간단하게 끝났다.

기타

이거를 직접 통신으로 하는 방법도 있던 것 같은데...
일단 할 일이 많기 때문이 이런 노가다 방법으로 처리했다.

향후 시간이 될때 더 고차원적인 방법을 찾아봐야겠다.