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' - pwprompt1-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/svc01PGDATA 환경변수 설정
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 grep1-3. 접속하기
인스턴스가 기동되면 클라이언트 프로그램을 이용해서 데이터베이스에 접속할 수 있다. 접속 방식은 로컬 접속과 원격 접속으로 구분된다.
데이터베이스 접속을 위해 일반적으로 사용되는 프로그램은 PostgreSQL 에서 자체적으로 제공하는 pgAdmin 과 psql 및 무료로 사용가능한 DBeaver 이다.
이 책에서는 psql 을 이용한다.
로컬 접속
로컬 접속은 putty 와 같은 터미널 프로그램을 이용해서 데이터베이스 서버에 접속한 후에 데이터베이스에 접속하는 방식이다. 로컬 접속을 위해 postgres OS 유저로 데이터베이스 서버에 로그인 한 후에 psql 을 이용해서 데이터베이스에 접속해보자.
postgres 데이터베이스 유저 암호는 initdb 명령어 수행 시에 입력했던 암호를 입력한다.
$ psql
=> \cpsql 실행 후에 암호를 입력하면 데이터베이스에 접속한다. 이때 내부적으로는 아래의 네 가지 옵션이 자동으로 적용된다.
- 데이터베이스 서버 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 옵션으로 설정된다.
PostgreSQL 의 pg_hba.conf 파일에서 사용할 수 있는 주요 인증 방식들에 대한 요약표:
| METHOD | 설명 | 보안 수준 |
|---|---|---|
| trust | 유저 인증을 하지 않고 접속을 허용합니다. 로컬 테스트 외에는 사용을 금장합니다. | 매우 낮음 |
| md5 | 클라이언트가 비밀번호를 MD5 해시 알고리즘으로 암호화하여 서버에 전송합니다. | 보통 |
| scram-sha-256 | 가장 안전한 비밀번호 기반 인증 방식입니다. 솔트(Salt)를 사용한 챌린지-응답 메커니즘을 이용합니다. | 가장 높음 |
| peer | 운영체제(OS)의 사용자 이름을 확인하여 데이터베이스 유저와 일치하는지 검증합니다. (로컬 접속 전용) | 높음 |
| gss | Kerberos와 같은 중앙 집중식 인증을 위해 GSSAPI(Generic Security Service Application Program Interface)를 사용합니다. | 높음 |
| sspi | Windows 환경에서 Active Directory 등을 통한 통합 인증을 수행할 때 사용합니다. | 높음 |
| ldap | 외부 LDAP(Lightweight Directory Access Protocol) 서버를 통해 사용자를 인증합니다. | 보통 |
| radius | RADIUS 서버를 통해 원격으로 유저 인증을 수행합니다. | 보통 |
| cert | SSL/TLS 연결 시 클라이언트가 제출한 SSL 인증서의 신뢰성을 확인하여 인증합니다. | 매우 높음 |
| pam | 운영체제의 PAM(Pluggable Authentication Modules) 서비스를 이용하여 인증을 위임합니다. | 높음 |
| ident | 클라이언트 호스트의 ident 서버에 접속하여 네트워크 유저 이름을 확인합니다. | 낮음 |
| reject | 특정 조건(IP, 유저 등)에 해당하는 클라이언트의 접속을 즉시 거부합니다. | N/A |