pgdata 와 waldir 옵션 설정

auth 옵션

data-checksums 옵션

—data-checksums 옵션을 설정하면 데이터 블록마다 체크섬을 기록하며 이를 통해 블록 손상 여부를 로그 파일을 통해 확인할 수 있다.

또한 이 옵션은 6장에서 설명할 pgBackRest 백업툴을 이용한 delta 복구를 위해서도 반드시 필요하다.

생성 예제

initdb 명령어 수행 예제는 다음과 같다. 데이터베이스 클러스터는 /data/svc01 디렉토리에 저장하고 WAL vkdlfdms /pg_wal/svc01 디렉토리에 저장하는 예이다.

$ /usr/pgsql-17/bin/initdb --locale='C' --encoding='UTF8' --pgdata='/data/svc01' --waldir='/pg_wal/svc01' --auth='scram-sha-256' - pwprompt

1-2 인스턴스 시작 및 정지

데이터베이스 클러스터가 생성된 후에는 인스턴스를 기동할 수 있다. 인스턴스는 데이터베이스 클러스터와 공유 메모리, 백그라운드 프로세스를 포함하는 개념이다.

인스턴스는 pg_ctl 명령어를 이용해서 제어한다.

만약 서버가 재시작할 때 자동으로 인스턴스를 시작하도록 설정하려면, systemctl 명령어를 이용해서 서비스를 등록하면 된다.

pg_ctl 명령어를 이용한 인스턴스 제어 방법

pg_ctl 명령어 주요 옵션은 다음과 같다:

  • start: 인스턴스를 시작한다.
  • stop: 인스턴스를 정지한다.
  • restart: 인스턴스를 재시작한다.
  • reload: pg_hba.conf, postgresql.conf, postgresql.auto.conf 의 변경 사항 중 인스턴스 재시작 없이 반영 가능한 변경 사항을 적용한다.
  • status: 인스턴스 상태를 확인한다.

인스턴스 제어 예제

pg_ctl 명령어를 이용해서 인스턴스를 제어하는 예제는 다음과 같다.

테스트 전에 미리 pg_ctl 명령어가 위치한 /usr/pgsql-17/bin 디렉토리를 PATH 환경 변수에 추가한다.

$ echo "export PATH=/usr/pgsql-17/bin:\$PATH" >> ~postgres/.bash_profile
$ . ~postgres/.bash_profile
$ pg_ctl start -D /data/svc01
$ pg_ctl restart -D /data/svc01
$ pg_ctl reload -D /data/svc01
$ pg_ctl status -D /data/svc01
$ pg_ctl stop -D /data/svc01

PGDATA 환경변수 설정

PGDATA 환경 변수를 설정하면 pg_ctl 명령어 실행 시에 -D 옵션을 지정하지 않아도 된다.

$ echo "export PGDATA=/data/svc01" >> ~postgres/.bash_profile
$ . ~postgres/.bash_profile
$ pg_ctl start

-D 옵션 없이 인스턴스를 시작하면 postgres 프로세스 정보에 데이터베이스 클러스터 디렉토리가 표시되지 않는다.

데이터베이스 서버 내에 1개의 데이터베이스 클러스터만 존재한다면 -D 옵션을 사용할 필요는 없다.

데이터베이스 서버 내에 2개 이상의 데이터베이스 클러스터가 존재한다면 -D 옵션을 이용하는 것이 모니터링 하기에 편리하다.

# -D 옵션 적용
$ ps -ef | grep /usr/pgsql-17/bin/postgres | grep -v grep
 
# -D 옵션 미적용
$ ps -ef | grep /usr/pgsql-17/bin/postgres | grep -v grep

인스턴스 종료 방법

인스턴스 종료 모드는 다음과 같다. 기본적으로는 fast 모드이다.

  • -m smart: 기존에 접속한 세션이 모두 종료할 때까지 대기한 후에 종료한다.

  • -m fast: 액티브 트랜잭션을 모두 롤백하고, 접속한 세션을 강제 종료한 후에 종료한다. 종료 시에 체크포인트를 수행하므로 재시작시에 인스턴스 복구를 수행할 필요가 없다.

  • -m immediate: 액티브 트랜잭션에 대한 롤백을 수행하지 않을 뿐 아니라 체크 포인트도 수행하지 않고 종료한다. 가장 빠르게 인스턴스를 종료할 수 있지만 재시작시에는 인스턴스 복구를 수행해야 한다.

데이터베이스 서버 재시작 시에 인스턴스 자동 시작 방법

systemctl 명령어를 이용해서 서비스를 등록한다.

$ systemctl enable postgresql-17

서비스 등록 후 /usr/lib/systemd/system/postgresql-17.service 파일의 PGDATA 값을 데이터베이스 클러스터 디렉토리로 변경한다.

Environment=PGDATA=/data/svc01

다음과 같이 변경 내용을 적용한다.

# systemctl daemon-reload

서비스 등록 후에 서버를 재시작하면 -D 옵션을 적용해서 자동으로 인스턴스가 시작된다.

$ ps -ef | grep /usr/pgsql-17/bin/postgres | grep -v grep

1-3. 접속하기

인스턴스가 기동되면 클라이언트 프로그램을 이용해서 데이터베이스에 접속할 수 있다. 접속 방식은 로컬 접속과 원격 접속으로 구분된다.

데이터베이스 접속을 위해 일반적으로 사용되는 프로그램은 PostgreSQL 에서 자체적으로 제공하는 pgAdmin 과 psql 및 무료로 사용가능한 DBeaver 이다.

이 책에서는 psql 을 이용한다.

로컬 접속

로컬 접속은 putty 와 같은 터미널 프로그램을 이용해서 데이터베이스 서버에 접속한 후에 데이터베이스에 접속하는 방식이다. 로컬 접속을 위해 postgres OS 유저로 데이터베이스 서버에 로그인 한 후에 psql 을 이용해서 데이터베이스에 접속해보자.

postgres 데이터베이스 유저 암호는 initdb 명령어 수행 시에 입력했던 암호를 입력한다.

$ psql
 
=> \c

psql 실행 후에 암호를 입력하면 데이터베이스에 접속한다. 이때 내부적으로는 아래의 네 가지 옵션이 자동으로 적용된다.

  • 데이터베이스 서버 IP 주소
  • 데이터베이스 접속 포트
  • 데이터베이스명
  • 접속 유저명

로컬 접속이므로 데이터베이스 서버 IP 주소는 localhost, 데이터베이스 접속 포트는 기본값인 5432, 데이터베이스명은 기본값인 postgres, 접속 유저명은 OS 로그인 유저와 동일한 postgres 유저로 접속한다.

$ psql -h localhost -p 5432 -d postgres -U postgres
  • -h: 데이터베이스 서버 IP 주소를 입력한다. 옵션 기본값은 localhost 이며 PGHOST 환경 변수를 이용해서 기본값을 변경할 수 있다. 다만 로컬 접속 시에는 기본값인 localhost 를 이용하므로 PGHOST 환경 변수를 설정할 필요는 없다.
  • -p: 데이터베이스 접속 포트를 입력한다. 옵션 기본값은 5432 이며 PGPORT 환경 변수를 이용해서 기본값을 변경할 수 있다.
  • -U: 접속 대상 데이터베이스를 입력한다. 옵션 기본값은
  • -d 옵션은 데이터베이스 이름을 지정한다. 기본값은 postgres 이다.

pg_hba.conf 파일을 이용한 접속 관리

PostgreSQL 은 pg_hba.conf 파일을 이용해서 데이터베이스 서버에 접속할 수 있는 클라이언트 서버의 IP 주소(또는 IP 대역대), 접속 가능 유저, 접속 가능 데이터베이스 및 유저 인증 방식을 관리한다. pg_hba.conf 파일은 $PGDATA 디렉토리에 위치하며 초기 설정 내용은 다음과 같다

cd $PGDATA
cat pg_hba.conf

각 컬럼의 의미는 다음과 같다:

  • TYPE: local 은 로컬 접속이고 host 는 원격 접속을 의미한다.
  • DATABASE: 접속 대상 데이터베이스명을 설정한다.
  • USER: 데이터베이스에 접속할 수 있는 유저명을 설정한다. all 은 모든 유저를 의미한다.
  • ADDRESS: 데이터베이스에 접속할 수 있는 클라이언트 IP 주소를 CIDR 방식으로 설정한다. ‘0.0.0.0/0’ 으로 설정하면 모든 클라이언트 서버에서 접속할 수 있다.
  • METHOD: 데이터베이스 접속 시에 사용할 유저 인증 방식을 설정한다. 초깃값은 initdb 실행 시에 사용한 —auth 옵션으로 설정된다.

PostgreSQLpg_hba.conf 파일에서 사용할 수 있는 주요 인증 방식들에 대한 요약표:

METHOD설명보안 수준
trust유저 인증을 하지 않고 접속을 허용합니다. 로컬 테스트 외에는 사용을 금장합니다.매우 낮음
md5클라이언트가 비밀번호를 MD5 해시 알고리즘으로 암호화하여 서버에 전송합니다.보통
scram-sha-256가장 안전한 비밀번호 기반 인증 방식입니다. 솔트(Salt)를 사용한 챌린지-응답 메커니즘을 이용합니다.가장 높음
peer운영체제(OS)의 사용자 이름을 확인하여 데이터베이스 유저와 일치하는지 검증합니다. (로컬 접속 전용)높음
gssKerberos와 같은 중앙 집중식 인증을 위해 GSSAPI(Generic Security Service Application Program Interface)를 사용합니다.높음
sspiWindows 환경에서 Active Directory 등을 통한 통합 인증을 수행할 때 사용합니다.높음
ldap외부 LDAP(Lightweight Directory Access Protocol) 서버를 통해 사용자를 인증합니다.보통
radiusRADIUS 서버를 통해 원격으로 유저 인증을 수행합니다.보통
certSSL/TLS 연결 시 클라이언트가 제출한 SSL 인증서의 신뢰성을 확인하여 인증합니다.매우 높음
pam운영체제의 PAM(Pluggable Authentication Modules) 서비스를 이용하여 인증을 위임합니다.높음
ident클라이언트 호스트의 ident 서버에 접속하여 네트워크 유저 이름을 확인합니다.낮음
reject특정 조건(IP, 유저 등)에 해당하는 클라이언트의 접속을 즉시 거부합니다.N/A

원격 접속을 위한 설정