MongoDB 가 빈 공간 을 방출 하 는 몇 가지 상용 방법

머리말
MongoDB 에서 문서 나 집합 을 삭제 할 때 MongoDB 는 이미 사용 한 디스크 공간 을 방출 하지 않 습 니 다.디스크 공간 을 차지 한 데이터 파일 을 계속 유지 합 니 다.비록 데이터 파일 에 크 고 작은 빈 기록 목록(empty record list)이 존재 할 수 있 지만.클 라 이언 트 프로그램 이 문 서 를 다시 삽입 할 때 MongoDB 는 빈 기록 목록 에서 새 문서 에 저장 공간 을 할당 합 니 다.그러면 디스크 공간 을 더욱 효과적으로 사용 하기 위해 서 는 mongodb 의 데이터 파일 을 조각 정리 하고 사용 하지 않 은 공간 을 회수 해 야 합 니 다.사상 은 두 가지 가 아니다.
1.원 데이터 재 구성
2.데이터 만 복사 하여 데이터 만 의 완전한 백업 을 형성한다.
다음은 몇 가지 자주 사용 하 는 실시 방법 을 소개 한다.
1、compact
2、db.repairDatabase()
3.secondary 노드 재 동기 화
4、db.copyDatabase()
하나
홈 페이지 에서 이 명령 에 대한 정의:집합 에 있 는 모든 데이터 와 색인 을 재 작성 하고 조각 을 정리 합 니 다.
사용 방법

use yourdatabase;
db.runCommand({ compact : 'yourCollection' });
주의 사항
1.명령 을 실행 하기 전에 새로운 백업 이 있 음 을 보증 하 십시오.
2.MMAPv 1 저장 엔진 을 사용 하 는 MongoDB 에서 compact 는 데이터 파일 이 있 는 파 티 션 에 최소 2G 의 여유 공간 이 필요 합 니 다.
3.Wired Tiger 저장 엔진 을 사용 하 는 MongoDB 에서 compact 명령 은 집합 과 색인 을 다시 쓰 고 사용 하지 않 은 공간 을 방출 하지만 MMAPv 1 저장 엔진 을 사용 하 는 MongoDB 에 서 는 집합 한 데이터 파일 만 조각 정리 하고 색인 을 다시 만 듭 니 다.공간 을 방출 하지 않 고 MMAPv 1 메모리 엔진 을 사용 하 는 MongoDB 에서 공간 을 회수 하 며 세 번 째 방법 인'secondary 노드 재 동기 화'를 권장 합 니 다.
4.MMAPv 1 메모리 엔진 을 사용 하 는 몽고 DB 의 Capped Collections 는 압축 될 수 없 지만,Wired Tiger 메모리 엔진 을 사용 하 는 몽고 DB 는 compact 를 실행 할 때 압축 된다.
5.던 전 집합 에서 이 명령 을 실행 할 때 각 노드 에서 각각 실행 해 야 합 니 다.
6.이 명령 은 mongod 인 스 턴 스 에서 만 실 행 될 수 있 고 더 이상 mongos 인 스 턴 스 에서 실 행 될 수 없습니다.즉,분 편 군집 에 대한 compact 작업 은 각 분 편 노드 에서 각각 수행 해 야 한 다 는 것 이다.
7.보통 이 명령 은 secondary 노드 에서 실 행 됩 니 다.실행 할 때 노드 를 RECOVERING 상태 로 강제 하고 RECOVERING 상태의 인 스 턴 스 읽 기와 쓰기 동작 이 차 단 됩 니 다.
8.이 명령 을 실행 하지 않 으 려 면 db.currentOp()을 통 해 프로 세 스 정 보 를 조회 한 다음 db.killOp()을 통 해 프로 세 스 를 제거 할 수 있 습 니 다.
9.copact 는 데이터 파일 의 총 크기 와 수량 을 증가 시 킬 수 있 습 니 다.특히 처음 실 행 될 때.그러나 이 는 총 집합 에 사용 되 는 디스크 공간 을 증가 시 키 지 않 습 니 다.저장 크기 는 데이터베이스 파일 에서 분 배 된 데이터 양 이지 파일 시스템 에서 파일 의 크기/수량 이 아 닙 니 다.
10.MMAPv 1 메모리 엔진 을 사용 하 는 몽고 DB 의 Capped Collections 는 압축 될 수 없 지만,Wired Tiger 메모리 엔진 을 사용 하 는 몽고 DB 는 compact 를 실행 할 때 압축 된다.
둘.
홈 페이지 이 명령 의 정의:잘못된 데 이 터 를 잃 어 버 리 거나 손 상 된 데 이 터 를 통 해 데이터베이스 와 색인 을 재 구축 합 니 다.파일 시스템 복구 명령 fsck 와 유사 합 니 다.그래서 이 명령 은 주로 데 이 터 를 복구 하 는 데 사 용 됩 니 다.
사용 방법

use yourdatabase;
db.repairDatabase();
주의 사항
1.db.repairDatabase()는 주로 데 이 터 를 복구 하 는 데 사 용 됩 니 다.데이터 의 전체 복사 본 을 가지 고 접근 할 수 있 는 권한 이 있다 면 세 번 째 방법 인'secondary 노드 재 동기 화'를 사용 하 십시오.
2.명령 을 수행 하기 전에 새로운 백업 이 있 음 을 보증 하 십시오.
3.이 명령 은 데이터베이스 의 읽 기와 쓰 기 를 완전히 막 고 조 심 스 럽 게 작 동 합 니 다.
4.이 명령 을 실행 하려 면 데이터 파일 이 있 는 위치 가 모든 데이터 파일 의 크기 를 합 친 공간 과 2G 가 있어 야 합 니 다.
5.MMAPv 1 로 엔진 을 저장 하 는 secondary 노드 에서 이 명령 을 실행 하면 집합 데 이 터 를 압축 할 수 있 습 니 다.
6.Wired Tiger 메모리 엔진 을 사용 하 는 MongoDB 라 이브 러 리 에서 실행 하면 압축 효과 가 없습니다
7.이 명령 을 실행 하지 않 으 려 면 db.currentOp()을 통 해 프로 세 스 정 보 를 조회 한 다음 db.killOp()을 통 해 프로 세 스 를 제거 할 수 있 습 니 다.
8.시간 소모
3.4.567915.
주요 사상 은 secondary 노드 에서 지정 한 데 이 터 를 삭제 하여 primary 와 데 이 터 를 다시 시작 하 는 것 입 니 다.던 전 집합 구성원 의 데이터 가 너무 낡 으 면 다시 동기 화 할 수 있 습 니 다.데이터 의 재 동기 화 는 데이터 파일 을 직접 복사 하 는 것 과 달리 MongoDB 는 데이터 만 동기 화하 기 때문에 재 동기 화가 완 료 된 데이터 파일 은 빈 집합 이 없어 디스크 공간 을 회수 할 수 있다.
사용 방법
우선 데이터 에 완전한 백업 이 있 는 지 확인 해 야 한다.
1.primary 노드 라면 먼저 secondary 노드 로 강제 하고 그렇지 않 으 면 이 단 계 를 건 너 뜁 니 다.

 rs.stepdown(120);
2.그리고 primary 에서 secondary 노드 를 삭제 합 니 다.

 rs.remove("IP:port");
3.secondary 노드 dbpath 의 모든 파일 을 삭제 합 니 다.
4.노드 를 다시 클 러 스 터 에 가입 한 다음 에 데이터 의 동기 화 를 자동 으로 진행 합 니 다.

 rs.add("IP:port");
5.데이터 동기 화 완료 후 1-4 를 순환 하 는 절 차 는 클 러 스 터 의 모든 노드 의 디스크 공간 을 방출 할 수 있 습 니 다.
일부 특수 한 상황 에 대해 오프라인 secondary 노드 를 사용 할 수 없 는 경우 하나의 노드 를 복사 본 집중 에 추가 한 다음 에 secondary 는 자동 으로 데이터 의 동기 화 를 시작 할 수 있 습 니 다.
전체적으로 말 하면 다시 동기 화 하 는 방법 은 비교적 좋 은 것 이다.첫 번 째 는 사본 집의 읽 기와 쓰 기 를 막 지 않 고 두 번 째 소모 시간 은 앞의 두 가지 에 비해 비교적 짧다.
4compat
db.copy Database("from","to","IP:port")는 디스크 에 있 는 데이터 파일 이 아 닌 db.copy Database 에서 복사 한 데이터 이기 때문에 온라인 으로 데 이 터 를 복사 할 수 있 습 니 다.그러나 이 명령 은 4.0 버 전에 서 버 려 집 니 다.3.x 버 전 계속 사용 가능
예:

 db.copyDatabase("sourceDB","DistDB");
    소스 라 이브 러 리 sourceDB 를DistDB 로 복사 합 니 다.
물론 이 명령 은 원 격 복 제 를 지원 합 니 다.
이 명령 의 전체 문법 은:
db.copy Database(<원본 데이터베이스 이름>,<대상 데이터베이스 이름>,<원본 mongodb 의 IP:port>,<원본 데이터베이스 연결 에 필요 한 계 정>,<비밀번호>,)
이상:명령 은 대상 데이터베이스 서버 에서 실행 되 어야 합 니 다.만약 원본 데이터베이스 와 대상 데이터베이스 가 하나의 MongoDB 서버 에 존재 한다 면,<원본 mongodb 의 IP:port>,<원본 데이터베이스 연결 에 필요 한 계 정>,<비밀번호>는 모두 생략 할 수 있 습 니 다.인증 형식 입 니 다.선택 할 수 있 습 니 다.
주의 사항
1.db.copy Database()는 원본 데이터베이스 와 대상 데이터베이스 데이터 의 읽 기와 쓰 기 를 막 지 않 기 때문에 두 개의 데이터 가 일치 하지 않 을 수 있 습 니 다.
2.db.copy Database()에서 색인 데 이 터 를 복사 하면 데이터 베 이 스 를 잠 그 고 이 작업 은 다른 데이터 베이스 에 도 영향 을 줄 수 있 습 니 다.
3.db.copy Database()는 mongos 인 스 턴 스 에서 사용 하지 마 십시오.
4.db.copy Database()는 분 편 집합 을 포함 한 데이터 베 이 스 를 복사 하 는 데 사용 하지 마 십시오.
5.4.0 버 전에 서 변경:db.copy Database()는 SCRAM 만 인증 from host,옵션 을 지원 합 니 다.
6.일부 버 전의 MongoDB 간 에는 이러한 복사 방법 이 지원 되 지 않 습 니 다.자세 한 내용 은 링크 참조:https://docs.mongodb.com/manual/reference/method/db.copyDatabase/
이 밖 에 도 가 져 오기/내 보 내기 방법(mongodump/mongorestore)을 사용 하 는 방법 도 있 습 니 다.이 방법 은 데이터 양 이 매우 많은 경우 에는 적용 되 지 않 습 니 다.내 보 내기 방법 을 가 져 오 는 데 사용 되 는 모든 양의 형식 을 사용 하기 때문에 가 져 온 데 이 터 를 저장 할 수 있 는 공간 이 충분 하도록 해 야 합 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다. 

좋은 웹페이지 즐겨찾기