MongoDB 내용을 텍스트 파일로 추출하기

리눅스/MongoDB|2020. 10. 28. 09:03
반응형

MongoDB 내용을 텍스트 파일로 추출해야 할 일이 있어서 알아봤는데

그 방법에는 두 가지가 있습니다.



[ 첫번째 방법 ]


우선 아래와 같이 도큐멘트의 개수를 확인합니다.

# mongo sysdocu -u prince -p --quiet --eval 'db.members.count()'

12


* 설명 : prince 계정으로 sysdocu 데이터베이스의 members 컬렉션 도큐멘트 개수 확인


그리고 출력된 개수와 동일하거나 많은 수의 범위까지 파일로 추출합니다.

저장 형태는 toArray() 로 인해 key 별로 줄바꿈이 되어 예쁘게 출력 되지만,

리눅스에서 텍스트를 가공하고자 할때는 한줄로 표시되는 것이 편하므로 해당 toArray() 는 제외합니다.


# mongo sysdocu -u prince -p --quiet --eval 'DBQuery.shellBatchSize = 20; db.members.find({}).limit(20).toArray()' > result.json


* 설명 : 도큐멘트 개수 조회 결과가 12 이므로 12로 하거나 더 많은 20으로 해도 됩니다.


result.json 파일에 내용이 저장 되었습니다.



[ 두번째 방법 ]


# mongo sysdocu -u prince -p |tee result.txt


위와 같이 실행하면 별다른 반응없이 일반적인 MongoDB 콘솔 로그인이 됩니다.

하지만 MongoDB 콘솔을 빠져 나올때 까지 (exit) 화면에 출력되는 내용은

result.txt 파일에 저장되게 됩니다.

화면 출력이 이루어져야 하므로 도큐멘트 개수가 많은 경우 첫번째 방법보다 속도가 느립니다.


반응형

댓글()

MongoDB 외부 파일 내용을 불러와서 실행하기

리눅스/MongoDB|2020. 10. 20. 11:05
반응형

쉘스크립트로 MongoDB 쿼리를 실행하기 어려운 경우가 있습니다. (변수 사용 등)

이럴 경우 일반 텍스트 파일을 만들고, mongodb 에서 이를 실행하도록 하면 됩니다.



쿼리 내용을 텍스트로 저장

# vi test.txt

db.sysdocu.insert({"Date": "2020-10-20"})



실행 방법 1

# mongo NEWDB -u sysdocu -p 12345678 --eval 'load("test.txt")'



실행 방법 2

(mongodb 로그인 후)

> load("test.txt");


반응형

댓글()

MongoDB 데이터 업데이트 하기 (upsert : 없으면 insert, 있으면 update), $inc 를 이용한 덧셈

리눅스/MongoDB|2020. 10. 20. 09:13
반응형

아래 예제를 통해 결과를 확인하면 이해가 빠릅니다.

upsert 를 사용하게 되면 조건에 맞는 데이터가 없을 경우 insert 되고, 있을 경우 내용이 update 됩니다.

여기에 $inc 를 이용하여 덧셈 까지 적용하였습니다.


> db.Counting.find();

아무 내용 없음


> db.Counting.update({"Date":"2020-10-20"}, {"$inc":{no:1}}, upsert=true);

WriteResult({

"nMatched" : 0,

"nUpserted" : 1,

"nModified" : 0,

"_id" : ObjectId("5f8e2742dce4436d25b4f5a2")

})

no 에 값 1을 입력


> db.Counting.find();

{ "_id" : ObjectId("5f8e2742dce4436d25b4f5a2"), "Date" : "2020-10-20", "no" : 1 }

update 를 사용 했지만 값이 없는 상태 이므로 insert 로 적용 되었습니다.


> db.Counting.update({"Date":"2020-10-20"}, {"$inc":{no:2}}, upsert=true);

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

이번엔 no 에 값을 2 입력


> db.Counting.find();

{ "_id" : ObjectId("5f8e2742dce4436d25b4f5a2"), "Date" : "2020-10-20", "no" : 3 }

처음 입력한 값 1 에 2를 더하여 no 가 3이 되었습니다. 



* 여러개의 key 를 업데이트 하기
> db.Counting.update({"Date": "2020-10-20"}, {"$inc": {man: 1, woman: 1}}, upsert=true);
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5f8e40d1dce4436d25b4fec4")
})



반응형

댓글()

MongoDB 도큐멘트를 AND 또는 OR 조건으로 가져오기

리눅스/MongoDB|2020. 10. 16. 11:17
반응형

AND 조건일 때는 아래와 같이 사용 합니다.

db.Date20201015.count({$and: [{Priority:{$regex:"1"}}, {Time:{$regex:" 09:"}}]})


OR 조건일 때는 위 예시에서 아래와 같이 OR 문자로만 바꿔주면 됩니다.

db.Date20201015.count({$or: [{Priority:{$regex:"1"}}, {Time:{$regex:" 09:"}}]})



반응형

댓글()

MongoDB 컬렉션 삭제가 되지 않을때

리눅스/MongoDB|2020. 10. 13. 14:37
반응형

> db.202009.drop()

uncaught exception: SyntaxError: unexpected token: numeric literal :

@(shell):1:2


이와 같이 어떤 사유에서 특정 컬렉션이 삭제되지 않는 경우가 있습니다.

이경우 getCollection 을 이용하여 삭제하면 됩니다.


> db.getCollection("202009").drop()

true




반응형

댓글()

MongoDB 쿼리 - 페이지 출력을 위한 skip, limit 사용하기

리눅스/MongoDB|2020. 10. 6. 13:07
반응형

MongoDB 쿼리

> db.Sysdocu.find().skip(20).limit(10)


* 설명 : Sysdocu 컬렉션에서 20개의 도큐멘트를 제외하고 10개만 출력 합니다.



반응형

댓글()

MongoDB 명령어를 이용한 bson -> json 변환

리눅스/MongoDB|2020. 9. 24. 16:53
반응형

bson > json 변환


# bsondump file.bson |head


head 명령 수행시 10줄의 라인을 미리 출력해볼 수 있습니다.

전체를 변환하기 위해서는 아래와 같이 해보세요.


# bsondump file.bson > newfile.json







반응형

댓글()

[MongoDB에러] server returned error on sasl authentication step: authentication failed.

리눅스/MongoDB|2019. 8. 30. 15:48
반응형

이런식으로 옵션을 추가하면 실행이 잘 된다.

 

$ mongorestore -u sysdocu -p 12345678 --authenticationDatabase admin --db log ./path/to/dump/log/

 

 

반응형

댓글()

MongoDB 관리자 패스워드 초기화

리눅스/MongoDB|2019. 4. 16. 14:01
반응형

MongoDB root 패스워드 초기화 방법입니다.

DB shell 로그인하기 위해 기본적으로는 패스워드를 입력하게 되어 있습니다.

하지만 유사시 패스워드 없이 로그인 하는 방법이 있습니다.

 

MongoDB 3.4.20

 

# vi /etc/mongod.conf

// 인증없이 로그인 가능하도록 2줄 주석 처리

#security:
#  authorization: enabled

 

# systemctl restart mongod

 

# mongo

 

> use admin

 

계정 리스트 출력시켜 관리자 계정 확인하기 (admin 데이터베이스에 액세스 가능한 계정)

> db.system.users.find()

 

패스워드 변경

> db.changeUserPassword("계정명", "새비밀번호")

 

/etc/mongod.conf 파일에 주석처리 해놓은 부분을 다시 주석 해제 후

 

# systemctl restart mongod

 

로그인이 잘 되는지 확인합니다.

 

# mongo admin -u 계정명 -p 새비밀번호

 

 

 

반응형

댓글()

CentOS 7 에 MongoDB 3.4.20 설치, 기본 명령어, 동기화(복제구성 & Replica set) - 동기화부분 작성중

리눅스/MongoDB|2019. 4. 16. 10:21
반응형

CentOS 8 버전 MongoDB 4.4.1 설치하는 방법은 아래 URL 을 참고하세요~

https://www.howtoforge.com/tutorial/centos-mongodb/

 

 

1. 설치 및 구동

 

MongoDB 는 CentOS 7 의 기본 리포지토리에 등록되어 있지 않기 때문에

별도의 리포지토리 등록 후 설치를 진행해야 합니다.

 

# vi /etc/yum.repos.d/mongodb-org.repo

[mongodb-org-3.4]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

 

# yum -y install mongodb-org

 

# systemctl enable mongod

 

# systemctl start mongod

 

* 설정 파일 : /etc/mongod.conf

* 로그 파일 : /var/log/mongodb/mongod.log

 

 

2. 기본 명령어

 

MongoDB 로그인

# mongo

 

========================

 

관리자 계정 생성

> use admin

 

> db.createUser({user: "sysdocu", pwd: "12345678", roles:["root"]})

// 계정명 sysdocu 를 관리자로 등록 (보통은 root 나 admin 를 많이 사용합니다)

// root 라는 roles 은 MongoDB 상 최고의 권한이다.

// (roles 종류 : https://docs.mongodb.com/manual/reference/built-in-roles/)

 

이제 최고 권한 계정으로 작업을 한다.

> exit

 

# mongo admin -u sysdocu -p

 

일반 계정 생성 및 DB 접근 설정

> use test    // access 하려는 DB를 선택 후 계정을 생성해야 한다. ★

 

> db.createUser({user: "sysdocu", pwd: "12345678", roles: [{ role: "readWrite", db: "test" }] })
// 계정명 : sysdocu, 패스워드 : 12345678, 권한 : 읽고 쓰기, 접근 DB : test

 

계정 리스트 보기 (DB 를 선택 한 상태에서)

> show users

 

계정 삭제

> db.dropUser("sysdocu")

 

로컬 접속
# mongo admin -u sysdocu -p '12345678'    // admin DB를 선택하며 로그인 (제외시 로그인 안됨)

// ! 느낌표가 들어간 패스워드일 경우엔 " 말고 ' 를 사용 해야 함

 

원격 접속

# mongo -u sysdocu -p 12345678 10.2.0.5/admin    // 10.2.0.5 번 서버의 admin 디비에 접근

 

========================

 

데이터베이스 생성

> use test    // 생성할 데이터베이스명 입력 (여기까지만 하면 생성이 되지 않음)

> db.createCollection("members")    // members 컬렉션을 옵션없이 생성. 컬렉션이 생성되면 이때 데이터베이스도 같이 생성됨

 

* 테이블을 MongoDB 에서는 컬렉션으로 부릅니다.

* 레코드를 MongoDB 에서는 도큐멘트라고 부릅니다.

 

컬렉션이 없는 상태에서 도큐멘트를 insert 하면 컬렉션이 자동으로 생성되기도 합니다.

> db.members.insert({"name": "sysdocu"})

> db.members.insert({"name": "superman"})

 

도큐멘트 삭제

db.members.remove({"name": "superman"})

 

데이터베이스 리스트 확인

> show dbs

 

컬렉션 (테이블) 리스트 확인

> show collections

 

컬렉션 내용 확인

> db.members.find()

 

도큐멘트 개수 확인

db.members.count()

 

도큐멘트 모두 삭제

> db.members.remove({})

 

컬렉션 (테이블) 삭제

> db.members.drop()

 

데이터베이스 삭제 (use 라는 명령으로 데이터베이스가 선택 된 상태에서)

> db.dropDatabase()

 

데이터베이스 복사

> db.copyDatabase('test', 'testTWO')

 

 

3. 백업 및 복구

 

* MongoDB 외부 접근 허용

# vi /etc/mongod.conf

bindIp: 0.0.0.0    // 기존 127.0.0.1 를 0.0.0.0 으로 수정

 

(백업 서버에서 작업할 경우)

 

1) 원본 MongoDB 서버의 특정 데이터베이스를 복사해오는 방법

> db.copyDatabase("test", "test", "49.247.131.228")    // 원격지 서버의 test DB를 복제

 

2) 원본 MongoDB 서버의 모든 데이터베이스를 복사해오는 방법

> db.cloneDatabase("49.247.131.228")    // 원격지 서버의 모든 DB를 복제

 

(원본 서버에서 작업할 경우)

 

1) 모든 데이터베이스 dump

# mongodump --out ./backup --host 127.0.0.1 --port 27017 -u계정명 -p계정비번

// 현재 디렉토리에 backup 이라는 디렉토리를 생성하고 그 안에 dump 파일을 생성

 

2) 특정 데이터베이스 dump

# mongodump --out ./backup --host 127.0.0.1 --port 27017 -u계정명 -p비번 --db test

// 현재 디렉토리에 backup 이라는 디렉토리를 생성하고 그 안에 dump 파일을 생성

 

3) 데이터베이스 복구

# mongorestore -u 계정명 -p 비번 --drop --db test ./backup/test/

// --drop 은 기존 데이터 지우고 복구 하라는 뜻

 

* 간단하게 하려면 (전체 백업, 복구)

# mongodump --host 127.0.0.1

// 실행 시 dump 라는 디렉토리가 생기고 jon 형태로 데이터가 추출된것이 확인 됩니다.

 

# mongorestore -h 127.0.0.1 ~/dump/

 

 

4. 동기화 (복제 설정 & replica set) 설정

 

복제 방식에는 두 가지가 있습니다.

쉘 명령을 통한 복제 설정과 replica set 이 있는데,

복제 구성은 설정이 간편한 장점이 있으나, 5초 단위로 데이터가 동기화 됩니다.

replica set 은 마스터 포함 최대 6대 까지 실시간 동기화가 가능하나, 몇가지 설정 작업이 필요합니다.

두가지 방식 모두는 단방향 통신이기 때문에 마스터 서버는 읽고 쓰기, 슬레이브 서버에서는 읽기만 됩니다.

 

 

1) replica set 설정

 

MongoDB 를 한 번만 재시작 하기 위해 MongoDB 키 파일을 먼저 생성해줍니다.

 

(마스터 서버에서)

# openssl rand -base64 741 > /etc/mongod.key

# chmod 600 /etc/mongod.key

 

슬레이브 서버로 key 파일을 복사해줍니다.

# scp /etc/mongod.key root@49.247.232.10:/etc/

 

(모든 서버에서)

# vi /etc/mongod.conf

security:
  keyFile: /etc/mongod.key

replication:

  replSetName: "ABC"    // 그룹명은 아무거나 입력

 

# systemctl restart mongod

 

(마스터 서버에서)

# mongo

> rs.initiate( {
   _id : "ABC",
   members: [
      { _id: 0, host: "49.247.131.228:27017" },
      { _id: 1, host: "49.247.132.10:27017" }
   ]
})

 

* 위와 같이 실행했을때 아래와 같은 에러 메세지가 출력된다면, 한 번에 명령을 실행하지 말고 나누어 실행하면 됩니다.

"errmsg" : "'49.247.132.10:27017' has data already, cannot initiate set."

 

> rs.initiate( {
   _id : "ABC",
   members: [
      { _id: 0, host: "49.247.131.228:27017" }
   ]
})

> rs.add("49.247.132.10:27017")

 

동기화 테스트를 해봅니다.

 

2) 복제 구성

 

(마스터 서버에서)

# systemctl stop mongod

# mongod --dbpath /var/lib/mongo -port 27017 -master &    // 실제 데이터 디렉토리 (데이터가 초기화 됨)

 

(슬레이브 서버에서)

# systemctl stop mongod

# mongod --dbpath /var/lib/mongo -port 27017 -slave -source 49.247.131.228:27017 &    // 실제 데이터 디렉토리와 마스터 서버 정보

 

# mongo

> rs.slaveOk()    // 동기화 시작

 

>>> 잘 안됨

 

5. 복제 도구

https://github.com/sheharyarn/mongo-sync

mongo-sync.zip
0.00MB

명령을 실행할 한 쪽 서버에서만 다운로드 받으면 됩니다.

파일압축을 풀면 3개의 파일이 나옵니다.

 

1) config.yml 파일을 열어 설정을 마친 뒤 아래와 같이 동기화 합니다.
2) ./mongo-sync push  // 상대 서버로 밀어내기

     ./mongo-sync pull    // 명령을 내리는 서버로 가져오기

3) 명령행 뒤에 -y 를 주게 되면 확인 메세지 건너뜀

 

<동기화 조건>

- DB 및 접근 계정을 미리 생성해 놔야 함

- 테이블은 있으나 없으나 상관없음. 새로 덮어 씌우기가 됨

 

★ log 데이터베이스를 당겨 올때..
/tmp 에 덤프파일이 생성 되므로 해당 파티션에 용량이 부족하다면 아래와 같이 링크를 미리 생성해놓고
용량이 큰쪽에 생성 될 수 있도록 합니다.
덤프 받는 중에는 원하는 파티션으로 데이터가 생성되는지 확인 해야 합니다.

# mkdir /log1/mirror_tmp
# ln -s /log1/mirror_tmp /tmp/log    // 임시 파일 디렉토리에 작업 DB명이 생성됩니다.

 

반응형

댓글()