Ubuntu 14.04에서 MongoDB 데이터베이스를 가져오고 내보내는 방법
MongoDB는 가장 널리 사용되는 NoSQL 데이터베이스 엔진 중 하나입니다. 확장 가능하고 강력하며 신뢰할 수 있고 사용하기 쉬운 것으로 유명합니다. 이 기사에서는 MongoDB 데이터베이스를 가져오고 내보내는 방법을 보여줍니다.
이 문서에서 가져오기 및 내보내기는 다른 소프트웨어 제품과 호환되는 사람이 읽을 수 있는 형식의 데이터를 처리하는 것을 의미합니다. 반대로 백업 및 복원 작업은 데이터의 일관성과 무결성뿐만 아니라 특정 MongoDB 속성도 보존하는 MongoDB 특정 이진 데이터를 생성하거나 사용합니다. 따라서 마이그레이션의 경우 일반적으로 소스 및 대상 시스템이 호환되는 한 백업 및 복원을 사용하는 것이 좋습니다. 백업, 복원 및 마이그레이션은 이 문서의 범위를 벗어납니다. Ubuntu 14.04에서 MongoDB 데이터베이스를 백업, 복원 및 마이그레이션하는 방법을 참조하십시오.
전제 조건
이 자습서를 따르기 전에 다음 전제 조건을 완료했는지 확인하십시오.
- 우분투 14.04 물방울
- 루트가 아닌 sudo 사용자. 자세한 내용은 Ubuntu 14.04의 초기 서버 설정을 확인하세요.
- Ubuntu 14.04에 MongoDB를 설치하는 방법 문서를 사용하여 MongoDB를 설치하고 구성했습니다.
다른 언급이 없는 한 이 자습서에서 루트 권한이 필요한 모든 명령은 sudo 권한이 있는 루트가 아닌 사용자로 실행해야 합니다.
기본 이해
이 기사를 계속 진행하기 전에 이 문제에 대한 기본적인 이해가 필요합니다. MySQL과 같은 널리 사용되는 관계형 데이터베이스 시스템에 대한 경험이 있는 경우 MongoDB로 작업할 때 몇 가지 유사점을 찾을 수 있습니다.
가장 먼저 알아야 할 것은 MongoDB가 정보를 저장하기 위해 json 및 bson(바이너리 json) 형식을 사용한다는 것입니다. Json은 데이터 내보내기 및 가져오기에 완벽한 사람이 읽을 수 있는 형식입니다. 간단한 텍스트 편집기를 포함하여 json을 지원하는 모든 도구를 사용하여 내보낸 데이터를 추가로 관리할 수 있습니다.
예제 json 문서는 다음과 같습니다.
{"address":[
{"building":"1007", "street":"Park Ave"},
{"building":"1008", "street":"New Ave"},
]}
Json은 작업하기 매우 편리하지만 bson에서 사용할 수 있는 모든 데이터 유형을 지원하지는 않습니다. 즉, json을 사용하면 정보의 소위 '충실성 손실'이 발생합니다. 이것이 백업/복원을 위해 MongoDB 데이터베이스를 더 잘 복원할 수 있는 바이너리 bson을 사용하는 것이 더 좋은 이유입니다.
둘째, 명시적으로 MongoDB 데이터베이스를 생성하는 것에 대해 걱정할 필요가 없습니다. 가져오기 위해 지정한 데이터베이스가 아직 없으면 자동으로 생성됩니다. 컬렉션(데이터베이스 테이블) 구조의 경우가 더 좋습니다. 다른 데이터베이스 엔진과 달리 MongoDB에서는 구조가 다시 첫 번째 문서(데이터베이스 행) 삽입 시 자동으로 생성됩니다.
셋째, MongoDB에서 이 기사의 작업과 같이 많은 양의 데이터를 읽거나 삽입하는 것은 리소스 집약적일 수 있으며 많은 CPU, 메모리 및 디스크 공간을 소비할 수 있습니다. MongoDB가 대규모 데이터베이스 및 빅 데이터에 자주 사용된다는 점을 고려하면 이는 중요한 사항입니다. 이 문제에 대한 가장 간단한 해결책은 야간에 내보내기/백업을 실행하는 것입니다.
넷째, 데이터베이스 내보내기 프로세스 중에 정보가 변경되는 바쁜 MongoDB 서버가 있는 경우 정보 일관성이 문제가 될 수 있습니다. 이 문제에 대한 간단한 해결책은 없지만 이 기사의 끝에서 복제에 대해 더 읽어야 할 권장 사항을 볼 수 있습니다.
MongoDB로 정보 가져오기
MongoDB로 정보를 가져오는 방법을 알아보기 위해 레스토랑에 대한 인기 있는 샘플 MongoDB 데이터베이스를 사용해 보겠습니다. .json 형식이며 다음과 같이 wget
을 사용하여 다운로드할 수 있습니다.
- wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json
다운로드가 완료되면 현재 디렉터리에 primer-dataset.json
(12MB 크기)이라는 파일이 있어야 합니다. 이 파일의 데이터를 newdb
라는 새 데이터베이스와 restaurants
라는 컬렉션으로 가져오겠습니다. 가져오기를 위해 다음과 같이 mongoimport
명령을 사용합니다.
- sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json
결과는 다음과 같아야 합니다.
2016-01-17T14:27:04.806-0500 connected to: localhost
2016-01-17T14:27:07.315-0500 imported 25359 documents
위의 명령에서 알 수 있듯이 25359개의 문서를 가져왔습니다. newdb
라는 데이터베이스가 없었기 때문에 MongoDB가 자동으로 생성했습니다.
다음과 같이 newdb
라는 새로 생성된 MongoDB 데이터베이스에 연결하여 가져오기를 확인합니다.
- sudo mongo newdb
이제 새로 생성된 newdb
데이터베이스 인스턴스에 연결되었습니다. 프롬프트가 변경되어 데이터베이스에 연결되었음을 나타냅니다.
다음 명령을 사용하여 레스토랑 컬렉션의 문서를 계산합니다.
- db.restaurants.count()
결과는 정확히 가져온 문서의 수인 25359
로 표시되어야 합니다. 더 나은 확인을 위해 다음과 같이 레스토랑 컬렉션에서 첫 번째 문서를 선택할 수 있습니다.
- db.restaurants.findOne()
결과는 다음과 같아야 합니다.
{
"_id" : ObjectId("569beb098106480d3ed99926"),
"address" : {
"building" : "1007",
"coord" : [
-73.856077,
40.848447
],
"street" : "Morris Park Ave",
"zipcode" : "10462"
},
"borough" : "Bronx",
"cuisine" : "Bakery",
"grades" : [
{
"date" : ISODate("2014-03-03T00:00:00Z"),
"grade" : "A",
"score" : 2
},
...
],
"name" : "Morris Park Bake Shop",
"restaurant_id" : "30075445"
}
이러한 세부 검사는 내용, 인코딩 등과 같은 문서의 문제를 드러낼 수 있습니다. json 형식은 UTF-8
인코딩을 사용하며 내보내기 및 가져오기는 해당 인코딩이어야 합니다. json 파일을 수동으로 편집하는 경우 이를 염두에 두십시오. 그렇지 않으면 MongoDB가 자동으로 처리합니다.
MongoDB 프롬프트를 종료하려면 프롬프트에 exit
를 입력합니다.
- exit
루트가 아닌 사용자로 일반 명령줄 프롬프트로 돌아갑니다.
MongoDB에서 정보 내보내기
앞에서 언급했듯이 MongoDB 정보를 내보내면 데이터가 포함된 사람이 읽을 수 있는 텍스트 파일을 얻을 수 있습니다. 기본적으로 정보는 json 형식으로 내보내지지만 csv(쉼표로 구분된 값)로도 내보낼 수 있습니다.
MongoDB에서 정보를 내보내려면 mongoexport
명령을 사용하십시오. 매우 세분화된 내보내기를 내보낼 수 있으므로 데이터베이스, 컬렉션, 필드를 지정하고 내보내기에 쿼리를 사용할 수도 있습니다.
간단한 mongoexport
예제는 이전에 가져온 newdb
데이터베이스에서 레스토랑 컬렉션을 내보내는 것입니다. 다음과 같이 할 수 있습니다.
- sudo mongoexport --db newdb -c restaurants --out newdbexport.json
위의 명령에서 --db
를 사용하여 데이터베이스를 지정하고, -c
는 컬렉션을, --out
은 파일을 지정합니다. 데이터가 저장됩니다.
성공적인 mongoexport
의 출력은 다음과 같아야 합니다.
2016-01-20T03:39:00.143-0500 connected to: localhost
2016-01-20T03:39:03.145-0500 exported 25359 records
위의 출력은 25359개의 문서를 가져왔음을 보여줍니다. 가져온 문서와 같은 수입니다.
경우에 따라 컬렉션의 일부만 내보내야 할 수도 있습니다. 레스토랑 json 파일의 구조와 내용을 고려하여 Bronx 자치구에 위치하고 중국 요리를 제공하는 기준을 충족하는 모든 레스토랑을 내보내겠습니다. MongoDB에 연결되어 있는 동안 이 정보를 직접 얻으려면 데이터베이스에 다시 연결하십시오.
- sudo mongo newdb
그런 다음 다음 쿼리를 사용합니다.
db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )
결과는 터미널에 표시됩니다. MongoDB 프롬프트를 종료하려면 프롬프트에 exit
를 입력합니다.
- exit
데이터베이스에 연결되어 있지 않고 sudo 명령줄에서 데이터를 내보내려면 -q
에 대해 지정하여 mongoexport
명령의 이전 쿼리 부분을 만드십시오. 다음과 같은 주장:
- sudo mongoexport --db newdb -c restaurants -q "{ borough: 'Bronx', cuisine: 'Chinese' }" --out Bronx_Chinese_retaurants.json
쿼리 조건에 대해 큰따옴표 안에 작은따옴표를 사용하고 있습니다. 큰따옴표나 $
와 같은 특수 문자를 사용하는 경우 쿼리에서 백슬래시(\\
)로 이스케이프 처리해야 합니다.
내보내기에 성공하면 결과는 다음과 같아야 합니다.
2016-01-20T04:16:28.381-0500 connected to: localhost
2016-01-20T04:16:28.461-0500 exported 323 records
위는 323개의 레코드가 내보내진 것을 보여주며, 우리가 지정한 Bronx_Chinese_retaurants.json
파일에서 찾을 수 있습니다.
결론
이 기사에서는 MongoDB 데이터베이스에서 정보를 가져오고 내보내는 필수 사항을 소개했습니다. 확장 가능한 MongoDB 데이터베이스를 설정하는 방법에 대해 계속 읽을 수 있습니다.
복제는 확장성에 유용할 뿐만 아니라 현재 주제에도 중요합니다. 복제를 사용하면 장애가 발생한 마스터 서버를 복원하는 동안 슬레이브 MongoDB 서버에서 중단 없이 MongoDB 서비스를 계속 실행할 수 있습니다. 복제의 일부는 데이터를 수정하는 모든 작업을 기록하는 작업 로그(oplog)이기도 합니다. MySQL에서 바이너리 로그를 사용하는 것처럼 이 로그를 사용하여 마지막 백업이 수행된 후 데이터를 복원할 수 있습니다. 백업은 일반적으로 밤에 이루어지며 저녁에 백업을 복원하기로 결정하면 마지막 백업 이후의 모든 업데이트가 누락됩니다.