※ 업무하면서 습득한 내용들을 정리해 놓은 포스팅입니다 :P 추가로 궁금하신 점은 댓글로 남겨주시고 필요한 자료 있으면 요청주세요! 잘못된 내용이 있으면 고쳐주시면 감사하겠습니다. 자료 퍼가실 때는 출처 남겨주세요!
ο 목차
※ 코드 보는 방법 참고
ㅇ 달러 기호($)가 있는 경우 -> 리눅스 터미널에서 CLI 명령어 입력
ㅇ "=#" 기호가 있는 경우 -> psql 쉘에서 명령어 입력
ㅇ 꺽쇠가 하나 있는 경우(>) -> 윈도우 명령 프롬프트(cmd)에서 명령어 입력
ㅇ 꺽쇠가 세개 있는 경우(>>>) -> python 쉘에서 명령어 입력
서비스 구축에 급급하느라 PostgreSQL 튜닝에 소홀했던 대가로...
daed tuples 의 수가 약 200GB에 육박했습니다...

모종의 계획에 따라 데이터베이스 dump 및 restore 작업을 진행하기로 했습니다.
(vacuum 만으로는 도저히 처리 불가능)
작은 규모의 테스트 테이터베이스를 만들어 테스트 할 때와 다르게 대규모 데이터베이스(약 1.2T)에 대해서 작업 할 때는 추가로 신경을 써야 하는 요소들이 있어 내용을 공유하고자 합니다 :P
자세한 내용은 아래 내용 참고 해주세요~ 감사합니다.
** 모든 작업은 postgresql 12, Centos7 기준
1. PostgreSQL 덤프(dump) 작업
※ 아래 페이지 참고
PostgreSQL: Documentation: 12: pg_dump
pg_dump
pg_dump pg_dump — extract a PostgreSQL database into a script file or other archive file Synopsis pg_dump [connection-option...] [option...] [dbname] …
www.postgresql.org
1) dump 명령어
(1) 기본 dump 명령어
- 웬만한 dump 작업은 아래 명령어 만으로 간단히 진행할 수 있음.
$ pg_dump -U 사용자계정 -Fc --file=덤프파일명 DB명
▶ - U 사용자 계정 : 덤프할 데이터베이스에 접근할 권한을 가진 사용자명 지정
▶ - Fc : 덤프 파일 포맷을 지정하는 옵션. 복원을 위한 유연한 포맷으로써 c(custom) 옵션이 가장 일반적으로 사용됨.
▶ --file=덤프파일명 : 덤프 결과를 지정된 "덤프파일명" 파일에 저장하기 위한 옵션. "덤프파일명" 파일을 생성하여 그 안에 덤프 내용을 저장하게 됨.
▶ DB명 : pg_dump는 단일 데이터베이스 덤프용 명령어로 어떤 데이터베이스를 덤프할지 지정해주어야 함. 만약 전체 데이터베이스를 덤프하려면 pg_dump_all 명령어를 사용해야 함.
(2) dump 명령어(압축률 지정)
- 압축률을 조정하여 덤프 효율 향상
$ pg_dump -U 사용자계정 -Fc -Z 0 --file=덤프파일명 DB명
▶ pg_dump는 -Fc 형식이 지정되고 -Z 옵션이 별도로 주어지지 않을 경우 중간 단계의 압축률로 데이터베이스를 덤프
▶ 압축률은 -Z 옵션을 사용해 0-9 까지의 값을 지정할 수 있으며 압축률이 높을수록 덤프 파일의 크기는 작아지고, 덤프 속도는 느려짐
※ 대규모 데이터베이스를 덤프할 때는 디스크 용량 뿐만 아니라 덤프 속도도 중요한 요소이기 때문에 이를 적절히 고려하여 압축률을 지정한다면 좀 더 효율적으로 덤프 작업을 끝낼 수 있음.
▶ (참고) -Fc 옵션과 다중 병렬 작업을 지원하는 -j 옵션은 함께 사용할 수 없음.
*** 작업 참고를 위한 덤프 테스트 결과 소개(cpu 48 core 서버, PostgreSQL 12 사용) ***
▶ -Z 옵션을 주지 않고 -Fc 옵션으로만 덤프했을 때 속도 : 1시간에 약 20GB 덤핑
▶ -Z 옵션을 0으로 주고 -Fc 옵션으로 덤프했을 때 속도 : 1시간에 약 40~50GB 덤핑
▶ -Z 옵션을 0으로 주고 -Fc 옵션으로 덤프했을 때 최종 덤프 파일 크기 : 데이터베이스 크기의 약 1/3
※ -Z 옵션을 0으로 주고 작업하는 경우 덤프 위치에 최소 현재 데이터베이스 크기의 1/3 이상 여유 디스크 공간을 남겨두고 작업 해야 함
※ 위의 결과 내용은 작업 환경에 따라 다른 결과가 나올 수 있으므로 참고용으로만 활용.
2) 작업 결과
▶ 데이터베이스 크기 : 약 1.2T
▶ 덤프 총 소요 시간 : 약 28시간
▶ 덤프 파일 크기 : 약 325GB
2. PostgreSQL 복원(restore) 작업
1) 기존 데이터베이스 삭제(drop)
- postgres(superuser권한) 계정으로 명령어 실행
=# drop DB명
2) 새로운 DB 생성(createdb)
- 기존 데이터베이스와 동일한 조건의 새로운 DB 생성
$ sudo -u postgres createdb -O 소유자계정명 -E 인코딩포맷 -T 템플릿 DB명
3) 데이터베이스 복원
(1) 기본 restore 명령어
$ pg_restore -U 사용자계정 -Fc -v -j 병렬처리프로세스개수 -d 복원할_데이터베이스 덤프파일명
▶ -U : 복원하려는 database에 쓰기 권한이 있는 사용자 계정을 사용
▶ -Fc : custom 포맷 사용, dump 시 사용했던 포맷과 동일한 형식으로 설정
▶ -v : 덤프 작업 내용을 터미널에 출력하는 옵션
▶ -j : 병렬처리 프로세스(jobs) 개수를 지정하는 옵션. 여러개의 테이블에 대한 동시 작업을 진행하기 위한 옵션으로, 통상적으로 최대 개수는 cpu core 수의 1~2배 정도로 설정 권고.
※ DB의 테이블 개수에 따라 조정이 필요할 수 있음. 1개의 테이블당 1개의 병렬처리 프로세스가 생성된다고 할때 테이블 개수 대비 많은 수의 job을 실행시키게 되면 리소스 낭비가 발생함. 적절한 수의 병렬 프로세스를 설정하면 복원 작업 속도를 높일 수 있음.
▶ -d : 복원할 데이터베이스 지정
▶ 덤프파일명 : 복원에 사용할 덤프 파일을 지정
(2) restore 명령어(+트러블슈팅)
ㅇ 이슈 현상
- 기본 명령어로 작업 도중 508GB 데이터(복원할 데이터 크기의 1/2 지점) 복원 후 hang 발생
- -hang 걸린 이후로 아무런 작업 메시지나 오류 메시지가 발생하지 않고, 데이터도 508GB에서 더 이상 원복되지 않음
- 트러블 슈팅을 위해 schema 복원과 data 복원을 별도로 진행함.
ㅇ schema 복원 명령어
$ pg_restore -U 사용자계정 --schema-only -v -d DB명 덤프파일명
▶ --schema-only : 데이터베이스의 schema 만을 복원하는 옵션
ㅇ data 복원 명령어
$ pg_restore -U 사용자계정 --data-only -j 병렬처리프로세스개수 -v -d DB명 덤프파일명
▶ --data-only : 데이터베이스의 data 만을 복원하는 옵션. data 복원 전에 schema가 복원되어 있어야 정상적으로 데이터를 복원할 수 있음.
ㅇ 특정 테이블의 데이터만 복원하는 명령어
$ pg_restore -U 사용자계정 --data-only -v -d DB명 -t 테이블명 덤프파일명
ㅇ 작업 결과
- 먼저 schema 복원 후 data를 별도로 복원하여 오류 없이 모든 데이터 복원 성공.
대규모 덤프 작업 시에는 -Z 옵션, 복원 작업 시에는 -j 옵션과 -t, --schema-only, --data-only 옵션을 적절히 활용하면 백업 및 복원 효율을 높일 수 있습니다.
내용이 도움이 되시길 바랍니다 :P
※ 좋아요와 구독은 큰 힘이 됩니다. 감사합니다.
'데이터베이스(PostgrSQL) > 데이터베이스 운영' 카테고리의 다른 글
PostgreSQL 테이블 Bloat, Bloating(부풀림) 현상 해결(Vacuum) (0) | 2021.08.12 |
---|---|
PostgreSQL 버전 업그레이드(9.2 -> 12.7) (0) | 2021.08.06 |
댓글