Linux8 CentOS8에서 PostgreSQL 12 설치하기

PostgreSQL

PostgreSQL의 주요 설치 방법에는 다음 3가지가 있습니다. 이 글에서는 3번째 “PostgreSQL 개발자 Yum 리포지토리에서 설치“하는 방법에 대해 소개 하겠습니다. *(리포지토리는 패키지 저장소를 의미합니다.)

  1. 소스 코드를 컴파일&설치
    • 소스 코드를 컴파일&설치하는 방법은 최신 버전을 사용할 수 있지만 먼저 컴파일 환경을 구축하거나 업그레이드 할 때마다 컴파일&설치를 해야 하는 데 너무나 시간이 걸립니다.
  2. Redhat 또는 CentOS 표준 Yum 저장소(Repository)에서 설치
    • Redhat 또는 CentOS 표준 Yum 저장소(Repository)를 사용하는 방법은 바로 설치 할 수 있고, 시간이 들지 않지만 최신 버전을 사용할 수 없습니다.
  3. PostgreSQL 개발자 Yum 저장소(Repository)에서 설치
    • PostgreSQL 개발자의 Yum 저장소(Repository)를 사용 설치한다면 그다지 시간이 걸리지 않고 최신 버전을 사용할 수 있습니다.

사용 가능한 리포지토리를 확인하기

다음과 같이 “sudo yum repolist enabled” 명령으로 내용을 확인 할 수 있습니다. 확인 결과 CentOS8 인스톨 직후는 Base, Extras, Updates 3개의 리포지토리만 사용 가능한 상태입니다.

$ sudo yum repolist enabled
repo id    repo name
appstream  CentOS Linux 8 - AppStream
baseos     CentOS Linux 8 - BaseOS
extras     CentOS Linux 8 - Extras

리포지토리에 대해 더 자세히 알고 싶으시다면 yum 리포지토리 활성/비활성 확인하기 글 참조하십시오.

PostgreSQL Yum Repository설치

PostgreSQL RPM Building Project – Repository Packages
https://yum.postgresql.org/repopackages.php

위 페이지에서 다음 화면과 같이 설치 대상 OS(Linux Distribution) 즉, 여기서는 “CentOS 8 – x86_64에서 마우스 오른쪽 버튼 클릭” > “컨텍스트 메뉴 표시” > “링크 주소 복사” 순서로 PostgreSQL 개발자의 Yum 리포지토리 URL을 복사합니다.

취득한 URL은 다음과 같습니다.
https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
그리고, 다음과 같이 “sudo yum install -y ” 명령 인수로 지정하여 리포지토리를 인스톨합니다.

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

.... 중간 생략 ....
Installing:
 pgdg-redhat-repo   noarch   42.0-18    /pgdg-redhat-repo-latest.noarch    11 k
.... 중간 생략 ....
Installed:
  pgdg-redhat-repo.noarch 0:42.0-17.1
Complete!

사용 가능한 리포지토리를 확인하기

PostgreSQL Yum Repository설치후 사용 가능한저장소(Repository)에 변화가 있었는지 다음과 같이 “sudo yum repolist enabled” 명령으로 내용을 확인 할 수 있습니다. 확인 결과 Base, Extras, Updates 3개의 저장소(Repository) 이외에 PostgresSQL관련 저장소(Repository)가 추가 되었음을 확인 할 수 있습니다.

$ sudo yum repolist enabled
appstream   CentOS Linux 8 - AppStream
baseos      CentOS Linux 8 - BaseOS
extras      CentOS Linux 8 - Extras
pgdg-common PostgreSQL common RPMs for RHEL/CentOS 8 - x86_64
pgdg10      PostgreSQL 10 for RHEL/CentOS 8 - x86_64
pgdg11      PostgreSQL 11 for RHEL/CentOS 8 - x86_64
pgdg12      PostgreSQL 12 for RHEL/CentOS 8 - x86_64
pgdg13      PostgreSQL 13 for RHEL/CentOS 8 - x86_64
pgdg96      PostgreSQL 9.6 for RHEL/CentOS 8 - x86_64

pgdg12 저장소(Repository) 만 활성, 그 이외는 비활성으로 설정 후 pgdg12 저장소(Repository)의 이용 가능한 패키지 리스트를 확인하는 명령은 다음과 같습니다.

$ sudo yum --disablerepo="*" --enablerepo="pgdg12" list available

PostgreSQL서버 설치하기

PostgreSQL 서버 설치 및 사용이 목적이라면 “sudo yum install -y“명령으로 postgresql12-server패키지를 설치합니다. 의존 관계가 있는 패키지 postgresql12, postgresql12-libs도 같이 설치됩니다.

$ sudo yum install -y postgresql12-server
.... 중간 생략 ....
Installed:
  postgresql12-server-12.7-2PGDG.rhel8.x86_64

Complete!

PostgreSQL 패키지의 설치 장소는 버전마다 다릅니다. 버전 12이면 /usr/pgsql-12에 설치 됩니다. 참고로 동일한 환경에 여러 버전을 설치할 수 있습니다.

$ ls /usr/pgsql-12
bin  lib  share

PostgreSQL 서버 설치할 때 PostgreSQL 관리 유저 postgres가 존재하지 않으면 자동 생성합니다. “id” 명령으로 존재 여부를 확인합니다.

$ id postgres
uid=26(postgres) gid=26(postgres) groups=26(postgres)

자동 작성된 postgres유저의 패스워드를 설정합니다.

$ sudo passwd postgres
Changing password for user postgres.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

PostgreSQL 데이터베이스 클러스터 작성하기

다음 명령으로 PostgreSQL 데이터베이스 클러스터를 작성합니다. log는 /var/lib/pgsql/12/initdb.log에 출력 됩니다. 참고로 initdb를 다시 시작하려면 “/var/lib/pgsql” 의 모든 내용을 삭제하십시오.

postgresql-12-setup 사용 작성하기

$ sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
$ sudo cat /var/lib/pgsql/12/initdb.log
이 데이터베이스 시스템에서 만들어지는 파일들은 그 소유주가 "postgres" id로
지정될 것입니다. 또한 이 사용자는 서버 프로세스의 소유주가 됩니다.

데이터베이스 클러스터는 "ko_KR.UTF-8" 로케일으로 초기화될 것입니다.
기본 데이터베이스 인코딩은 "UTF8" 인코딩으로 설정되었습니다.
initdb: "ko_KR.UTF-8" 로케일에 알맞은 전문검색 설정을 찾을 수 없음
기본 텍스트 검색 구성이 "simple"(으)로 설정됩니다.

자료 페이지 체크섬 기능 사용 하지 않음

이미 있는 /var/lib/pgsql/12/data 디렉터리의 액세스 권한을 고치는 중 ...완료
하위 디렉터리 만드는 중 ...완료
사용할 동적 공유 메모리 관리방식을 선택하는 중 ... posix
max_connections 초기값을 선택하는 중 ...100
기본 shared_buffers를 선택하는 중... 128MB
기본 지역 시간대를 선택 중 ... Asia/Seoul
환경설정 파일을 만드는 중 ...완료
부트스트랩 스크립트 실행 중 ... 완료
부트스트랩 다음 초기화 작업 중 ... 완료
자료를 디스크에 동기화 하는 중 ... 완료

작업완료. 이제 다음 명령을 이용해서 서버를 가동 할 수 있습니다:

    /usr/pgsql-12/bin/pg_ctl -D /var/lib/pgsql/12/data/ -l 로그파일 start

PGSETUP_INITDB_OPTIONS 지정 postgresql-12-setup 사용 작성하기

또는 root 관리 사용자로 로그인해서 PGSETUP_INITDB_OPTIONS 환경 변수를 다음과 같이 설정하면 기본 encoding을 변경해서 PostgreSQL 데이터베이스 클러스터를 작성 할 수도 있습니다.

# export PGSETUP_INITDB_OPTIONS="--encoding=UTF8 --locale=en_US.UTF-8 --lc-collate=en_US.UTF-8 --lc-ctype=en_US.UTF-8"
# /usr/pgsql-12/bin/postgresql-12-setup initdb
# cat /var/lib/pgsql/12/initdb.log

initdb 명령사용 작성하기

참고로 다음 명령을 사용하여 PostgreSQL 데이터베이스 클러스터를 작성 할 수도 있습니다. 기본 설치가 아닌 커스터마이즈 설치를 위해 상세하게 옵션을 지정할 때 사용합니다.

$ sudo su - postgres -c '/usr/pgsql-12/bin/initdb -E UTF8 --locale=C -A scram-sha-256 -W'

옵션 설명은 다음과 같습니다.

  • -U : 만들 데이터베이스 클러스터 의 수퍼 유저 이름
  • -A인증 방법 지정. ( password, md5, scram-sha-256 중 하나를 지정합니다.)
  • -E : 문자 코드 지정
  • -W : 새로운 수퍼 유저(postgres)를 위한 암호를 입력하라는 메시지를 표시합니다.
  • -D : 데이터베이스 클러스터 를 저장하는 디렉토리 ( 절대 경로 ). 지정되지 않은 경우 환경 변수 PGDATA가 지정됩니다.

서비스 등록 및 시작, 정지, 재기동하기

OS가 기동할 때 PostgreSQL서비스도 같이 자동으로 기동 시키기 위해서 다음 명령으로 시스템 서비스에 등록합니다. 참고로 –now 옵션을 지정하면 서비스 기동까지 실행합니다.

$ sudo systemctl enable --now postgresql-12
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-12.service to /usr/lib/systemd/system/postgresql-12.service.

다음 명령으로 PostgreSQL서비스를 수동으로 시작합니다.

$ sudo systemctl start postgresql-12

PostgreSQL서비스를 수동으로 재 기동하려면 다음 명령을 사용합니다.

$ sudo systemctl restart postgresql-12

PostgreSQL서비스를 수동 정지는 다음 명령을 사용합니다.

$ sudo systemctl stop postgresql-12

데이터베이스 접속 확인

다음 명령으로 postgres프로세스를 확인할 수 있습니다. 프로세스가 psql 클라이언트 접속을 기다립니다.

$ sudo su - postgres -c 'ps -o ppid,pid,cmd'
 PPID   PID CMD
    1  2911 /usr/pgsql-12/bin/postmaster -D /var/lib/pgsql/12/data/
 2911  2913 postgres: logger
 2911  2915 postgres: checkpointer
 2911  2916 postgres: background writer
 2911  2917 postgres: walwriter
 2911  2918 postgres: autovacuum launcher
 2911  2919 postgres: stats collector
 2911  2920 postgres: logical replication launcher
 3625  3626 ps -o ppid,pid,cmd

현재 로그인 Linux 사용자가 PostgresSQL서버의 롤(postgres)가 아니면 접속할 때 사용자 이름과 데이터베이스의 role명이 다르다며 에러 종료 합니다.

$ whoami
centos
$ psql -l
psql: error: FATAL:  role "centos" does not exist
$ psql -d postgres
psql: 오류: 치명적오류:  "centos" 롤(role) 없음
$ psql -U postgres
psql: 오류: 치명적오류:  사용자 "postgres"의 peer 인증을 실패했습니다.

다음과 같이 로그인 유저를 관리유저(postgres)로 변경 후 데이터베이스에 접속합니다.

$ su - postgres
암호:postgres
마지막 로그인: 수  7월 14 16:59:16 KST 2021 일시 pts/0
$ psql -d postgres
psql (12.7)
도움말을 보려면 "help"를 입력하십시오.

postgres=# select current_database();
 current_database
------------------
 postgres
(1개 행)

postgres=# \list
                                 데이터베이스 목록
   이름    |  소유주  | 인코딩 |   Collate   |    Ctype    |      액세스 권한
-----------+----------+--------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 |
 template0 | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
           |          |        |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
           |          |        |             |             | postgres=CTc/postgres
(3개 행)

postgres=#

이것으로 PostgreSQL서버 설치가 완료되었습니다.

제목과 URL을 복사했습니다