January 18, 2023
기존 개발 서버에서 쓰던 디비를 몇 가지 옮겨서 쓸 일이 있어서 찾아보다가…
또 잊을까봐 정리해두려고 쓰는 포스팅..
구성은 Aws Ubuntu의 Docker 환경에서 진행하였다.
일단 Docker 안의 MongoDB에 접근해야 한다.
접근 명령어는 아래와 같이…
저 뒤의 mongo는 docker 컨테이너 이름인데 각자 알맞게 적어준다.
$ sudo docker exec --it mongo
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
위에서는 백업을 했으니 이제는 다시 복원시킬 차례다.
옮길 곳이 나는 로컬에서 Aws에서 도는 ubuntu였다.
백업 디렉토리는 파일질라 등으로 옮겨주고…
이제 대상지도 같은 환경이라 가정하고…
대상 도커 컨테이너 내에 넣어준다.
# sudo docker cp [현재 백업파일이 있는 디렉토리] [docker 내 컨테이너 이름]:[docker 내 저장할 디렉토리]
$ sudo docker cp ./my_backup mongo:/backup
그리고 MongoDB에 접속해 준다.
sudo docker exec -it mongo sh
그리고 해당 백업 디렉토리가 존재하는지 확인 후 아래의 명령어대로 리스토어를 실행한다.
# 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.
#
이렇게 하면 백업 & 복원이 간단하게 끝났다.
이거를 직접 통신으로 하는 방법도 있던 것 같은데…
일단 할 일이 많기 때문이 이런 노가다 방법으로 처리했다.
향후 시간이 될때 더 고차원적인 방법을 찾아봐야겠다.