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

PostgreSQL 버전 업그레이드(9.2 -> 12.7)

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

※ 업무하면서 습득한 내용들을 정리해 놓은 포스팅입니다 :P 추가로 궁금하신 점은 댓글로 남겨주시고 필요한 자료 있으면 요청주세요! 잘못된 내용이 있으면 고쳐주시면 감사하겠습니다. 자료 퍼가실 때는 출처 남겨주세요!


 ο 목차

     


    ※ 코드 보는 방법 참고

    ㅇ 달러 기호($)가 있는 경우 -> 리눅스 터미널에서 CLI 명령어 입력

    ㅇ "=#" 기호가 있는 경우 -> psql 쉘에서 명령어 입력

    ㅇ 꺽쇠가 하나 있는 경우(>) -> 윈도우 명령 프롬프트(cmd)에서 명령어 입력

    ㅇ 꺽쇠가 세개 있는 경우(>>>) -> python 쉘에서 명령어 입력


    모니터링 시스템을 만든지 어언 2년 반이 지나고 나니...

    zabbix 버전도 노후되고(4.2) 데이터베이스 버전(9.2)도 노후가 돼버렸습니다.

    (이제 더 이상 develop 지원이 안된다니...)

    zabbix 버전 업그레이드를 하는김에 데이터베이스도 같이 업그레이드를 해주기로 했습니다.ㅜ

     

    Centos7 에서 PostgreSQL 데이터베이스 버전을 9.2 -> 12.7 로 업그레이드 하는 방법을 찾아보는데 생각보다 내용이 쉽지 않고 대부분 영어로 설명이 되어있더라구요.

     

    업그레이드 과정을 쉽게 공유하면 좋겠다는 생각에 포스팅을 작성해봅니다.

    많은 도움이 되길 바라며 :P 아래 내용 잘 따라와주세요!


    ▶ !!! PostgreSQL 업그레이드 전 필독 !!!

    ▲ Centos7 운영체제에서 yum을 통해 제공되는 PostgreSQL9.2 버전이며 상위 버전의 패키지를 얻기 위해서는 rpm을 통한 설치 필요.

    ▲ 업그레이드를 위해 기존 PostgreSQL의 data 디렉토리, bin 디렉토리, 그리고 새로 설치될 PostgreSQL의 data 디렉토리, bin 디렉토리 위치 필요. 

    ▲ 충분한 디스크 공간이 확보되었는지 확인 필요.

       ※ 작업해보니 기존 데이터베이스 크기의 약 2배까지 디스크 공간을 사용함

       (기존 데이터베이스 크기가 1.2T 정도였는데 pg_upgrade 돌리는 동안 거의 2.3~4T까지 디스크 공간을 사용함.)

     

    * 아래 내용은 참고용으로 활용해주시고, 개인의 환경에 따라 세부적인 내용은 조정이 필요할 수 있다는 점 항상 염두에 두시길 바랍니다.


    ▶ Centos7에서 PostgreSQL 9.2 -> 12.7 버전으로 업그레이드하는 방법 소개(rpm 패키지로 업그레이드)

    1. 기존 PostgreSQL 클러스터 백업하기(pg_dump)

    1) 클러스터 백업 명령어(root권한)

    $ pg_dump –U 사용자계정 –Fc –Z 0 —file=덤프파일명 데이터베이스이름

     

    <옵션 설명>

    더보기

    -U : 데이터베이스 사용자 계정을 지정

    -Fc : 파일 출력 모드를 사용자 지정 모드(커스텀 모드)로 설정. tar 혹은 text를 사용해야 하는 특별한 이유가 없다면 커스텀 모드를 사용하는 것을 추천.(덤프 크기가 원래 데이터베이스 크기의 3/1 정도로 작고, pg_restore로 복원 작업시 유연하게 활용할 수 있기 때문)

    -Z : 덤프 파일 생성시 압축 단계를 지정하는 옵션. 0-9까지 지정할 수 있으면 숫자가 클수록 백업 속도가 느리지만 덤프 크기가 작아지고, 숫자가 작을수록 백업 속도가 빠르고 덤프 크기가 커짐. (지정하지 않을 경우 기본 압축 레벨은 6)

    --file= : 덤프 출력 파일명을 지정하는 옵션 


    2. 기존 PostgreSQL 디렉토리 위치 파악하기

    1) bin, data 디렉토리 위치 파악 명령어 입력

    (PostgreSQL이 활성화 상태일때 확인 가능)

    $ ps -ef | grep postgres

     

    <옵션 설명>

    더보기

    -e : 커널 프로세스를 제외하고 결과 출력

    -f : 풀포맷 형식으로 결과 출력(uid, pid, ppid 포함)

     

    2) 결과에서 아래와 같이 bin 디렉토리, data 디렉토리 확인


    3. 기존 PostgreSQL 서비스 중지하기

    1) PostgreSQL 서비스 중지 명령어(root권한)

    $ systemctl stop postgresql.service

    4. 새로 설치할 PostgreSQL rpm 다운로드 및 설치

    1) 아래 사이트에서 설치할 rpm 패키지 확인

    Index of /pub/repos/yum/ (postgresql.org)

     

    Index of /pub/repos/yum/

     

    download.postgresql.org

     

    <하위 디렉토리 및 패키지 선택하는 방법>

    /pub/repos/yum/설치할PostgreSQL버전/서버운영체제종류/운영체제버전/rpm파일선택

     

    <Centos7 버전 확인하는 방법>

    $ cat /etc/centos-release

     

    <설치할 rpm 파일 종류>

    - PostgreSQL 12.7 라이브러리(lib) 패키지

    - PostgreSQL 12.7 바이너리 패키지

    - PostgreSQL 12.7 도큐먼트(doc) 패키지

    - PostgreSQL 12.7 서버(server) 패키지

     

     

    2)  yum install을 통해 PostgreSQL 12.7 rpm 패키지 설치하기(root권한)

    $ yum install -y https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-7-x86_64/postgresql12-libs-12.7-1PGDG.rhel7.x86_64.rpm
    $ yum install -y https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-7-x86_64/postgresql12-12.7-1PGDG.rhel7.x86_64.rpm
    $ yum install -y https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-7-x86_64/postgresql12-docs-12.7-1PGDG.rhel7.x86_64.rpm
    $ yum install -y https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-7-x86_64/postgresql12-server-12.7-1PGDG.rhel7.x86_64.rpm

     

    3) PostgreSQL 12.7 설치 확인

    - data 디렉토리 확인(일반적인 경우)

    $ /var/lib/pgsql/12/data/

     

    - bin 디렉토리 확인(일반적인 경우)

    $ /usr/pgsql-12/bin/

     

    - 서비스 확인(root권한)

    $ systemctl status postgresql-12.service

     

    ※ postgresql-12 서비스 상태는 disabled, stop 상태여야 함. 


    5. 새로운 데이터베이스 초기화하기

    1) 데이터베이스 초기화 명령어(root권한)

    $ /usr/pgsql-12/bin/initdb -D /var/lib/pgsql/12/data/

    ※  (필수) 반드시 새로운 데이터베이스 클러스터의 initdb를 사용해 새로운 데이터 디렉토리를 초기화해야함. 기존 데이터베이스의 initdb 사용 금지. 


    6. 데이터베이스 업그레이드하기(pg_upgrade)

    1) pg_upgrade로 데이터베이스 업그레이드(root권한)

    $ cd /tmp && /usr/pgsql-12/bin/pg_upgrade --old-datadir 기존data디렉토리 --new-datadir 새로운data디렉토리 --old-bindir 기존bin디렉토리 --new-bindir 새로운bin디렉토리

    혹은

    $ cd /tmp && /usr/pgsql-12/bin/pg_upgrade -d 기존data디렉토리 -D 새로운data디렉토리 -b 기존bin디렉토리 -B 새로운bin디렉토리

    (2개 모두 같은 동작을 의미)

     

    ※ pg_upgrade는 업그레이드 작업 중 현재 디렉토리에 postgres 계정으로 log 파일을 생성함. postgres 계정으로 파일을 쓸 수 없는 디렉토리에서 작업하는 경우 pg_upgrade internal.log permission denied 에러가 발생하기 때문에, 이를 방지하기 위해 cd /tmp 명령어 추가. 

     

    ※ 작업 중 df -h 명령어로 디스크 상태를 수시로 확인하고, 디스크 공간이 부족해지는 일이 없도록 주의.

     

    ※ pg_upgrade가 정상적으로 작업을 완료하고나면 현재 디렉토리에 analyze_new_cluster.sh 파일과 delete_old_cluster.sh 파일을 생성함. 

     

    ※ 작업 중 'FATAL: unrecognized configuration parameter "unix_socket_directory"' 오류 발생시 아래 포스팅 참고하여 트러블 슈팅 후 작업 진행

     

    2021.08.09 - [데이터베이스(PostgrSQL)/트러블슈팅] - FATAL: unrecognized configuration parameter "unix_socket_directory" 오류 해결 방법


    7. 새로운 데이터베이스 설정 변경하기

    1) postgresql.conf 파일 설정하기

    - 기존 postgresql.conf 파일과 동일한 내용으로 새로운 postgresql.conf 파일 설정

    - 기존 postgresql.conf 파일 수정

    $ vi /var/lib/pgsql/data/postgresql.conf

    - 새로운 postgresql.conf 파일 수정

    $ vi /var/lib/pgsql/12/data/postgresql.conf

     

    2) pg_hba.conf 파일 설정하기

    - 기존 pg_hba.conf 파일과 동일한 내용으로 새로운 pg_hba.conf 파일 설정

    - 기존 pg_hba.conf 파일 수정

    $ vi /var/lib/pgsql/data/pg_hba.conf

    - 새로운 pg_hba.conf 파일 수정

    $ /var/lib/pgsql/12/data/pg_hba.conf

    8. 새로운 데이터베이스 시작하기

    1) 새로운 PostgreSQL 서버 시작

    $ systemctl start postgresql-12.service

     

    2) 서버가 정상적으로 실행되면, analyze_new_cluster.sh 파일을 실행시켜 데이터베이스 vacuum 진행(root권한)

    $ ./analyze_new_cluster.sh

    ※ 선택 항목, 테이블 크기가 큰 경우 vacuum 시간이 오래 걸릴 수 있기 때문에 여의치 않은 경우 생략.


    9. 새로운 데이터베이스 서비스 등록

    1) PostgreSQL-12 서비스 등록(root권한)

    $ systemctl enable postgresql-12.service

    10. 기존 데이터베이스 클러스터 삭제(선택항목)

    1) 기존 데이터베이스 삭제(root권한)

    $ ./delete_old_cluster.sh

    2) 기존 데이터베이스 서비스 삭제(root권한)

    $ sudo yum remove 기존설치패키지

     

     

    내용 관련으로 궁금한점 있으시면 언제든 메일이나 댓글로 남겨주세요 :P

     


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

     

    반응형

    댓글