Last Updated on 6월 5, 2024 by Jade(정현호)
안녕하세요
이번 포스팅에서는 MongoDB 에서 제공하는 몇 가지 유틸리티에 대해서 확인해보도록 하겠습니다.
Contents
MongoDB의 백업 종류 와 단위
MongoDB를 포함한 다른 DBMS에서도 보편적으로 백업 종류(방법) 크게 물리적 백업과 논리적 백업으로 나눌 수 있습니다.
MongoDB Community Edition 기준으로 기본 제공되는 백업 메서드로는 논리적인 백업 및 복구 방법만 제공하고 있습니다.
Community Edition 에서는 물리적 백업을 지원하지 않지만 다른 방법 통해서 물리적 백업/복구 방식을 사용할 수는 있습니다.
• MongoDB를 중지 후 데이터 파일 복사: 세컨더리 인스턴스에서 수행
• 세컨더리 멤버에서 복제 중지 후 데이터 파일 복사: fsyncLock 이용
• 파일시스템 스냅샷으로 백업: 리눅스의 LVM 스냅샷이나 Amazon EC2의 EBS 스냅샷 이용
(MongoDB Enterprise Edition 나 Percona Server for MongoDB 는 논외)
이와 같이 논리적인 백업/복구와 물리적 백업/복구로 종류를 나눌 수 있으며 글에서는 Community Edition 기본 제공되는 논리적 백업/복구에 대한 내용을 다루도록 하겠습니다.
MongoDB에서 논리적 백업은 JSON이나 CSV, BSON 파일 포맷으로 내보내기를 합니다.
백업 단위는 다음과 같이 백업 받을 수 있습니다.
1. MongoDB의 모든 DB 백업
2. DB 단위의 백업
3. 컬렉션 단위 백업
mongoexport & mongoimport
mongoimport 와 mongoexport는 범용적인 Standard한 데이터 타입의 파일을 입력과 출력(저장) 할 수 있는 유틸리티이며, 논리적 백업 및 데이터 Load를 수행합니다.
mongoexport 와 mongodump 차이점
mongoexport 는 다음에 나올 mongodump와 동일하게 논리적인 백업 방식으로 MongoDB 데이터베이스에서 데이터를 읽어서 JSON, CSV, TSV 유형으로 파일을 생성하며, mongodump는 BSON 형식으로 파일을 생성합니다.
두 유틸리티는 유사점이 있으며, 둘 사이에는 몇 가지 차이점이 있습니다.
- mongodump 는 BSON 이라는 바이너리 형식으로 파일을 내보내며, mongoexport는 JSON 등의 텍스트타입의 파일로 내보내기를 합니다.
- mongodbump는 추출 시 데이터 이외에 구조 정보에 대한 메타데이터도 같이 저장하며, mongoexport는 데이터만 저장합니다.
- 그래서 컬렉션에 인덱스가 존재할 경우 mongodump 백업본을 통한 복구 시 인덱스도 같이 생성되지만 mongoexport을 통한 백업본으로 복구시에는 인덱스는 생성되지 않습니다.
- 즉, mongoexport는 데이터 추출 목적의 유틸리티입니다.
- mongodump가 mongoexport에 비해 상대적으로 대규모 데이터에 대해서 백업과 복원에 속도면에서 유리합니다.
- mongoexport는 JSON,CSV와 같이 텍스트 타입으로 저장되는 만큼 이기종 데이터베이스로의 이관하는데 사용이 용이 합니다.
- mongoexport 로 추출된 파일은 사람이 보고 편집할 수 있는 텍스트 타입의 파일인 만큼 직접 데이터의 확인이 용이하고, 데이터에 대한 가공이나 편집 등의 작업이 가능한 면이 있습니다.
mongoimport
mongoimport의 지원하는 타입은 다음과 같습니다.
- JSON
- CSV (콤마로 구분)
- TSV (tab 으로 구분)
위의 같은 일반적인 파일타입 통해서 이기종 간의 Migration 을 수행할 수 있습니다.
테스트를 위한 csv 파일 내용은 아래와 같습니다.
name,age,gender,country John,25,Male,USA Jane,30,Female,Canada Michael,18,Male,Germany Emily,21,Female,USA David,40,Male,UK Sophia,28,Female,France Daniel,22,Male,Japan Amy,33,Female,Australia Alex,29,Male,Korea
• import 수행
$ mongoimport --username admin \ --authenticationDatabase=admin \ --db test --collection emp \ --type csv \ --file imp_emp.csv \ --headerline connected to: mongodb://localhost/ 9 document(s) imported successfully. 0 document(s) failed to import.
테스트 환경에서는 MongoDB Authentication 이 설정된 상태임에 따라서 위와 같이 실행하였습니다.
MongoDB 계정과 인증에 대한 내용은 아래 포스팅을 참조하시면 됩니다.
* 샤드 클러스터 환경에서 mongos에 접속하여 수행해야 합니다.
mongoimport에서 headerline 옵션은 CSV 파일의 첫 번째 줄이 필드 이름을 포함하는지 여부를 나타냅니다.
이 옵션을 사용하면 CSV 파일의 첫 번째 줄이 필드 이름을 포함하는 경우 이를 자동으로 인식하고 필드 이름을 사용하여 MongoDB 컬렉션에 데이터를 삽입합니다.
이 옵션을 사용하지 않으면 MongoDB는 CSV 파일의 첫 번째 줄을 데이터로 처리하고 필드 이름을 사용하지 않습니다.
기본 포트가 아닌 다른 포트를 사용할 경우 아래와 같이 --port 옵션을 사용합니다.
mongoimport --port 포트번호
SSL/TLS가 필수로 활성화가 된 MongoDB에서는 다음과 같은 옵션 사용이 필요 합니다.
mongoimport --username 계정명 \ --host="rs0/아이피주소:27017" \ --authenticationDatabase=admin \ --db test --collection emp \ --ssl --tlsInsecure \ --type json \ --file=emp.json
--ssl: SSL/TLS 프로토콜 접속으로 수행함을 의미합니다.
--tlsInsecure: 서버의 인증서 체인 및 호스트 이름에 대한 유효성 검사를 무시합니다.
--sslCAFile : 인증 기관의 루트 인증서 체인을 포함하는 .pem 파일을 선택합니다.
보통 올바른 키 파일을 사용할 경우 sslCAFile이나 sslPEMKeyFile 옵션을 사용하며, 그렇지 않을 경우 tlsInsecure 옵션을 사용합니다.
[참고] mongoimport/mongoexport 에서 ReplicaSet 이름 지정
mongoimport/mongoexport 에서 ReplicaSet 이름 지정하는 방법은 크게 두가지 방법이 있으며 URI 방식과 위와 같이 host 에 같이 입력하는 방법이 있습니다.
--host="rs0/아이피주소:27017" * rs0 은 ReplicaSet 이름을 의미합니다
MongoDB에 접속 후 컬렉션을 조회하면 하면 아래와 같이 데이터가 정상적으로 입력된 것을 확인할 수 있습니다.
> db.emp.find(); { "_id" : ObjectId("6427dd9085e2c2e509e35374"), "name" : "John", "age" : 25, "gender" : "Male", "country" : "USA" } { "_id" : ObjectId("6427dd9085e2c2e509e35375"), "name" : "Jane", "age" : 30, "gender" : "Female", "country" : "Canada" } { "_id" : ObjectId("6427dd9085e2c2e509e35376"), "name" : "Michael", "age" : 18, "gender" : "Male", "country" : "Germany" } { "_id" : ObjectId("6427dd9085e2c2e509e35377"), "name" : "Emily", "age" : 21, "gender" : "Female", "country" : "USA" } { "_id" : ObjectId("6427dd9085e2c2e509e35378"), "name" : "David", "age" : 40, "gender" : "Male", "country" : "UK" } { "_id" : ObjectId("6427dd9085e2c2e509e35379"), "name" : "Sophia", "age" : 28, "gender" : "Female", "country" : "France" } { "_id" : ObjectId("6427dd9085e2c2e509e3537a"), "name" : "Daniel", "age" : 22, "gender" : "Male", "country" : "Japan" } { "_id" : ObjectId("6427dd9085e2c2e509e3537b"), "name" : "Amy", "age" : 33, "gender" : "Female", "country" : "Australia" } { "_id" : ObjectId("6427dd9085e2c2e509e3537c"), "name" : "Alex", "age" : 29, "gender" : "Male", "country" : "Korea" }
테스트를 위해 인덱스를 생성하도록 하겠습니다.
> db.emp.createIndex({ name : 1})
mongoexport
mongoexport는 MongoDB 인스턴스에 저장된 데이터의 JSON 또는 CSV 내보내기를 생성하는 유틸리티입니다.
mongoexport에서는 --query 및 --sort 옵션을 사용하여 내보낼 데이터를 필터링하고 정렬할 수 있습니다.
• 사용 예시 - CSV 파일로 내보내기
$ mongoexport --username admin \ --authenticationDatabase=admin \ --db test --collection emp \ --type csv \ --fields=name,age,gender,country \ --out=emp_export.csv connected to: mongodb://localhost/ exported 9 records
mongoexport 를 수행할 때는 output 할 파일의 type을 지정해야 합니다.
CSV 형식으로 내보낼 때에는 내보낼 document의 field를 지정해야 합니다.
--fields=name,age,gender,country
생성된 파일 내용을 확인해보면 컬렉션 내용과 동일함을 확인할 수 있습니다.
$ more emp_export.csv name,age,gender,country John,25,Male,USA Jane,30,Female,Canada Michael,18,Male,Germany Emily,21,Female,USA David,40,Male,UK Sophia,28,Female,France Daniel,22,Male,Japan Amy,33,Female,Australia Alex,29,Male,Korea
SSL/TLS 사용시 위의 내용과 같이 다음의 옵션을 추가로 사용합니다.
--ssl: SSL/TLS 프로토콜 접속으로 수행함을 의미합니다.
--tlsInsecure: 서버의 인증서 체인 및 호스트 이름에 대한 유효성 검사를 무시합니다.
--sslCAFile : 인증 기관의 루트 인증서 체인을 포함하는 .pem 파일을 선택합니다.
위의 설명과 같이 mongoexport는 데이터 추출을 하는 논리적 백업 유틸리티입니다. 인덱스와 같은 구조 정보를 담고 있지 않습니다.
다만 csv나 json과 같이 익숙한 포맷으로 저장하기 때문에 쉬운 편집 및 이기종 db로의 이관 등을 하기 용이합니다.
mongodump & mongorestore
mongodump 와 mongorestore 는 논리적으로 백업 및 백업된 파일을 복원하는 유틸리티로 BSON 파일 유형으로 백업을 합니다.
mongodump와 mongorestore는 MongoDB Community Edition에서 지원되는 공식 백업 유틸리티로 논리적 백업 방식으로 수행됩니다.
mongoexport와 유사하게 MongoDB에 저장된 컬렉션 데이터를 추출(덤프) 하여 BSON에 저장을 합니다.
물리적 백업 방식은 이러한 논리적 백업 방식과 다르게 실제 데이터파일을 Copy 하는 방식을 의미합니다.
논리적 백업 방식은 실제 데이터 레코드를 읽어서 추출하며 지정된 파일 포맷으로 저장합니다.
그래서 상대적으로 물리적 백업에 비해서 백업 및 복구에 시간이 더 소요되는 점이 있습니다.
백업 및 복원은 아래와 같은 단위로 수행할 수 있습니다.
1. MongoDB의 모든 DB 백업(local 데이터베이스는 추출하지 않습니다)
2. DB 단위의 백업
3. 컬렉션 단위 백업
mongodump
mongodump 는 백업을 수행하는 유틸리티로 기존 데이터를 BSON 파일로 내보내게 됩니다.
• 명령어 예시)
1) MongoDB 전체 백업 mongodump --out /../../dump 2) 데이터베이스 단위 백업 mongodump --db test \ --out /../../dump 3) 컬렉션 단위로 백업 mongodump --db test \ --collection emp \ --out /../../dump
위에서 테스트로 입력한 emp 컬렉션에 대해서 mongodump 를 수행해보도록 하겠습니다.
• mongodump 백업수행
## mongodump 수행 $ mongodump --username admin \ --authenticationDatabase=admin \ --db test \ --collection emp \ --out /.../.../dump writing test.emp to /.../.../dump/test/emp.bson done dumping test.emp (9 documents) ## 파일 확인 $ ls -al test 합계 8 drwxr-xr-x. 2 root root 47 14:00 . drwxr-xr-x. 3 root root 18 14:00 .. -rw-r--r--. 1 root root 755 14:00 emp.bson -rw-r--r--. 1 root root 170 14:00 emp.metadata.json
* 위에서 경로는 실제 경로가 아닙니다.
백업의 실행으로 BSON 파일 타입으로 생성된 것을 확인할 수 있습니다.
디렉토리에 생성된 파일을 보면 데이터를 담고 있는 bson 파일외 metadata.json 파일도 생성된 것을 확인할 수 있습니다.
해당 파일은 json으로 OS에서 cat 등의 명령어로 내용을 확인할 수 있습니다.
$ cat emp.metadata.json | jq { "indexes": [ { "v": { "$numberInt": "2" }, "key": { "_id": { "$numberInt": "1" } }, "name": "_id_" }, { "v": { "$numberInt": "2" }, "key": { "name": { "$numberInt": "1" } }, "name": "name_1" } ], "uuid": "fab1e86d29c942968e98311ce5471d94", "collectionName": "emp", "type": "collection" }
위에서 emp 컬렉션을 생성 후 테스트로 인덱스를 생성하였습니다.
mongoexport에서는 인덱스 구조 정보를 포함하지 않았지만, mongodump 로 백업 시 위와 같이 컬렉션과 인덱스의 구조정보도 생성되는 것을 확인할 수 있으며 이러한 부분이 mongoexport와의 차이입니다.
일관된 백업 생성
논리적 백업도 물리적 백업도 백업을 수행할 때 데이터의 변경은 계속될 수 있습니다.
그래서 논리적 백업도 물리적 백업도 백업을 진행하는 동안 변경된 데이터에 대해서 일관된 상태를 유지(만들기)하기 위해서 여러 가지 기술 등이 사용됩니다.
mongodump 작업 중에 발생되는 변경 데이터에 대해서 oplog 에 포함될 수 있도록 --oplog 옵션을 제공합니다.
백업본을 mongorestore 통해서 복구 시 캡처된 oplog를 재생할 수 있습니다. --oplog를 사용하여 생성된 백업을 복원하려면 --oplogReplay 옵션과 함께 mongorestore를 사용합니다. oplog까지 모두 재생하여 복구 시 백업이 완료된 시점으로 복원할 수 있습니다.
해당 방법을 이용하기 위해서는 당연히 oplog 활성화가 기본 전제 조건입니다.
--oplog 옵션을 사용할 경우 백업 단위는 전체 단위만 가능하고 데이터베이스 단위나 컬렉션 단위는 불가능 합니다.
"Failed: bad option: --oplog mode only supported on full dumps"
• 백업 수행
$ mongodump --username admin \ --authenticationDatabase=admin \ --oplog --out ./dump writing admin.system.users to dump/admin/system.users.bson done dumping admin.system.users (1 document) writing admin.system.version to dump/admin/system.version.bson done dumping admin.system.version (2 documents) writing test.emp to dump/test/emp.bson done dumping test.emp (9 documents) writing captured oplog to dumped 1 oplog entry
위의 실행 내역과 같이 백업 수행 시 oplog에 캡쳐하고 oplog를 dump 합니다.
$ ls -al dump drwxrwxr-x 4 mongodb mongodb 49 x월 xx 17:20 . drwxrwxr-x 8 mongodb mongodb 4096 x월 xx 17:20 .. drwxrwxr-x 2 mongodb mongodb 128 x월 xx 17:20 admin -rw-rw-r-- 1 mongodb mongodb 103 x월 xx 17:20 oplog.bson drwxrwxr-x 2 mongodb mongodb 47 x월 xx 17:20 test
bsondump
bsondump는 mongodump 에 의해 백업된 BSON 파일 내에 어떤 데이터가 저장되어 있는지 분석할 수 있는 유틸리티입니다.
위에서 백업으로 생성된 emp.bson 파일에 대해서 bsondump 를 수행해보도록 하겠습니다.
$ bsondump emp.bson {"_id":{"$oid":"6427dd9085e2c2e509e35374"},"name":"John","age":{"$numberInt":"25"},"gender":"Male","country":"USA"} {"_id":{"$oid":"6427dd9085e2c2e509e35375"},"name":"Jane","age":{"$numberInt":"30"},"gender":"Female","country":"Canada"} {"_id":{"$oid":"6427dd9085e2c2e509e35376"},"name":"Michael","age":{"$numberInt":"18"},"gender":"Male","country":"Germany"} {"_id":{"$oid":"6427dd9085e2c2e509e35377"},"name":"Emily","age":{"$numberInt":"21"},"gender":"Female","country":"USA"} {"_id":{"$oid":"6427dd9085e2c2e509e35378"},"name":"David","age":{"$numberInt":"40"},"gender":"Male","country":"UK"} {"_id":{"$oid":"6427dd9085e2c2e509e35379"},"name":"Sophia","age":{"$numberInt":"28"},"gender":"Female","country":"France"} {"_id":{"$oid":"6427dd9085e2c2e509e3537a"},"name":"Daniel","age":{"$numberInt":"22"},"gender":"Male","country":"Japan"} {"_id":{"$oid":"6427dd9085e2c2e509e3537b"},"name":"Amy","age":{"$numberInt":"33"},"gender":"Female","country":"Australia"} {"_id":{"$oid":"6427dd9085e2c2e509e3537c"},"name":"Alex","age":{"$numberInt":"29"},"gender":"Male","country":"Korea"} 9 objects found
실제 데이터의 bson 파일에 대해서 bsondump 수행 시 내용이 매우 많을 수 있기 때문에 "| more" 명령어를 같이 조합해서 사용하는 것도 고려할 수 있습니다.
--outFile 옵션을 통해서 BSON 파일을 JSON 으로 저장할 수도 있습니다.
$ bsondump emp.bson --outFile=emp.json $ more emp.json {"_id":{"$oid":"6427dd9085e2c2e509e35374"},"name":"John","age":{"$numberInt":"25"},"gender":"Male","country":"USA"} {"_id":{"$oid":"6427dd9085e2c2e509e35375"},"name":"Jane","age":{"$numberInt":"30"},"gender":"Female","country":"Canada"} {"_id":{"$oid":"6427dd9085e2c2e509e35376"},"name":"Michael","age":{"$numberInt":"18"},"gender":"Male","country":"Germany"} {"_id":{"$oid":"6427dd9085e2c2e509e35377"},"name":"Emily","age":{"$numberInt":"21"},"gender":"Female","country":"USA"} {"_id":{"$oid":"6427dd9085e2c2e509e35378"},"name":"David","age":{"$numberInt":"40"},"gender":"Male","country":"UK"} {"_id":{"$oid":"6427dd9085e2c2e509e35379"},"name":"Sophia","age":{"$numberInt":"28"},"gender":"Female","country":"France"} {"_id":{"$oid":"6427dd9085e2c2e509e3537a"},"name":"Daniel","age":{"$numberInt":"22"},"gender":"Male","country":"Japan"} {"_id":{"$oid":"6427dd9085e2c2e509e3537b"},"name":"Amy","age":{"$numberInt":"33"},"gender":"Female","country":"Australia"} {"_id":{"$oid":"6427dd9085e2c2e509e3537c"},"name":"Alex","age":{"$numberInt":"29"},"gender":"Male","country":"Korea"}
--type=debug 옵션을 통해서 BSON 에 있는 필드의 정보와 사이즈 등의 상세 내역을 알 수 있습니다.
$ bsondump emp.bson --type=debug --- new object --- size : 80 _id type: 7 size: 17 name type: 2 size: 15 age type: 16 size: 9 gender type: 2 size: 17 country type: 2 size: 17 --- new object --- size : 85 _id type: 7 size: 17 name type: 2 size: 15 age type: 16 size: 9 gender type: 2 size: 19 country type: 2 size: 20 < .. 중략 .. >
mongorestore
mongorestore는 mongodump을 통해서 BSON 파일 포맷으로 생성된 백업 파일을 다시 복원하는 유틸리티입니다.
mongorestore에서도 전체 단위 복원, 데이터베이스 단위 복원, 컬렉션 단위 복원 3가지 단위로 수행할 수 있습니다.
• 실행 명령어 예시)
1) MongoDB 전체 복원 mongorestore --drop \ /../dump 2) 데이터베이스 단위 복원 mongorestore --drop \ --db test \ /../dump/test 3) 컬렉션 단위 복원 mongorestore --drop \ --db test \ --collection emp \ /../dump/test/emp.bson
--drop 옵션은 복원 전 기존 데이터를 삭제하는 옵션입니다.
--oplogReplay 옵션
mongodump로 백업 수행 시 --oplog 옵션을 사용하여 oplog를 덤프하였을 경우, 복구시에는 --oplogReplay 옵션을 사용합니다.
--oplogReplay 옵션은 mongodump로 생성된 백업 BSON 파일을 모두 복구 후에 백업된 oplog.bson 파일을 통해 추가로 복구를 하는 옵션입니다.
• --oplogReplay 옵션을 사용한 복구
$ mongorestore --drop \ --oplogReplay ./dump preparing collections to restore from reading metadata for test.emp from dump/test/emp.metadata.json dropping collection test.emp before restoring restoring test.emp from dump/test/emp.bson finished restoring test.emp (9 documents, 0 failures) restoring users from dump/admin/system.users.bson replaying oplog applied 0 oplog entries restoring indexes for collection test.emp from metadata index: &idx.IndexDocument{Options:primitive.M{"name":"name_1", "v":2}, Key:primitive.D{primitive.E{Key:"name", Value:1}}, PartialFilterExpression:primitive.D(nil)} 9 document(s) restored successfully. 0 document(s) failed to restore.
위의 수행 내역을 통해 확인할 수 있는 것처럼 백업된 bson 적용 및 oplog.bson을 적용 후에 인덱스를 생성을 합니다.
그래서 물리적 백업에 비해서는 상대적으로 복구 시간이 다소 소요되는 점이 있습니다.
성능 관련
mongostat
mongostat은 현재 실행 중인 mongod 또는 mongos 인스턴스의 상태를 빠르게 검토할 수 있는 커맨드 라인에서 수행하는 유틸리티 도구입니다.
mongostat은 UNIX/Linux 파일 시스템 유틸리티 vmstat과 기능적으로 유사하지만 mongod 및 mongos 인스턴스에 대한 데이터를 제공합니다.
이 유틸리티는 --discover 및 --authenticationDatabase 옵션을 사용하여 mongod 또는 mongos 인스턴스를 검색하고 인증할 수 있습니다.
mongostat은 1초 간격으로 작업을 수행하고 결과를 출력합니다. 출력에는 다음과 같은 정보가 포함됩니다.
- inserts: 초당 데이터베이스에 삽입된 개체 수
- queries: 초당 데이터베이스에서 실행된 쿼리 수
- updates: 초당 데이터베이스에서 업데이트된 개체 수
- deletes: 초당 데이터베이스에서 삭제된 개체 수
- getmores: 초당 데이터베이스에서 getmore 작업이 실행된 횟수
- commands: 초당 데이터베이스에서 실행된 명령 수
• 실행 명령어 예시)
mongostat --host ip주소:포트,ip주소:포트,ip주소:포트 --discover mongostat --host localhost:50005,localhost:50006,localhost:50007,localhost:50008 --discover
• mongostat 실행 결과 예시)
host insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time localhost:27017 *0 *0 *0 *0 0 0|0 0.0% 1.4% 0 1.55G 117M 0|0 1|0 94b 41.6k 5 xxx 1 14:18:01.377 localhost:27017 1562 *0 *0 *0 0 3|0 0.4% 1.4% 0 1.55G 117M 0|0 1|0 255k 234k 5 xxx 1 14:18:01.689 localhost:27017 2409 *0 *0 *0 0 0|0 0.6% 1.6% 0 1.55G 120M 0|0 1|0 393k 128k 5 xxx 1 14:18:06.899 localhost:27017 1408 *0 *0 *0 0 2|0 0.6% 1.7% 0 1.55G 120M 0|0 1|0 230k 132k 5 xxx 1 14:18:07.688 localhost:27017 1635 *0 *0 *0 0 1|0 0.7% 1.7% 0 1.55G 120M 0|0 1|1 267k 129k 5 xxx 1 14:18:08.687 localhost:27017 1615 *0 *0 *0 0 0|0 0.7% 1.7% 0 1.55G 121M 0|0 1|0 263k 128k 5 xxx 1 14:18:09.688 localhost:27017 1619 *0 *0 *0 0 0|0 0.7% 1.7% 0 1.55G 121M 0|0 1|0 264k 128k 5 xxx 1 14:18:10.690 localhost:27017 1653 *0 *0 *0 0 0|0 0.8% 1.8% 0 1.55G 122M 0|0 1|1 270k 130k 5 xxx 1 14:18:11.694 localhost:27017 1634 *0 *0 *0 0 2|0 0.8% 1.8% 0 1.55G 122M 0|0 1|0 267k 130k 5 xxx 1 14:18:12.687 localhost:27017 1680 *0 *0 *0 0 1|0 0.9% 1.9% 0 1.55G 123M 0|0 1|0 274k 132k 5 xxx 1 14:18:14.686
mongotop
mongotop은 MongoDB의 내장 유틸리티 중 하나로, MongoDB 인스턴스가 데이터를 읽고 쓰는 데 소요되는 시간을 추적하는 방법을 제공합니다.
mongotop은 컬렉션 수준에서 통계를 제공하며 기본적으로 mongotop은 1초마다 값을 반환합니다. mongotop은 시스템 터미널에서 실행합니다.
• 실행 명령어 예시)
$ mongotop --host localhost:27017
• 실행 결과 예시)
ns total read write 2023-xx-xxT15:00:08Z test.test_loop 57ms 0ms 57ms admin.system.roles 0ms 0ms 0ms admin.system.users 0ms 0ms 0ms admin.system.version 0ms 0ms 0ms config.system.sessions 0ms 0ms 0ms config.transactions 0ms 0ms 0ms local.system.replset 0ms 0ms 0ms test.absences 0ms 0ms 0ms test.bakesales 0ms 0ms 0ms test.book 0ms 0ms 0ms
mongofiles
mongofiles는 MongoDB 인스턴스 내에서 GridFS 객체에 저장된 파일을 저장하거나 내보내기 기능을 제공하는 유틸리티 입니다. 이는 파일 시스템에 저장된 객체와 GridFS 간의 인터페이스를 제공하므로 특히 유용합니다.
GridFS는 MongoDB에서 파일을 저장하고 검색할 수 있는 파일 시스템입니다.
이 시스템은 MongoDB의 데이터베이스에 파일을 저장하고 검색할 수 있도록 해주며, 파일의 크기가 16MB를 초과하는 경우에도 사용 할 수 있습니다.
위에서 mongodump 을 통해서 생성된 binary 파일을 mongofiles 을 통해서 저장해보도록 하겠습니다.
• mongofiles 을 통한 파일 저장
mongofiles --host=localhost --port=27017 \ --username admin \ --authenticationDatabase=admin \ -d=test \ put emp.bson
-d=test 는 mongofiles가 파일을 저장할 GridFS의 데이터베이스를 지정합니다.
put 에서 입력한 경로를 정보를 포함하여 저장을 하게 됩니다.(list 옵션에서 추가 설명)
mongofiles는 GridFS에 파일을 저장하므로 컬렉션을 지정하지 않습니다.
mongofiles에 의해 저장된 파일에 대한 목록(리스트)는 아래와 같이 list 옵션을 통해서 확인 할 수 있습니다.
• list 옵션으로 조회
$ mongofiles --host=localhost --port=27017 \ --username admin \ --authenticationDatabase=admin \ -d test list # 출력 결과 2023-xx-xxTxx:xx:xx.583+0000 connected to: mongodb://localhost:27017/ emp.bson 755 <!!--- 파일명 확인
put 으로 파일을 저장시에 디렉토리 경로를 포함하였을 경우 GridFS에도 같은 정보로 저장됩니다.
## 경로를 포함하여 저장 mongofiles --host=localhost --port=27017 \ --username admin \ --authenticationDatabase=admin \ -d=test \ put test/emp.bson ## 조회 mongofiles --host=localhost --port=27017 \ --username admin \ --authenticationDatabase=admin \ -d test list ## 조회결과 connected to: mongodb://localhost:27017/ test/emp.bson 755 <!!--
mongofiles를 사용하여 파일을 다운로드하려면 get 옵션을 사용 합니다.
• get 옵션을 통한 파일 다운로드
mongofiles --host=localhost --port=27017 \ --username admin \ --authenticationDatabase=admin \ -d=test \ get emp.bson connected to: mongodb://localhost:27017/ finished writing to emp.bson
get 옵션에서는 위에서 list 에서 조회한 파일명 그대로를 입력해야 합니다.
put 으로 파일을 저장시 경로 정보를 포함해서 저장 하였을 경우 get 으로 파일 저장시에도 디렉토리가(경로가) 사전에 생성이 되어있어야 합니다. 디렉토리가 없다면 get 으로 파일 생성시 아래와 같이 에러가 발생 합니다.
Failed: error while opening local file 'test/emp.bson': open test/emp.bson: no such file or directory
mongofiles 를 통해서 파일을 저장시에는 파일의 관리 및 통일성을 위해서 저장할 파일의 디렉토리로 이동후에 파일명만 입력 하여 저장하는 것이 좋을 것으로 생각 됩니다.
mongofiles을 통해 저장된 파일은 delete 옵션을 통해서 파일을 삭제 할 수 있습니다.
• delete 옵션을 사용하여 파일을 삭제
$ mongofiles --host=localhost --port=27017 \ --username admin \ --authenticationDatabase=admin \ -d test delete emp.bson connected to: mongodb://localhost:27017/ successfully deleted all instances of 'emp.bson' from GridFS
Reference
Reference URL
• MongoDB Tools Documentation
관련된 다른 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io