본문 바로가기
DATABASE/PostgreSQL

[PostgreSQL] PG17 설치의 모든 것 - Data / Wal 분리부터 환경변수까지

by DANEW 2024. 12. 21.

PostgreSQL 설치의 모든 것

새롭게 요즘 배우고 있는 데이터베이스 PostgreSQL이다.

오픈소스의 DBMS이다보니 새로운 버전이 매년 나오고, 설치부터 세팅까지 직접해줘야한다는 불편함이 있다.

 

심지어 기존에 사용하던 CentOS7이 EOS가 되기에 새로운 Linux 버전인 Rocky 9 를 OS로 하여 PostgreSQL을 설치해 보았다.

 

PostgreSQL 17버전을 설치하는 방법을 소개하며,

PG의 인스턴스의 디렉토리를 OS와 분리된 다른 영역에 설치하는 방법

Wal 디렉토리를 분리하여 심볼릭 링크를 설정하는 방법

기본적으로 편의를 위한 환경변수를 설정하는 방법 등에 대해 소개해 보도록 하겠다.

 

PostgreSQL Install

원하는 PostgreSQL 버전의 설치를 위해 공식 홈페이지에 접속한다.

 

 

PostgreSQL: Linux downloads (Red Hat family)

Linux downloads (Red Hat family) The Red Hat family of distributions includes: Red Hat Enterprise Linux Rocky Linux AlmaLinux CentOS (7 and 6 only) Fedora Oracle Linux and others. PostgreSQL is available on these platforms by default. However, each version

www.postgresql.org

원하는 설치 버전과 플랫폼을 선택하는데, 이 문서에서는 Rocky9 에 PostgreSQL 17을 설치하도록 하겠다.

 

repository RPM 패키지를 다운받는다.

sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

 

기존의 내장 모듈이 설치되어있을 수 있어 postgresql 모듈 비활성화를 한다.

sudo dnf -qy module disable postgresql

 

이어서 PostgreSQL의 구성요소들에 대해서 설치하도록 하자.

server,  contrib, devel 이렇게 3가지 구성요소를 설치해야하는데, Rocky9 에서 바로 devel이 설치안되는 문제가 있었다.

아래에서 순서대로 설명하도록 하겠다.

sudo dnf install -y postgresql17-server
sudo dnf install -y postgresql17-contrib
sudo dnf install -y postgresql17-devel

server, contrib, devel을 각각 순서대로 Install 진행한다.

 

devel까지 정상적으로 설치가 되었다면 문제가 없지만, 아래와 같은 오류가 발생하면 따로 추가적으로 perl 패키지 설치가 필요하다.

Error: Problem: cannot install the best candidate for the job - nothing provides perl(IPC::Run) needed by postgresql17-devel-17.2-1PGDG.rhel9.x86_64 from pgdg17 (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

 

아래와 같이 install을 진행한다.

wget https://dl.rockylinux.org/vault/rocky/9.0/CRB/x86_64/os/Packages/p/perl-IPC-Run-20200505.0-6.el9.noarch.rpm
wget https://dl.rockylinux.org/vault/rocky/9.0/CRB/x86_64/os/Packages/p/perl-IO-Tty-1.16-4.el9.x86_64.rpm
yum install perl-*

 

설치 후 devel 설치를 재 진행한다.

sudo dnf install -y postgresql17-devel

 

이로써 PostgreSQL의 최소한에 필요한 모든것을 설치 완료하였다.

 

DB Instance 생성

PostgreSQL의 Instance는 하나의 DB Server에 여러개 생성 가능하다.

Instance는 각각의 DATA 디렉토리와 Port를 가진다.

하지만 실제 운영에서는 여러 Instance마다의 OS 리소스 할당을 지정 할 수 없기에 하나의 서버에 하나의 인스턴스를 권장한다.

 

우리는 하나의 인스턴스를 생성하며, 이또한 OS영역의 디스크가 아닌 별도로 마운트된 데이터용 디스크에 구성하도록 하겠다.

디렉토리 생성 및 권한 부여

mkdir -p /data/pg17/data
chown -R postgres. /data/pg17
chown -R postgres. /usr/pgsql-17/

 

DB Instance 생성

postgresql17-server를 install 할 시 postgres라고 하는 postgresql의 기본 관리 계정이 함께 등록이 된다.

해당 계정으로 접근하여, 인스턴스를 생성한다.

su - postgres

root -> postgres로 계정이 변경되었다.

 /usr/pgsql-17/bin/initdb -D /data/pg17/data -E UTF8 --no-locale -W

* initdb : 데이터베이스 클러스터를 초기화 하는데 사용

* -D /data/pg17/data : 위에서 생성하고 권한을 부여하였던 디렉토리에 데이터 경로를 지정

* -E UTF8 : 인코딩 지정

* --no-locale : 지역화 비활성화

* -W : 슈퍼유저 비밀번호 설정

슈퍼유저의 초기 비밀번호를 설정하며 인스턴스를 생성한다.

원하는 디렉토리 밑에 데이터 영역이 제대로 자리 잡은 모습을 확인 할 수 있다.

 

또한, pg_tblspc / pg_wal 이라고 하는 테이블스페이스 영역과 WAL로그 영역이 data 디렉토리에 포함되어 있는데, 해당 디렉토리들은 관리편의성 / 성능 / 안전성을 위해 분리해주는 것이 좋다.

디렉토리를 다른 곳으로 분리후 심볼릭 링크를 통해 연결해주는 방식으로 사용한다.

 

pg_wal을 아래와같이 이동시키며 심볼릭 링크 지정을 하겠다.

mkdir /data/pg17/pgwal
mv /data/pg17/data/pg_wal/* /data/pg17/pgwal/
rmdir /data/pg17/data/pg_wal
cd /data/pg17/data
ln -s /data/pg17/pgwal pg_wal

순서대로 data영역 밖에 pgwal 디렉토리를 새롭게 생성하며, pg_wal 디렉토리에 있는 모든 파일을 pgwal 디렉토리로 이동시킨다.

이후 pg_wal 디렉토리를 삭제 후 pgwal 티렉토리를 pg_wal 디렉토리로 심볼릭 링크 설정을 한다.

 

테이블스페이스의 경우 생성시 location 옵션을 통해 자동으로 심볼릭 링크가 연결된다.

테이블스페이스 영역을 나누기전 PostgreSQL을 먼저 실행하도록 하자.

pg_ctl start -w -D /data/pg17/data

 

PostgreSQL이 정상적으로 잘 실행 되었는지 프로세스를 확인해본다.

ps -ef | grep postgres

 

제대로 실행이 잘 된 것을 알 수 있다.

 

이제 TableSpace의 디렉토리 분리 작업을 진행하도록 하자.


TableSpace용 디렉토리도 따로 data영역 밖에 생성한다

mkdir /data/pg17/pgtbs

 

기존의 데이터 영역에 있는 pg_tblspc와 새로 만든 pgtbs 영역에 아무것도 없는 것을 확인하였다.

PostgreSQL의 명령줄 인터페이스를 통해 작업을 해보도록하자.

psql

 

테이블스페이스를 생성한다.

create tablespace TS_BAN location '/data/pg17/pgtbs';

location 옵션을 통해 지정한 디렉토리에 테이블스페이스 디렉토리가 생성되었는지 확인해보도록 하자.

테이블스페이스 디렉토리가 생성된 것을 확인하였다.

심볼릭 링크도 자동으로 연결되어있다.

 

PostgreSQL 시스템 환경변수 설정

Linux 환경에서 PostgreSQL 사용에 가독성과 편의성을 높이기위해 환경변수 설정을 한다.

간단하게 많이들 사용하는 시스템 환경변수에 대해 설정하도록 하겠다.

 

먼저 root 계정으로 다시 돌아온다.

exit

/etc/skel/ 하위의 파일들을 다 복사한 후 .bash_profile을 수정한다.

cp /etc/skel/.* /usr/pgsql-17/

아래의 내용을  .bash_profile 내용에 추가한다.

vi /usr/pgsql-17/.bash_profile

>> 추가내용
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH=/usr/pgsql-17/bin:$PATH
export PGHOME=/usr/pgsql-17 	# PG HOME 경로
export PGDATA=/data/pg17/data 	# DATA 경로
export PGDATABASE=postgres 	# DB 명 (기본 접속 DB)
export PGUSER=postgres 		# DB USER 명 (기본 접속 USER)
export PGPORT=5432 		# DB 포트 (default : 5432)

해당 디렉토리에 대한 소유자를 postgres로 변경한다.

chown -R postgres. /usr/pgsql-17/

 

마지막으로 postgres 계정의 HOME 경로를 변경한다.

vi /etc/passwd

>> 변경 전 내용
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash

>> 변경 후 내용
postgres:x:26:26:PostgreSQL Server:/usr/pgsql-17:/bin/bash

 

이렇게 등록한 환경 변수는 postgres 계정에 로그인할 때 사용 할 수 있게 된다.

 

 

Comment

이렇게 요번에는 PostgreSQL에 대해 설치해보았다.

앞으로 많이 다루게 될 것 같은 느낌이 드는 데이터베이스이다.

 

백업과 이중화, 아키텍처와 운영 등에 대해서도 하나하나 정리해 나가보도록 하겠다.

 

반응형