웹사이트 검색

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을 사용하여 다운로드할 수 있습니다.

  1. wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json

다운로드가 완료되면 현재 디렉터리에 primer-dataset.json(12MB 크기)이라는 파일이 있어야 합니다. 이 파일의 데이터를 newdb라는 새 데이터베이스와 restaurants라는 컬렉션으로 가져오겠습니다. 가져오기를 위해 다음과 같이 mongoimport 명령을 사용합니다.

  1. 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 데이터베이스에 연결하여 가져오기를 확인합니다.

  1. sudo mongo newdb

이제 새로 생성된 newdb 데이터베이스 인스턴스에 연결되었습니다. 프롬프트가 변경되어 데이터베이스에 연결되었음을 나타냅니다.

다음 명령을 사용하여 레스토랑 컬렉션의 문서를 계산합니다.

  1. db.restaurants.count()

결과는 정확히 가져온 문서의 수인 25359로 표시되어야 합니다. 더 나은 확인을 위해 다음과 같이 레스토랑 컬렉션에서 첫 번째 문서를 선택할 수 있습니다.

  1. 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를 입력합니다.

  1. exit

루트가 아닌 사용자로 일반 명령줄 프롬프트로 돌아갑니다.

MongoDB에서 정보 내보내기

앞에서 언급했듯이 MongoDB 정보를 내보내면 데이터가 포함된 사람이 읽을 수 있는 텍스트 파일을 얻을 수 있습니다. 기본적으로 정보는 json 형식으로 내보내지지만 csv(쉼표로 구분된 값)로도 내보낼 수 있습니다.

MongoDB에서 정보를 내보내려면 mongoexport 명령을 사용하십시오. 매우 세분화된 내보내기를 내보낼 수 있으므로 데이터베이스, 컬렉션, 필드를 지정하고 내보내기에 쿼리를 사용할 수도 있습니다.

간단한 mongoexport 예제는 이전에 가져온 newdb 데이터베이스에서 레스토랑 컬렉션을 내보내는 것입니다. 다음과 같이 할 수 있습니다.

  1. 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에 연결되어 있는 동안 이 정보를 직접 얻으려면 데이터베이스에 다시 연결하십시오.

  1. sudo mongo newdb

그런 다음 다음 쿼리를 사용합니다.

db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )

결과는 터미널에 표시됩니다. MongoDB 프롬프트를 종료하려면 프롬프트에 exit를 입력합니다.

  1. exit

데이터베이스에 연결되어 있지 않고 sudo 명령줄에서 데이터를 내보내려면 -q에 대해 지정하여 mongoexport 명령의 이전 쿼리 부분을 만드십시오. 다음과 같은 주장:

  1. 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에서 바이너리 로그를 사용하는 것처럼 이 로그를 사용하여 마지막 백업이 수행된 후 데이터를 복원할 수 있습니다. 백업은 일반적으로 밤에 이루어지며 저녁에 백업을 복원하기로 결정하면 마지막 백업 이후의 모든 업데이트가 누락됩니다.