본문 바로가기
  • ▒ 네모의 쉽게 배우는 네트워크 | 개발 ▒
데이터베이스(PostgrSQL)/데이터베이스 운영

대규모 DB에 대한 PostgreSQL 12 dump, restore 작업 (PostgreSQL 12 dump, restore for Large database)

by 너l모 2021. 8. 20.
반응형

※ 업무하면서 습득한 내용들을 정리해 놓은 포스팅입니다 :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 


    ※ 좋아요와 구독은 큰 힘이 됩니다. 감사합니다. 

    반응형

    댓글