mysql 의 mysqldump처럼 간단히 MongoDB collection을 OS dump file로 떨구거나
반대로 mysql < test.sql 처럼 쉽게 import 가 가능합니다.
이번 글에서는 나무 위키에서 제공하는 덤프파일로 import 후 export 받아보겠습니다.
mongoimport
- namu wiki dumpfile 준비
https://namu.wiki/w/%EB%82%98%EB%AC%B4%EC%9C%84%ED%82%A4:%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%20%EB%8D%A4%ED%94%84
AL01542225:namuwiki_20170327.json nhn$ du -sh *namuwiki_20170327.json
7.1G namuwiki_20170327.json
7.1GB ,93만 rows dump file
- import option
root@74fa1843c544:/data# mongoimport --db test --collection kimdubi_test --type json --drop --file ./namuwiki_20170327.json --jsonArray
2019-11-09T07:39:31.845+0000 connected to: mongodb://localhost/
2019-11-09T07:39:31.849+0000 dropping: test.kimdubi_test
2019-11-09T07:39:34.850+0000 [........................] test.kimdubi_test 48.0MB/7.08GB (0.7%)
2019-11-09T07:39:37.848+0000 [........................] test.kimdubi_test 90.5MB/7.08GB (1.2%)
2019-11-09T07:48:46.226+0000 [#######################.] test.kimdubi_test 7.08GB/7.08GB (100.0%)
2019-11-09T07:48:46.796+0000 [########################] test.kimdubi_test 7.08GB/7.08GB (100.0%)
2019-11-09T07:48:46.796+0000 931029 document(s) imported successfully. 0 document(s) failed to import.
=> mongoimport 에는 여러 option이 있는데 자주 사용하는 옵션으로는 db, collection 지정하는 --db , --collection
data type 지정하는 --type (default json , csv 도 가능) , import 하기 전 collection drop 하는 --drop
dump file의 위치를 지정하는 --file , 데이터가 json 내 array 형태로 있는 경우에 사용하는 --jsonArray 옵션이 있다.
- parallel 도 가능
root@74fa1843c544:/data# mongoimport -d test -c kimdubi_test2 --file=./namuwiki_20170327.json --type=json --drop --numInsertionWorkers=2 --jsonArray
2019-11-09T08:51:06.750+0000 connected to: mongodb://localhost/
2019-11-09T08:51:06.751+0000 dropping: test.kimdubi_test2
2019-11-09T08:51:09.753+0000 [........................] test.kimdubi_test2 51.8MB/7.08GB (0.7%)
2019-11-09T08:51:12.765+0000 [........................] test.kimdubi_test2 72.3MB/7.08GB (1.0%)
2019-11-09T08:51:15.762+0000 [........................] test.kimdubi_test2 100MB/7.08GB (1.4%)
=> numInsertionWorkers option으로 concurrency 하게 수행 가능
- data에 array 형태 있을 때 jsonArray 안붙이면?
root@74fa1843c544:/data# mongoimport -d test -c kimdubi_test2 --file=./namuwiki_20170327.json --type=json --drop
2019-11-09T08:43:02.328+0000 connected to: mongodb://localhost/
2019-11-09T08:43:02.342+0000 dropping: test.kimdubi_test2
2019-11-09T08:43:05.340+0000 [........................] test.kimdubi_test2 256MB/7.08GB (3.5%)
2019-11-09T08:43:08.335+0000 [#.......................] test.kimdubi_test2 512MB/7.08GB (7.1%)
Killed
=> 실패
- import 확인
> db.kimdubi_test.stats()
{
"ns" : "test.kimdubi_test",
"size" : 4472188229,
"count" : 931029,
"avgObjSize" : 4803,
"storageSize" : 2691452928,
"capped" : false,
=> 압축 전 4.2GB size, 압축후 2.5GB 정도, 93만 row import 된 것 확인
mongoexport
- export option
root@74fa1843c544:/data# mongoexport -d test -c kimdubi_test -o kimdubi_test.json --type=json -f namespace,text
2019-11-09T09:05:13.572+0000 connected to: mongodb://localhost/
2019-11-09T09:05:14.576+0000 [........................] test.kimdubi_test 0/931029 (0.0%)
=> mongoimport 와 옵션은 거의 동일하며 -f, --fields 옵션이 있는데 지정한 collection 의 특정 필드만 export 하겠다는 옵션
replicaSet, Sharded cluster 에서 수행 시 --uri 옵션으로 readPreference 지정하여 slave 쪽에서 수행 가능함
default 는 primary에서 수행
mongoexport --uri="mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/reporting?replicaSet=myReplicaSetName&readPreference=secondary" --collection=events --out=events.json [additional options]
- parallel 하게 export
mongoexport -q '{"_id":{"$gte":0, "$lt":100000}}' -d test -c test > out1.json &
mongoexport -q '{"_id":{"$gte":100000, "$lt":200000}}' -d test -c test > out2.json &
=> -q query 조건 option 으로 os상에서 나눠 수행, 수행 가능 조건이 검증되었을 때 사용가능