7.4. Using PostgreSQL


PostgreSQL 서버는 SQL 언어를 기반으로 하는 오픈 소스 강력하고 고도로 확장 가능한 데이터베이스 서버입니다. PostgreSQL 서버는 광범위한 데이터 세트 및 다수의 동시 사용자를 관리할 수 있는 개체 관계형 데이터베이스 시스템을 제공합니다. 이러한 이유로 클러스터에서 PostgreSQL 서버를 사용하여 대량의 데이터를 관리할 수 있습니다.

PostgreSQL 서버에는 데이터 무결성을 보장하기 위한 기능이 포함되어 있어 내결함성 환경 및 애플리케이션을 구축할 수 있습니다. PostgreSQL 서버를 사용하면 데이터베이스를 다시 컴파일하지 않고도 자체 데이터 유형, 사용자 지정 함수 또는 다른 프로그래밍 언어의 코드를 사용하여 데이터베이스를 확장할 수 있습니다.

RHEL 시스템에 PostgreSQL 을 설치하고 구성하는 방법, PostgreSQL 데이터를 백업하는 방법 및 이전 PostgreSQL 버전에서 마이그레이션하는 방법을 알아봅니다.

7.4.1. PostgreSQL 설치

RHEL 8에서는 여러 버전에서 사용할 수 있으며 각각 별도의 스트림에서 제공합니다.

  • PostgreSQL 10 - 기본 스트림
  • PostgreSQL 9.6
  • PostgreSQL 12 - RHEL 8.1.1 이후 사용 가능
  • PostgreSQL 13 - RHEL 8.4 이후 사용 가능
  • PostgreSQL 15 - RHEL 8.8 이후 사용 가능
  • PostgreSQL 16 - RHEL 8.10 이후 사용 가능
참고

설계상 동일한 모듈의 두 개 이상 버전(스트림)을 병렬로 설치할 수 없습니다. 따라서 postgresql 모듈에서 사용 가능한 스트림 중 하나만 선택해야 합니다. 컨테이너에서 다른 버전의 PostgreSQL 데이터베이스 서버를 사용할 수 있습니다. 컨테이너에서 여러 PostgreSQL 버전 실행을 참조하십시오.

PostgreSQL 을 설치하려면 다음 절차를 사용하십시오.

프로세스

  1. postgresql 모듈에서 스트림(버전)을 선택하고 서버 프로필을 지정하여 PostgreSQL 서버 패키지를 설치합니다. 예를 들면 다음과 같습니다.

    # yum module install postgresql:16/server
    Copy to Clipboard Toggle word wrap

    postgres 슈퍼유저가 자동으로 생성됩니다.

  2. 데이터베이스 클러스터를 초기화합니다.

    # postgresql-setup --initdb
    Copy to Clipboard Toggle word wrap

    Red Hat은 기본 /var/lib/pgsql/data 디렉터리에 데이터를 저장하는 것이 좋습니다.

  3. postgresql 서비스를 시작합니다.

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
  4. 부팅 시 postgresql 서비스가 시작되도록 활성화합니다.

    # systemctl enable postgresql.service
    Copy to Clipboard Toggle word wrap

모듈 스트림을 사용하는 방법에 대한 자세한 내용은 사용자 공간 구성 요소 설치, 관리 및 제거를 참조하십시오.

중요

RHEL 8 내의 이전 postgresql 스트림에서 업그레이드하려면 이후 스트림으로 전환하고 RHEL 8 버전의 PostgreSQL으로 마이그레이션에 설명된 두 가지 절차를 모두 따르십시오.

7.4.2. 컨테이너에서 여러 PostgreSQL 버전 실행

동일한 호스트에서 다른 버전의 PostgreSQL 을 실행하려면 동일한 모듈의 여러 버전(스트림)을 병렬로 설치할 수 없기 때문에 컨테이너에서 실행합니다.

이 절차에는 PostgreSQL 13PostgreSQL 15 가 포함되어 있지만 Red Hat Ecosystem Catalog에서 사용할 수 있는 PostgreSQL 컨테이너 버전을 사용할 수 있습니다.

사전 요구 사항

  • container-tools 모듈이 설치되어 있습니다.

프로세스

  1. Red Hat 고객 포털 계정을 사용하여 registry.redhat.io 레지스트리에 인증합니다.

    # podman login registry.redhat.io
    Copy to Clipboard Toggle word wrap

    컨테이너 레지스트리에 이미 로그인한 경우 이 단계를 건너뜁니다.

  2. 컨테이너에서 PostgreSQL 13 을 실행합니다.

    $ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_1>:5432 rhel8/postgresql-13
    Copy to Clipboard Toggle word wrap

    이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.

  3. 컨테이너에서 PostgreSQL 15 를 실행합니다.

    $ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_2>:5432 rhel8/postgresql-15
    Copy to Clipboard Toggle word wrap

    이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.

  4. 컨테이너에서 PostgreSQL 16 을 실행합니다.

    $ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_3>:5432 rhel8/postgresql-16
    Copy to Clipboard Toggle word wrap

    이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.

    참고

    두 데이터베이스 서버의 컨테이너 이름과 호스트 포트는 달라야 합니다.

  5. 클라이언트가 네트워크의 데이터베이스 서버에 액세스할 수 있도록 하려면 방화벽에서 호스트 포트를 엽니다.

    # firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...}
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

검증

  1. 실행 중인 컨테이너에 대한 정보를 표시합니다.

    $ podman ps
    Copy to Clipboard Toggle word wrap
  2. 데이터베이스 서버에 연결하고 root로 로그인합니다.

    # psql -u postgres -p -h localhost -P <host_port> --protocol tcp
    Copy to Clipboard Toggle word wrap

7.4.3. PostgreSQL 사용자 생성

PostgreSQL 사용자는 다음 유형입니다.

  • postgres UNIX 시스템 사용자는 pg_dump 와 같은 PostgreSQL 서버 및 클라이언트 애플리케이션을 실행하는 데만 사용해야 합니다. 데이터베이스 생성 및 사용자 관리와 같은 PostgreSQL 관리에 대한 대화형 작업에는 postgres 시스템 사용자를 사용하지 마십시오.
  • 데이터베이스 슈퍼유저 - 기본 postgres PostgreSQL 슈퍼유저는 postgres 시스템 사용자와 관련이 없습니다. pg_hba.conf 파일에서 postgres 슈퍼유저의 액세스를 제한할 수 있으며, 그렇지 않으면 다른 권한 제한은 없습니다. 다른 데이터베이스 슈퍼유저도 생성할 수 있습니다.
  • 특정 데이터베이스 액세스 권한이 있는 역할:

    • 데이터베이스 사용자 - 기본적으로 로그인할 수 있는 권한이 있습니다.
    • 사용자 그룹 - 그룹 전체에 대한 권한 관리를 활성화합니다.

역할은 데이터베이스 개체(예: 테이블 및 함수)를 소유할 수 있으며 SQL 명령을 사용하여 다른 역할에 오브젝트 권한을 할당할 수 있습니다.

표준 데이터베이스 관리 권한에는 SELECT, Cryostat,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER,CREATE,CONNECT,TEMPORARY,EXECUTE, USAGE 가 포함됩니다.

역할 속성은 LOGIN,SUPERUSER,CREATEDBCREATEROLE 과 같은 특수 권한입니다.

중요

대부분의 작업을 슈퍼유저가 아닌 역할로 수행하는 것이 좋습니다. 일반적인 방법은 CREATEDBCREATEROLE 권한이 있는 역할을 생성하고 데이터베이스 및 역할의 일상적인 관리에 이 역할을 사용하는 것입니다.

사전 요구 사항

  • PostgreSQL 서버가 설치되어 있어야 합니다.
  • 데이터베이스 클러스터가 초기화됩니다.

프로세스

  • 사용자를 생성하려면 사용자의 암호를 설정하고 사용자에게 CREATEROLECREATEDB 권한을 할당합니다.

    postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB;
    Copy to Clipboard Toggle word wrap

    mydbuser 를 사용자 이름으로 바꾸고 mypasswd 를 사용자의 암호로 바꿉니다.

예 7.1. PostgreSQL 데이터베이스 초기화, 생성 및 연결

이 예제에서는 PostgreSQL 데이터베이스를 초기화하고, 일상적인 데이터베이스 관리 권한이 있는 데이터베이스 사용자를 생성하고, 관리 권한이 있는 데이터베이스 사용자를 통해 모든 시스템 계정에서 액세스할 수 있는 데이터베이스를 생성하는 방법을 보여줍니다.

  1. PosgreSQL 서버를 설치합니다.

    # yum module install postgresql:13/server
    Copy to Clipboard Toggle word wrap
  2. 데이터베이스 클러스터를 초기화합니다.

    # postgresql-setup --initdb
    * Initializing database in '/var/lib/pgsql/data'
    * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
    Copy to Clipboard Toggle word wrap
  3. 암호 해시 알고리즘을 scram-sha-256 로 설정합니다.

    1. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경합니다.

      #password_encryption = md5              # md5 or scram-sha-256
      Copy to Clipboard Toggle word wrap

      다음으로 변경합니다.

      password_encryption = scram-sha-256
      Copy to Clipboard Toggle word wrap
    2. /var/lib/pgsql/data/pg_hba.conf 파일에서 IPv4 로컬 연결에 대해 다음 행을 변경합니다.

      host    all             all             127.0.0.1/32            ident
      Copy to Clipboard Toggle word wrap

      다음으로 변경합니다.

      host    all             all             127.0.0.1/32            scram-sha-256
      Copy to Clipboard Toggle word wrap
  4. postgresql 서비스를 시작합니다.

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
  5. postgres: 시스템 사용자로 로그인합니다.

    # su - postgres
    Copy to Clipboard Toggle word wrap
  6. PostgreSQL 대화형 터미널을 시작합니다.

    $ psql
    psql (13.7)
    Type "help" for help.
    
    postgres=#
    Copy to Clipboard Toggle word wrap
  7. 선택 사항: 현재 데이터베이스 연결에 대한 정보를 가져옵니다.

    postgres=# \conninfo
    You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
    Copy to Clipboard Toggle word wrap
  8. mydbuser 라는 사용자를 생성하고, mydbuser의 암호를 설정하고, mydbuserCREATEROLECREATEDB 권한을 할당합니다.

    postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB;
    CREATE ROLE
    Copy to Clipboard Toggle word wrap

    이제 mydbuser 사용자는 일상적인 데이터베이스 관리 작업을 수행할 수 있습니다: 데이터베이스를 생성하고 사용자 인덱스를 관리합니다.

  9. \q meta 명령을 사용하여 대화형 터미널에서 로그아웃합니다.

    postgres=# \q
    Copy to Clipboard Toggle word wrap
  10. postgres 사용자 세션에서 로그아웃합니다.

    $ logout
    Copy to Clipboard Toggle word wrap
  11. PostgreSQL 터미널에 mydbuser 로 로그인하고 호스트 이름을 지정하고 초기화 중에 생성된 기본 postgres 데이터베이스에 연결합니다.

    # psql -U mydbuser -h 127.0.0.1 -d postgres
    Password for user mydbuser:
    Type the password.
    psql (13.7)
    Type "help" for help.
    
    postgres=>
    Copy to Clipboard Toggle word wrap
  12. mydatabase 라는 데이터베이스를 생성합니다.

    postgres=> CREATE DATABASE mydatabase;
    CREATE DATABASE
    postgres=>
    Copy to Clipboard Toggle word wrap
  13. 세션에서 로그아웃합니다.

    postgres=# \q
    Copy to Clipboard Toggle word wrap
  14. mydbuser 로 mydatabase에 연결합니다.

    # psql -U mydbuser -h 127.0.0.1 -d mydatabase
    Password for user mydbuser:
    psql (13.7)
    Type "help" for help.
    mydatabase=>
    Copy to Clipboard Toggle word wrap
  15. 선택 사항: 현재 데이터베이스 연결에 대한 정보를 가져옵니다.

    mydatabase=> \conninfo
    You are connected to database "mydatabase" as user "mydbuser" on host "127.0.0.1" at port "5432".
    Copy to Clipboard Toggle word wrap

7.4.4. Configuring PostgreSQL

PostgreSQL 데이터베이스에서 모든 데이터 및 구성 파일은 데이터베이스 클러스터라는 단일 디렉터리에 저장됩니다. Red Hat은 구성 파일을 포함한 모든 데이터를 기본 /var/lib/pgsql/data/ 디렉터리에 저장하는 것이 좋습니다.

PostgreSQL 구성은 다음 파일로 구성됩니다.

  • PostgreSQL.conf - 데이터베이스 클러스터 매개 변수를 설정하는 데 사용됩니다.
  • postgresql.auto.conf - postgresql.conf 와 유사한 기본 PostgreSQL 설정을 보유합니다. 그러나 이 파일은 서버 제어 아래에 있습니다. SYSTEM 쿼리는 편집되며 수동으로 편집할 수 없습니다.
  • pg_ident.conf - 외부 인증 메커니즘에서 PostgreSQL 사용자 ID로 사용자 ID를 매핑하는 데 사용됩니다.
  • pg_hba.conf - PostgreSQL 데이터베이스에 대한 클라이언트 인증을 구성하는 데 사용됩니다.

PostgreSQL 구성을 변경하려면 다음 절차를 사용하십시오.

절차

  1. /var/lib/pgsql/data/postgresql.conf 파일을 편집하고 데이터베이스 클러스터 매개변수의 기본 설정을 구성합니다. 예를 들면 다음과 같습니다.

    log_connections = yes
    log_destination = 'syslog'
    search_path = '"$user", public'
    shared_buffers = 128MB
    password_encryption = scram-sha-256
    Copy to Clipboard Toggle word wrap
  2. /var/lib/pgsql/data/pg_hba.conf 파일을 편집하고 클라이언트 인증을 구성합니다. 예를 들면 다음과 같습니다.

    # TYPE    DATABASE       USER        ADDRESS              METHOD
    local     all            all                              trust
    host      postgres       all         192.168.93.0/24      ident
    host      all            all         .example.com         scram-sha-256
    Copy to Clipboard Toggle word wrap
  3. 변경 사항이 적용되도록 postgresql 서비스를 다시 시작합니다.

    # systemctl restart postgresql.service
    Copy to Clipboard Toggle word wrap

7.4.5. PostgreSQL 서버에서 TLS 암호화 구성

기본적으로 PostgreSQL 에서는 암호화되지 않은 연결을 사용합니다. 보다 안전한 연결을 위해 PostgreSQL 서버에서 TLS(Transport Layer Security) 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성할 수 있습니다.

사전 요구 사항

  • PostgreSQL 서버가 설치되어 있어야 합니다.
  • 데이터베이스 클러스터가 초기화됩니다.

절차

  1. OpenSSL 라이브러리를 설치합니다.

    # yum install openssl
    Copy to Clipboard Toggle word wrap
  2. TLS 인증서 및 키를 생성합니다.

    # openssl req -new -x509 -days 365 -nodes -text -out server.crt \
      -keyout server.key -subj "/CN=dbhost.yourdomain.com"
    Copy to Clipboard Toggle word wrap

    dbhost.yourdomain.com을 데이터베이스 호스트 및 도메인 이름으로 바꿉니다.

  3. 서명된 인증서와 개인 키를 데이터베이스 서버의 필수 위치에 복사합니다.

    # cp server.{key,crt} /var/lib/pgsql/data/.
    Copy to Clipboard Toggle word wrap
  4. 서명된 인증서의 소유자 및 그룹 소유권을 postgres 사용자로 변경합니다.

    # chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
    Copy to Clipboard Toggle word wrap
  5. 소유자만 읽을 수 있도록 개인 키에 대한 권한을 제한합니다.

    # chmod 0400 /var/lib/pgsql/data/server.key
    Copy to Clipboard Toggle word wrap
  6. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경하여 암호 해시 알고리즘을 scram-sha-256 으로 설정합니다.

    #password_encryption = md5              # md5 or scram-sha-256
    Copy to Clipboard Toggle word wrap

    다음으로 변경합니다.

    password_encryption = scram-sha-256
    Copy to Clipboard Toggle word wrap
  7. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경하여 SSL/TLS를 사용하도록 PostgreSQL을 구성합니다.

    #ssl = off
    Copy to Clipboard Toggle word wrap

    다음으로 변경합니다.

    ssl=on
    Copy to Clipboard Toggle word wrap
  8. /var/lib/pgsql/data/pg_hba.conf 파일에서 IPv4 로컬 연결에 대해 다음 행을 변경하여 TLS를 사용하는 클라이언트의 연결만 허용하도록 모든 데이터베이스에 대한 액세스를 제한합니다.

    host		all		all		127.0.0.1/32		ident
    Copy to Clipboard Toggle word wrap

    다음으로 변경합니다.

    hostssl 	all		all		127.0.0.1/32		scram-sha-256
    Copy to Clipboard Toggle word wrap

    또는 다음 새 행을 추가하여 단일 데이터베이스 및 사용자에 대한 액세스를 제한할 수 있습니다.

    hostssl	mydatabase	mydbuser	127.0.0.1/32		scram-sha-256
    Copy to Clipboard Toggle word wrap

    mydatabase 를 데이터베이스 이름으로 바꾸고 mydbuser 를 사용자 이름으로 바꿉니다.

  9. postgresql 서비스를 다시 시작하여 변경 사항을 적용합니다.

    # systemctl restart postgresql.service
    Copy to Clipboard Toggle word wrap

검증

  • 연결이 암호화되었는지 수동으로 확인하려면 다음을 수행하십시오.

    1. PostgreSQL 데이터베이스에 mydbuser 사용자로 연결하고 호스트 이름과 데이터베이스 이름을 지정합니다.

      $ psql -U mydbuser -h 127.0.0.1 -d mydatabase
      Password for user mydbuser:
      Copy to Clipboard Toggle word wrap

      mydatabase 를 데이터베이스 이름으로 바꾸고 mydbuser 를 사용자 이름으로 바꿉니다.

    2. 현재 데이터베이스 연결에 대한 정보를 얻습니다.

      mydbuser=> \conninfo
      You are connected to database "mydatabase" as user "mydbuser" on host "127.0.0.1" at port "5432".
      SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
      Copy to Clipboard Toggle word wrap
  • PostgreSQL 에 대한 연결이 암호화되었는지 확인하는 간단한 애플리케이션을 작성할 수 있습니다. 이 예제에서는 libpq-devel 패키지에서 제공하는 libpq 클라이언트 라이브러리를 사용하는 C로 작성된 애플리케이션을 보여줍니다.

    #include <stdio.h>
    #include <stdlib.h>
    #include <libpq-fe.h>
    
    int main(int argc, char* argv[])
    {
    //Create connection
    PGconn* connection = PQconnectdb("hostaddr=127.0.0.1 password=mypassword port=5432 dbname=mydatabase user=mydbuser");
    
    if (PQstatus(connection) ==CONNECTION_BAD)
        {
        printf("Connection error\n");
        PQfinish(connection);
        return -1; //Execution of the program will stop here
        }
        printf("Connection ok\n");
        //Verify TLS
        if (PQsslInUse(connection)){
         printf("TLS in use\n");
         printf("%s\n", PQsslAttribute(connection,"protocol"));
        }
        //End connection
        PQfinish(connection);
        printf("Disconnected\n");
        return 0;
    }
    Copy to Clipboard Toggle word wrap

    mypassword 를 암호, mydatabase 를 데이터베이스 이름으로, mydbuser 를 사용자 이름으로 교체합니다.

    참고

    -l pq 옵션을 사용하여 컴파일하기 위해 pq 라이브러리를 로드해야 합니다. 예를 들어 GCC 컴파일러를 사용하여 애플리케이션을 컴파일하려면 다음을 수행합니다.

    $ gcc source_file.c -lpq -o myapplication
    Copy to Clipboard Toggle word wrap

    source_file.c 에 위의 예제 코드가 포함되어 있고 myapplication 은 보안된 PostgreSQL 연결을 확인하기 위한 애플리케이션의 이름입니다.

예 7.2. TLS 암호화를 사용하여 PostgreSQL 데이터베이스 초기화, 생성 및 연결

이 예제에서는 PostgreSQL 데이터베이스를 초기화하고 데이터베이스 사용자 및 데이터베이스를 생성하고 보안 연결을 사용하여 데이터베이스에 연결하는 방법을 보여줍니다.

  1. PosgreSQL 서버를 설치합니다.

    # yum module install postgresql:13/server
    Copy to Clipboard Toggle word wrap
  2. 데이터베이스 클러스터를 초기화합니다.

    # postgresql-setup --initdb
    * Initializing database in '/var/lib/pgsql/data'
    * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
    Copy to Clipboard Toggle word wrap
  3. OpenSSL 라이브러리를 설치합니다.

    # yum install openssl
    Copy to Clipboard Toggle word wrap
  4. TLS 인증서 및 키를 생성합니다.

    # openssl req -new -x509 -days 365 -nodes -text -out server.crt \
      -keyout server.key -subj "/CN=dbhost.yourdomain.com"
    Copy to Clipboard Toggle word wrap

    dbhost.yourdomain.com을 데이터베이스 호스트 및 도메인 이름으로 바꿉니다.

  5. 서명된 인증서와 개인 키를 데이터베이스 서버의 필수 위치에 복사합니다.

    # cp server.{key,crt} /var/lib/pgsql/data/.
    Copy to Clipboard Toggle word wrap
  6. 서명된 인증서의 소유자 및 그룹 소유권을 postgres 사용자로 변경합니다.

    # chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
    Copy to Clipboard Toggle word wrap
  7. 소유자만 읽을 수 있도록 개인 키에 대한 권한을 제한합니다.

    # chmod 0400 /var/lib/pgsql/data/server.key
    Copy to Clipboard Toggle word wrap
  8. 암호 해시 알고리즘을 scram-sha-256 으로 설정합니다. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경합니다.

    #password_encryption = md5              # md5 or scram-sha-256
    Copy to Clipboard Toggle word wrap

    다음으로 변경합니다.

    password_encryption = scram-sha-256
    Copy to Clipboard Toggle word wrap
  9. SSL/TLS를 사용하도록 PostgreSQL을 구성합니다. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경합니다.

    #ssl = off
    Copy to Clipboard Toggle word wrap

    다음으로 변경합니다.

    ssl=on
    Copy to Clipboard Toggle word wrap
  10. postgresql 서비스를 시작합니다.

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
  11. postgres 라는 시스템 사용자로 로그인합니다.

    # su - postgres
    Copy to Clipboard Toggle word wrap
  12. postgres 사용자로 PostgreSQL 대화형 터미널을 시작합니다.

    $ psql -U postgres
    psql (13.7)
    Type "help" for help.
    
    postgres=#
    Copy to Clipboard Toggle word wrap
  13. mydbuser 라는 사용자를 생성하고 mydbuser 의 암호를 설정합니다.

    postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd';
    CREATE ROLE
    postgres=#
    Copy to Clipboard Toggle word wrap
  14. mydatabase 데이터베이스를 생성합니다.

    postgres=# CREATE DATABASE mydatabase;
    CREATE DATABASE
    postgres=#
    Copy to Clipboard Toggle word wrap
  15. mydbuser 사용자에게 모든 권한을 부여합니다.

    postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydbuser;
    GRANT
    postgres=#
    Copy to Clipboard Toggle word wrap
  16. 대화형 터미널에서 로그아웃합니다.

    postgres=# \q
    Copy to Clipboard Toggle word wrap
  17. postgres 사용자 세션에서 로그아웃합니다.

    $ logout
    Copy to Clipboard Toggle word wrap
  18. /var/lib/pgsql/data/pg_hba.conf 파일에서 IPv4 로컬 연결에 대해 다음 행을 변경하여 TLS를 사용하는 클라이언트의 연결만 허용하도록 모든 데이터베이스에 대한 액세스를 제한합니다.

    host		all		all		127.0.0.1/32		ident
    Copy to Clipboard Toggle word wrap

    다음으로 변경합니다.

    hostssl 	all		all		127.0.0.1/32		scram-sha-256
    Copy to Clipboard Toggle word wrap
  19. postgresql 서비스를 다시 시작하여 변경 사항을 적용합니다.

    # systemctl restart postgresql.service
    Copy to Clipboard Toggle word wrap
  20. PostgreSQL 데이터베이스에 mydbuser 사용자로 연결하고 호스트 이름과 데이터베이스 이름을 지정합니다.

    $ psql -U mydbuser -h 127.0.0.1 -d mydatabase
    Password for user mydbuser:
    psql (13.7)
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
    Type "help" for help.
    
    mydatabase=>
    Copy to Clipboard Toggle word wrap

7.4.6. PostgreSQL 데이터 백업

PostgreSQL 데이터를 백업하려면 다음 방법 중 하나를 사용합니다.

  • SQL 덤프
  • 파일 시스템 수준 백업
  • 연속 아카이브

7.4.6.1. SQL 덤프를 사용하여 PostgreSQL 데이터 백업

SQL 덤프 방법은 SQL 명령으로 덤프 파일을 생성하는 방법을 기반으로 합니다. 덤프가 데이터베이스 서버에 다시 업로드되면 덤프 시와 동일한 상태로 데이터베이스를 다시 생성합니다.

SQL 덤프는 다음 PostgreSQL 클라이언트 애플리케이션에서 확인합니다.

  • pg_dump 는 역할 또는 테이블 공간에 대한 클러스터 전체 정보가 없는 단일 데이터베이스를 덤프합니다.
  • pg_dumpall 은 지정된 클러스터의 각 데이터베이스를 덤프하고 역할 및 테이블 공간 정의와 같은 클러스터 전체 데이터를 유지합니다.

기본적으로 pg_dumppg_dumpall 명령은 결과를 표준 출력에 작성합니다. 덤프를 파일에 저장하려면 출력을 SQL 파일로 리디렉션합니다. 결과 SQL 파일은 병렬 처리를 허용하는 텍스트 형식 또는 다른 형식으로 되어 있고 개체 복원을 보다 자세히 제어할 수 있습니다.

데이터베이스에 액세스할 수 있는 모든 원격 호스트에서 SQL 덤프를 수행할 수 있습니다.

7.4.6.1.1. SQL 덤프의 장점 및 단점

SQL 덤프에는 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.

  • SQL 덤프는 서버 버전별이 아닌 유일한 PostgreSQL 백업 방법입니다. pg_dump 유틸리티의 출력은 이후 버전의 PostgreSQL 으로 다시 로드할 수 있으며 이는 파일 시스템 수준 백업 또는 연속 보관에서는 불가능합니다.
  • SQL 덤프는 32비트에서 64비트 서버로 이동하는 것과 같이 데이터베이스를 다른 시스템 아키텍처로 전송할 때 작동하는 유일한 방법입니다.
  • SQL 덤프는 내부적으로 일관성 있는 덤프를 제공합니다. 덤프는 pg_dump 가 실행될 때 데이터베이스의 스냅샷을 나타냅니다.
  • pg_dump 유틸리티는 실행 중일 때 데이터베이스에서 다른 작업을 차단하지 않습니다.

SQL 덤프의 단점은 파일 시스템 수준 백업에 비해 시간이 더 필요하다는 것입니다.

7.4.6.1.2. pg_dump를 사용하여 SQL 덤프 수행

클러스터 전체 정보 없이 단일 데이터베이스를 덤프하려면 pg_dump 유틸리티를 사용합니다.

사전 요구 사항

  • 덤프하려는 모든 테이블에 대한 읽기 권한이 있어야 합니다. 전체 데이터베이스를 덤프하려면 postgres superuser 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.

절차

  • 클러스터 전체 정보가 없는 데이터베이스를 덤프합니다.

    $ pg_dump dbname > dumpfile
    Copy to Clipboard Toggle word wrap

    연결할 데이터베이스 서버 pg_dump 를 지정하려면 다음 명령줄 옵션을 사용합니다.

    • 호스트를 정의하는 -h 옵션입니다.

      기본 호스트는 로컬 호스트이거나 PGHOST 환경 변수에 의해 지정된 항목입니다.

    • 포트를 정의하는 -p 옵션입니다.

      기본 포트는 PGPORT 환경 변수 또는 컴파일된 상태로 표시됩니다.

7.4.6.1.3. pg_dumpall을 사용하여 SQL 덤프 수행

지정된 데이터베이스 클러스터에서 각 데이터베이스를 덤프하고 클러스터 전체 데이터를 유지하려면 pg_dumpall 유틸리티를 사용합니다.

사전 요구 사항

  • postgres 슈퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.

프로세스

  • 데이터베이스 클러스터에서 모든 데이터베이스를 덤프하고 클러스터 전체 데이터를 유지합니다.

    $ pg_dumpall > dumpfile
    Copy to Clipboard Toggle word wrap

연결할 데이터베이스 서버 pg_dumpall 을 지정하려면 다음 명령줄 옵션을 사용합니다.

  • 호스트를 정의하는 -h 옵션입니다.

    기본 호스트는 로컬 호스트이거나 PGHOST 환경 변수에 의해 지정된 항목입니다.

  • 포트를 정의하는 -p 옵션입니다.

    기본 포트는 PGPORT 환경 변수 또는 컴파일된 상태로 표시됩니다.

  • 기본 데이터베이스를 정의하는 -l 옵션입니다.

    이 옵션을 사용하면 초기화 중에 자동으로 생성된 postgres 데이터베이스와 다른 기본 데이터베이스를 선택할 수 있습니다.

7.4.6.1.4. pg_dump를 사용하여 덤프된 데이터베이스 복원

pg_dump 유틸리티를 사용하여 덤프한 SQL 덤프에서 데이터베이스를 복원하려면 다음 단계를 따르십시오.

사전 요구 사항

  • postgres 슈퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.

프로세스

  1. 새 데이터베이스를 생성합니다.

    $ createdb dbname
    Copy to Clipboard Toggle word wrap
  2. 개체를 소유하거나 덤프된 데이터베이스의 오브젝트에 대한 권한이 부여된 모든 사용자가 이미 있는지 확인합니다. 이러한 사용자가 존재하지 않는 경우 복원에서 원래 소유권 및 권한으로 오브젝트를 다시 생성하지 못합니다.
  3. psql 유틸리티를 실행하여 pg_dump 유틸리티로 생성된 텍스트 파일 덤프를 복원합니다.

    $ psql dbname < dumpfile
    Copy to Clipboard Toggle word wrap

    여기서 dumpfilepg_dump 명령의 출력입니다. 비 텍스트 파일 덤프를 복원하려면 대신 pg_restore 유틸리티를 사용합니다.

    $ pg_restore non-plain-text-file
    Copy to Clipboard Toggle word wrap
7.4.6.1.5. pg_dumpall을 사용하여 덤프된 데이터베이스 복원

pg_dumpall 유틸리티를 사용하여 덤프한 데이터베이스 클러스터에서 데이터를 복원하려면 다음 단계를 따르십시오.

사전 요구 사항

  • postgres 슈퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.

프로세스

  1. 개체를 소유하거나 덤프된 데이터베이스의 개체에 대한 권한이 부여된 모든 사용자가 있는지 확인합니다. 이러한 사용자가 존재하지 않는 경우 복원에서 원래 소유권 및 권한으로 오브젝트를 다시 생성하지 못합니다.
  2. psql 유틸리티를 실행하여 pg_dumpall 유틸리티에서 생성한 텍스트 파일 덤프를 복원합니다.

    $ psql < dumpfile
    Copy to Clipboard Toggle word wrap

    여기서 dumpfilepg_dumpall 명령의 출력입니다.

7.4.6.1.6. 다른 서버에서 데이터베이스의 SQL 덤프 수행

pg_dumppsql 이 파이프로 직접 작성하고 읽을 수 있기 때문에 데이터베이스를 직접 덤프할 수 있습니다.

프로세스

  • 한 서버에서 다른 서버로 데이터베이스를 덤프하려면 다음을 실행합니다.

    $ pg_dump -h host1 dbname | psql -h host2 dbname
    Copy to Clipboard Toggle word wrap
7.4.6.1.7. 복원 중 SQL 오류 처리

기본적으로 psql 은 SQL 오류가 발생하면 계속 실행되므로 데이터베이스가 부분적으로만 복원됩니다.

기본 동작을 변경하려면 덤프를 복원할 때 다음 방법 중 하나를 사용합니다.

사전 요구 사항

  • postgres 슈퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.

프로세스

  • ON_ERROR_STOP 변수를 설정하여 SQL 오류가 발생하면 종료 상태 3을 사용하여 psql 을 종료합니다.

    $ psql --set ON_ERROR_STOP=on dbname < dumpfile
    Copy to Clipboard Toggle word wrap
  • 복원이 완전히 완료되거나 취소되도록 전체 덤프가 단일 트랜잭션으로 복원되도록 지정합니다.

    • psql 유틸리티를 사용하여 텍스트 파일 덤프를 복원하는 경우:

      $ psql -1
      Copy to Clipboard Toggle word wrap
    • pg_restore 유틸리티를 사용하여 텍스트가 아닌 파일 덤프를 복원하는 경우:

      $ pg_restore -e
      Copy to Clipboard Toggle word wrap

      이 방법을 사용할 때 약간의 오류라도 이미 여러 시간 동안 실행된 복원 작업을 취소할 수 있습니다.

7.4.6.2. 파일 시스템 수준 백업을 사용하여 PostgreSQL 데이터 백업

파일 시스템 수준 백업을 생성하려면 PostgreSQL 데이터베이스 파일을 다른 위치로 복사합니다. 예를 들어 다음 접근 방식 중 하나를 사용할 수 있습니다.

  • tar 유틸리티를 사용하여 아카이브 파일을 생성합니다.
  • rsync 유틸리티를 사용하여 파일을 다른 위치에 복사합니다.
  • 데이터 디렉터리의 일관된 스냅샷을 생성합니다.
7.4.6.2.1. 파일 시스템 백업의 이점 및 제한 사항

파일 시스템 수준 백업은 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.

  • 파일 시스템 수준 백업은 일반적으로 SQL 덤프보다 빠릅니다.

파일 시스템 수준 백업에는 다른 PostgreSQL 백업 방법에 비해 다음과 같은 제한 사항이 있습니다.

  • 이 백업 방법은 RHEL 7에서 RHEL 8로 업그레이드하고 데이터를 업그레이드된 시스템으로 마이그레이션하려는 경우 적합하지 않습니다. 파일 시스템 수준 백업은 아키텍처 및 RHEL 주요 버전에 따라 다릅니다. 업그레이드가 성공하지 못했지만 RHEL 8 시스템에서 데이터를 복원할 수 없는 경우 RHEL 7 시스템에서 데이터를 복원할 수 있습니다.
  • 데이터를 백업하고 복원하기 전에 데이터베이스 서버를 종료해야 합니다.
  • 특정 개별 파일 또는 테이블을 백업하고 복원하는 것은 불가능합니다. 파일 시스템을 백업하는 것은 전체 데이터베이스 클러스터의 전체 백업 및 복원을 위해서만 작동합니다.
7.4.6.2.2. 파일 시스템 수준 백업 수행

파일 시스템 수준 백업을 수행하려면 다음 절차를 사용하십시오.

프로세스

  1. 데이터베이스 클러스터의 위치를 선택하고 이 클러스터를 초기화합니다.

    # postgresql-setup --initdb
    Copy to Clipboard Toggle word wrap
  2. postgresql 서비스를 중지합니다.

    # systemctl stop postgresql.service
    Copy to Clipboard Toggle word wrap
  3. 모든 방법을 사용하여 파일 시스템 백업을 생성합니다(예: tar 아카이브).

    $ tar -cf backup.tar /var/lib/pgsql/data/
    Copy to Clipboard Toggle word wrap
  4. postgresql 서비스를 시작합니다.

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap

7.4.6.3. 연속 보관을 통해 PostgreSQL 데이터 백업

PostgreSQL 은 데이터베이스의 데이터 파일의 모든 변경 사항을 클러스터의 데이터 디렉터리의 pg_wal/ 하위 디렉터리에서 사용할 수 있는 쓰기 로그(WAL) 파일로 기록합니다. 이 로그는 주로 충돌 복구를 위한 것입니다. 충돌 후 마지막 체크포인트 이후 만든 로그 항목을 사용하여 데이터베이스를 일관성으로 복원할 수 있습니다.

온라인 백업이라고도 하는 연속 보관 방법은 WAL 파일을 실행 중인 서버 또는 파일 시스템 수준 백업에서 수행되는 기본 백업의 형태로 데이터베이스 클러스터 복사본과 결합합니다.

데이터베이스 복구가 필요한 경우 데이터베이스 클러스터 복사본에서 데이터베이스를 복원한 다음 백업된 WAL 파일에서 로그를 재생하여 시스템을 현재 상태로 전환할 수 있습니다.

연속 보관 방법을 사용하면 최소 마지막 기본 백업의 시작 시간으로 확장되는 모든 보관된 WAL 파일의 연속 시퀀스를 유지해야 합니다. 따라서 기본 백업의 이상적인 빈도는 다음에 따라 다릅니다.

  • 보관된 WAL 파일에 사용할 수 있는 스토리지 볼륨입니다.
  • 복구가 필요한 경우 가능한 최대 데이터 복구 기간입니다. 마지막 백업 이후 오랜 기간이 있는 경우 시스템은 더 많은 WAL 세그먼트를 재생하므로 복구에 더 많은 시간이 걸립니다.
참고

pg_dumppg_dumpall SQL 덤프를 연속 보관 백업 솔루션의 일부로 사용할 수 없습니다. SQL 덤프는 논리 백업을 생성하고 WAL 재생에서 사용할 수 있는 충분한 정보를 포함하지 않습니다.

7.4.6.3.1. 연속 보관의 이점 및 단점

연속 보관은 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.

  • 연속 백업 방법을 사용하면 로그 재생을 통해 백업의 내부 불일치가 수정되므로 완전히 일관성이 없는 기본 백업을 사용할 수 있습니다. 따라서 실행 중인 PostgreSQL 서버에서 기본 백업을 수행할 수 있습니다.
  • 파일 시스템 스냅샷이 필요하지 않습니다. tar 또는 유사한 아카이브 유틸리티로 충분합니다.
  • 로그 재생에 대한 WAL 파일의 순서가 무기한 길 수 있기 때문에 WAL 파일을 계속 보관하여 연속 백업을 수행할 수 있습니다. 이는 대규모 데이터베이스에 특히 중요합니다.
  • 연속 백업은 지정 시간 복구를 지원합니다. WAL 항목을 끝에 재생할 필요는 없습니다. 재생은 언제든지 중지할 수 있으며 기본 백업이 수행된 이후 언제든지 데이터베이스를 해당 상태로 복원할 수 있습니다.
  • 동일한 기본 백업 파일로 로드된 다른 머신에서 일련의 WAL 파일을 지속적으로 사용할 수 있는 경우 언제든지 데이터베이스 복사본이 거의 최신인 다른 시스템을 복원할 수 있습니다.

연속 보관에는 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 단점이 있습니다.

  • 연속 백업 방법은 하위 집합이 아닌 전체 데이터베이스 클러스터의 복원만 지원합니다.
  • 연속 백업에는 광범위한 아카이브 스토리지가 필요합니다.
7.4.6.3.2. WAL 아카이브 설정

실행 중인 PostgreSQL 서버는 쓰기 전 로그(WAL) 레코드를 생성합니다. 서버는 이 시퀀스를 WAL 세그먼트 파일로 물리적으로 나눕니다. 이 파일은 WAL 시퀀스에서 해당 위치를 반영하는 숫자 이름이 지정됩니다. WAL 보관이 없으면 세그먼트 파일이 재사용되고 더 높은 세그먼트 번호로 이름이 변경됩니다.

WAL 데이터를 저장할 때 각 세그먼트 파일의 내용이 캡처되고 세그먼트 파일을 재사용하기 전에 새 위치에 저장됩니다. NFS 마운트 디렉토리(예: 다른 머신, 보관 드라이브 또는 CD)와 같은 콘텐츠를 저장할 수 있는 여러 옵션이 있습니다.

WAL 레코드에는 구성 파일에 대한 변경 사항이 포함되어 있지 않습니다.

WAL 보관을 활성화하려면 다음 절차를 사용하십시오.

프로세스

  1. /var/lib/pgsql/data/postgresql.conf 파일에서 다음을 수행합니다.

    1. wal_level 구성 매개 변수를 replica 이상으로 설정합니다.
    2. archive_mode 매개변수를 의 설정합니다.
    3. archive_command 구성 매개변수에서 shell 명령을 지정합니다. cp 명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다.

      예를 들면 다음과 같습니다.

      archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
      Copy to Clipboard Toggle word wrap

      여기서 %p 매개변수는 아카이브할 파일의 상대 경로로 교체되고 %f 매개변수는 파일 이름으로 교체됩니다.

      이 명령은 아카이브 가능한 WAL 세그먼트를 /mnt/server/archivedir/ 디렉터리에 복사합니다. %p%f 매개변수를 교체한 후 실행된 명령은 다음과 같습니다.

      test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065
      Copy to Clipboard Toggle word wrap

      보관된 각 새 파일에 대해 유사한 명령이 생성됩니다.

      참고

      archive 명령은 완료된 WAL 세그먼트에서만 실행됩니다. WAL 트래픽을 거의 생성하는 서버는 트랜잭션 완료와 아카이브 스토리지에 안전한 기록 사이에 상당한 지연이 발생할 수 있습니다. 보관되지 않은 오래된 데이터를 저장할 수 있는 방법을 제한하려면 다음을 수행할 수 있습니다.

      • archive_timeout 매개변수를 설정하여 지정된 빈도로 서버가 새 WAL 세그먼트 파일로 전환하도록 합니다.
      • pg_switch_wal 매개 변수를 사용하여 세그먼트 스위치가 완료된 직후 트랜잭션이 보관되도록 강제 적용합니다.
  2. postgresql 서비스를 다시 시작하여 변경 사항을 활성화합니다.

    # systemctl restart postgresql.service
    Copy to Clipboard Toggle word wrap
  3. archive 명령을 테스트하고 기존 파일을 덮어쓰지 않고 실패하는 경우 0이 아닌 종료 상태를 반환하는지 확인합니다.
  4. 데이터를 보호하려면 세그먼트 파일이 그룹 또는 세계 읽기 액세스 권한이 없는 디렉터리에 보관되어야 합니다.
7.4.6.3.3. 기본 백업 만들기

여러 가지 방법으로 기본 백업을 생성할 수 있습니다. 기본 백업을 수행하는 가장 간단한 방법은 실행 중인 PostgreSQL 서버에서 pg_basebackup 유틸리티를 사용하는 것입니다.

기본 백업 프로세스는 WAL 아카이브 영역에 저장되는 백업 기록 파일을 생성하고 기본 백업에 필요한 첫 번째 WAL 세그먼트 파일 뒤에 이름이 지정됩니다.

백업 기록 파일은 시작 및 종료 시간이 포함된 작은 텍스트 파일이며 백업의 WAL 세그먼트입니다. 레이블 문자열을 사용하여 연결된 덤프 파일을 식별하는 경우 백업 기록 파일을 사용하여 복원할 덤프 파일을 결정할 수 있습니다.

참고

데이터를 복구할 수 있도록 여러 백업 세트를 유지하는 것이 좋습니다.

사전 요구 사항

  • postgres 슈퍼유저, 데이터베이스 관리자 권한이 있는 사용자 또는 REPLICATION 권한이 있는 다른 사용자로 명령을 실행해야 합니다.
  • 기본 백업 중 및 이후에 생성된 모든 WAL 세그먼트 파일을 보관해야 합니다.

프로세스

  1. pg_basebackup 유틸리티를 사용하여 기본 백업을 수행합니다.

    • 개별 파일로 기본 백업을 생성하려면 다음을 수행합니다.

      $ pg_basebackup -D backup_directory -Fp
      Copy to Clipboard Toggle word wrap

      backup_directory 를 선택한 백업 위치로 바꿉니다.

      tablespaces를 사용하고 서버와 동일한 호스트에서 기본 백업을 수행하는 경우 --tablespace-mapping 옵션도 사용해야 합니다. 그렇지 않으면 백업을 동일한 위치에 작성하려고 할 때 백업이 실패합니다.

    • 기본 백업을 tar 아카이브(tar 및 압축 형식)로 만들려면 다음을 수행합니다.

      $ pg_basebackup -D backup_directory -Ft -z
      Copy to Clipboard Toggle word wrap

      backup_directory 를 선택한 백업 위치로 바꿉니다.

      이러한 데이터를 복원하려면 올바른 위치에 파일을 수동으로 추출해야 합니다.

    연결할 데이터베이스 서버 pg_basebackup 을 지정하려면 다음 명령줄 옵션을 사용합니다.

    • 호스트를 정의하는 -h 옵션입니다.

      기본 호스트는 로컬 호스트 또는 PGHOST 환경 변수에 의해 지정된 호스트입니다.

    • 포트를 정의하는 -p 옵션입니다.

      기본 포트는 PGPORT 환경 변수 또는 컴파일된 상태로 표시됩니다.

  2. 기본 백업 프로세스가 완료되면 백업 기록 파일에 지정된 백업 중에 사용되는 데이터베이스 클러스터 및 WAL 세그먼트 파일의 복사본을 안전하게 보관합니다.
  3. 기본 백업보다 오래되고 복원에 더 이상 필요하지 않기 때문에 기본 백업에 사용되는 WAL 세그먼트 파일보다 숫자적으로 낮은 WAL 세그먼트를 삭제합니다.
7.4.6.3.4. 연속 아카이브 백업을 사용하여 데이터베이스 복원

연속 백업을 사용하여 데이터베이스를 복원하려면 다음 절차를 사용하십시오.

프로세스

  1. 서버를 중지합니다.

    # systemctl stop postgresql.service
    Copy to Clipboard Toggle word wrap
  2. 필요한 데이터를 임시 위치에 복사합니다.

    전체 클러스터 데이터 디렉터리 및 모든 테이블 공간을 복사하는 것이 좋습니다. 이를 위해서는 시스템에 기존 데이터베이스의 두 복사본을 저장할 수 있는 충분한 여유 공간이 필요합니다.

    공간이 충분하지 않은 경우 시스템이 중단되기 전에 보관되지 않은 로그를 포함할 수 있는 클러스터의 pg_wal 디렉터리의 내용을 저장합니다.

  3. 클러스터 데이터 디렉터리 및 사용 중인 테이블 공간의 루트 디렉터리 아래에 있는 기존 파일 및 하위 디렉터리를 모두 제거합니다.
  4. 기본 백업에서 데이터베이스 파일을 복원합니다.

    다음을 확인하십시오.

    • 파일이 올바른 소유권( root가 아닌 데이터베이스 시스템 사용자)으로 복원됩니다.
    • 파일이 올바른 권한으로 복원됩니다.
    • pg_tblspc/ 하위 디렉터리의 심볼릭 링크가 올바르게 복원됩니다.
  5. pg_wal/ 하위 디렉터리에 있는 모든 파일을 제거합니다.

    이러한 파일은 기본 백업에서 생성되었으므로 사용되지 않습니다. pg_wal/ 을 보관하지 않은 경우 적절한 권한으로 다시 생성합니다.

  6. 2단계에서 저장한 모든 보관되지 않은 WAL 세그먼트 파일을 pg_wal/ 로 복사합니다.
  7. 클러스터 데이터 디렉터리에 recovery.conf 복구 명령 파일을 생성하고 restore_command 구성 매개 변수에 shell 명령을 지정합니다. cp 명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

    restore_command = 'cp /mnt/server/archivedir/%f "%p"'
    Copy to Clipboard Toggle word wrap
  8. 서버를 시작합니다.

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap

    서버는 복구 모드로 전환되고 필요한 아카이브된 WAL 파일을 읽습니다.

    외부 오류로 인해 복구가 종료되면 서버를 다시 시작할 수 있으며 복구를 계속합니다. 복구 프로세스가 완료되면 서버는 recovery.conf 의 이름을 recovery.done 로 바꿉니다. 이렇게 하면 일반적인 데이터베이스 작업을 시작한 후 서버가 실수로 복구 모드로 다시 입력되지 않습니다.

  9. 데이터베이스 내용을 확인하여 데이터베이스가 필요한 상태로 복구되었는지 확인합니다.

    데이터베이스가 required 상태로 복구되지 않은 경우 1 단계로 돌아갑니다. 데이터베이스가 필수 상태로 복구된 경우 pg_hba.conf 파일에서 클라이언트 인증 구성을 복원하여 사용자가 연결할 수 있도록 합니다.

7.4.7. RHEL 8 버전의 PostgreSQL으로 마이그레이션

Red Hat Enterprise Linux 7에는 PostgreSQL 서버의 기본 버전으로 PostgreSQL 9.2 가 포함되어 있습니다. 또한 여러 버전의 PostgreSQL 이 RHEL 7용 Software Collections로 제공됩니다.

Red Hat Enterprise Linux 8은 PostgreSQL 10 을 기본 postgresql 스트림, PostgreSQL 9.6,PostgreSQL 12,PostgreSQL 13,PostgreSQL 15PostgreSQL 16 으로 제공합니다.

Red Hat Enterprise Linux에서 PostgreSQL 사용자는 데이터베이스 파일에 두 가지 마이그레이션 경로를 사용할 수 있습니다.

빠른 업그레이드 방법은 덤프 및 복원 프로세스보다 빠릅니다. 그러나 특정 경우에는 빠른 업그레이드가 작동하지 않으며 덤프 및 복원 프로세스만 사용할 수 있습니다. 이러한 경우는 다음과 같습니다.

  • 아키텍처 간 업그레이드
  • plpython 또는 plpython2 확장을 사용하는 시스템 RHEL 8 AppStream 리포지토리에는 postgresql-plpython2 패키지가 아닌 postgresql-plpython3 패키지만 포함됩니다.
  • Red Hat Software Collections 버전의 PostgreSQL 에서 마이그레이션하는 경우 빠른 업그레이드가 지원되지 않습니다.

이후 버전의 PostgreSQL 으로 마이그레이션하기 위한 사전 요구 사항으로 모든 PostgreSQL 데이터베이스를 백업하십시오.

데이터베이스를 덤프하고 SQL 파일의 백업을 수행하는 것은 덤프 및 복원 프로세스에 필요하며 빠른 업그레이드 방법에 권장됩니다.

최신 버전의 PostgreSQL 으로 마이그레이션하기 전에 마이그레이션하려는 PostgreSQL 버전과 대상 버전 및 대상 버전 간의 모든 건너뛰는 PostgreSQL 버전에 대한 업스트림 호환성 노트 를 참조하십시오.

7.4.7.1. PostgreSQL 15와 PostgreSQL 16의 주요 차이점

PostgreSQL 16 에서는 다음과 같은 주요 변경 사항이 추가되었습니다.

postmasters 바이너리는 더 이상 사용할 수 없습니다.

PostgreSQL 은 더 이상 postmaster 바이너리와 함께 배포되지 않습니다. 제공된 systemd 장치 파일( systemctl start postgres.service 명령)을 사용하여 postgresql 서버를 시작하는 사용자는 이 변경의 영향을 받지 않습니다. 이전에 postmaster 바이너리를 통해 postgresql 서버를 직접 시작한 경우 대신 postgres 바이너리를 사용해야 합니다.

문서가 더 이상 패키지되지 않음

PostgreSQL 은 더 이상 패키지 내에서 PDF 형식으로 문서를 제공하지 않습니다. 대신 온라인 문서를 사용하십시오.

7.4.7.2. PostgreSQL 13과 PostgreSQL 15의 주요 차이점

PostgreSQL 15 에서는 다음과 같은 호환되지 않는 변경 사항이 도입되었습니다.

공용 스키마의 기본 권한

공용 스키마의 기본 권한은 PostgreSQL 15 에서 수정되었습니다. 새로 생성된 사용자는 GRANT ALL ON SCHEMA 공용 TO myuser; 명령을 사용하여 명시적으로 권한을 부여해야 합니다.

다음 예제는 PostgreSQL 13 및 이전 버전에서 작동합니다.

postgres=# CREATE USER mydbuser;
postgres=# \c postgres mydbuser
postgres=$ CREATE TABLE mytable (id int);
Copy to Clipboard Toggle word wrap

다음 예제는 PostgreSQL 15 이상에서 작동합니다.

postgres=# CREATE USER mydbuser;
postgres=# GRANT ALL ON SCHEMA public TO mydbuser;
postgres=# \c postgres mydbuser
postgres=$ CREATE TABLE mytable (id int);
Copy to Clipboard Toggle word wrap
참고

mydbuser 액세스가 pg_hba.conf 파일에 적절하게 구성되었는지 확인합니다. 자세한 내용은 PostgreSQL 사용자 생성 을 참조하십시오.

파이프라인 모드에서 PQsendQuery() 가 더 이상 지원되지 않음

PostgreSQL 15 이므로 libpq 라이브러리 PQsendQuery() 함수는 더 이상 파이프라인 모드에서 지원되지 않습니다. PQsendQueryParams() 함수를 대신 사용하도록 영향을 받는 애플리케이션을 수정합니다.

7.4.7.3. pg_upgrade 유틸리티를 사용하여 빠른 업그레이드

빠른 업그레이드 중에 바이너리 데이터 파일을 /var/lib/pgsql/data/ 디렉터리에 복사하고 pg_upgrade 유틸리티를 사용해야 합니다.

이 방법을 사용하여 데이터를 마이그레이션할 수 있습니다.

  • PostgreSQL 9.2 의 RHEL 7 시스템 버전에서 PostgreSQL 10의 RHEL 8 버전
  • PostgreSQL 10 의 RHEL 8 버전에서 RHEL 버전 PostgreSQL 12
  • RHEL 8 버전의 PostgreSQL 12 에서 RHEL 버전의 PostgreSQL 13으로
  • RHEL 버전의 PostgreSQL 13 에서 RHEL 버전의 PostgreSQL 15
  • RHEL 버전의 PostgreSQL 15 에서 RHEL 버전의 PostgreSQL 16으로

RHEL 8 내의 이전 postgresql 스트림에서 업그레이드하려면 이후 스트림으로 전환에 설명된 절차를 수행한 다음 PostgreSQL 데이터를 마이그레이션합니다.

RHEL 내의 다른 PostgreSQL 버전 조합과 Red Hat Software Collections 버전에서 RHEL로 마이그레이션하는 경우 Dump 및 restore upgrade 를 사용합니다.

다음 절차에서는 빠른 업그레이드 방법을 사용하여 RHEL 7 시스템 버전에서 PostgreSQL 9.2 의 RHEL 8 버전으로의 마이그레이션을 설명합니다.

사전 요구 사항

  • 업그레이드를 수행하기 전에 PostgreSQL 데이터베이스에 저장된 모든 데이터를 백업하십시오. 기본적으로 모든 데이터는 RHEL 7 및 RHEL 8 시스템의 /var/lib/pgsql/data/ 디렉터리에 저장됩니다.

프로세스

  1. RHEL 8 시스템에서 마이그레이션할 스트림(버전)을 활성화합니다.

    # yum module enable postgresql:stream
    Copy to Clipboard Toggle word wrap

    stream 을 선택한 PostgreSQL 서버의 버전으로 교체합니다.

    PostgreSQL 10 을 제공하는 기본 스트림을 사용하려면 이 단계를 생략할 수 있습니다.

  2. RHEL 8 시스템에서 postgresql-serverpostgresql-upgrade 패키지를 설치합니다.

    # yum install postgresql-server postgresql-upgrade
    Copy to Clipboard Toggle word wrap

    선택적으로 RHEL 7에서 PostgreSQL 서버 모듈을 사용한 경우 PostgreSQL 9.2 ( postgresql-upgrade 패키지로 설치됨) 및 대상 버전( postgresql-server 패키지로 설치됨)에 대해 컴파일된 두 버전의 RHEL 8 시스템에도 설치합니다. 타사 PostgreSQL 서버 모듈을 컴파일해야 하는 경우 postgresql-develpostgresql-upgrade-devel 패키지에 대해 둘 다 빌드합니다.

  3. 다음 항목을 확인합니다.

    • 기본 구성: RHEL 8 시스템에서 서버가 기본 /var/lib/pgsql/data 디렉토리를 사용하고 데이터베이스가 올바르게 초기화되고 활성화되어 있는지 확인합니다. 또한 데이터 파일은 /usr/lib/systemd/system/postgresql.service 파일에 언급된 것과 동일한 경로에 저장해야 합니다.
    • PostgreSQL servers: 시스템은 여러 PostgreSQL 서버를 실행할 수 있습니다. 이러한 모든 서버의 데이터 디렉토리가 독립적으로 처리되었는지 확인합니다.
    • PostgreSQL 서버 모듈: RHEL 7에서 사용한 PostgreSQL 서버 모듈도 RHEL 8 시스템에 설치되어 있는지 확인합니다. 플러그인은 /usr/lib64/pgsql/ 디렉터리에 설치됩니다(또는 32비트 시스템의 /usr/lib/pgsql/ 디렉토리에).
  4. 데이터를 복사할 때 postgresql 서비스가 소스 및 대상 시스템에서 실행되지 않는지 확인합니다.

    # systemctl stop postgresql.service
    Copy to Clipboard Toggle word wrap
  5. 소스 위치의 데이터베이스 파일을 RHEL 8 시스템의 /var/lib/pgsql/data/ 디렉터리에 복사합니다.
  6. PostgreSQL 사용자로 다음 명령을 실행하여 업그레이드 프로세스를 수행합니다.

    # postgresql-setup --upgrade
    Copy to Clipboard Toggle word wrap

    그러면 백그라운드에서 pg_upgrade 프로세스가 시작됩니다.

    실패하는 경우 postgresql-setup 은 정보 오류 메시지를 제공합니다.

  7. /var/lib/pgsql/data-old 의 이전 구성을 새 클러스터로 복사합니다.

    빠른 업그레이드는 최신 데이터 스택의 이전 구성을 재사용하지 않으며 구성이 처음부터 생성됩니다. 이전 구성과 새 구성을 수동으로 결합하려면 데이터 디렉터리의 *.conf 파일을 사용합니다.

  8. PostgreSQL 서버를 시작합니다.

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
  9. 새 데이터베이스 클러스터를 분석합니다.

    • PostgreSQL 13 또는 이전 버전의 경우:

      su postgres -c '~/analyze_new_cluster.sh'
      Copy to Clipboard Toggle word wrap
    • PostgreSQL 15 이상의 경우:

      su postgres -c 'vacuumdb --all --analyze-in-stages'
      Copy to Clipboard Toggle word wrap
      참고

      REFRESH VERSION을 사용해야 할 수도 있습니다. 자세한 내용은 업스트림 문서를 참조하십시오.

  10. 부팅 시 새 PostgreSQL 서버를 자동으로 시작하려면 다음을 실행합니다.

    # systemctl enable postgresql.service
    Copy to Clipboard Toggle word wrap

7.4.7.4. 업그레이드 덤프 및 복원

덤프 및 복원 업그레이드를 사용하는 경우 모든 데이터베이스 내용을 SQL 파일 덤프 파일로 덤프해야 합니다.

덤프 및 복원 업그레이드는 빠른 업그레이드 방법보다 느리고 생성된 SQL 파일에 수동 수정이 필요할 수 있습니다.

이 방법을 사용하여 데이터를 마이그레이션할 수 있습니다.

  • Red Hat Enterprise Linux 7 시스템 버전의 PostgreSQL 9.2
  • 이전 Red Hat Enterprise Linux 8 버전의 PostgreSQL
  • Red Hat Software Collections의 이전 버전 또는 동일한 버전의 PostgreSQL:

    • PostgreSQL 9.2 (더 이상 지원되지 않음)
    • PostgreSQL 9.4 (더 이상 지원되지 않음)
    • PostgreSQL 9.6 (더 이상 지원되지 않음)
    • PostgreSQL 10
    • PostgreSQL 12
    • PostgreSQL 13

RHEL 7 및 RHEL 8 시스템에서 PostgreSQL 데이터는 기본적으로 /var/lib/pgsql/data/ 디렉터리에 저장됩니다. PostgreSQL 의 Red Hat Software Collections 버전의 경우 기본 데이터 디렉터리는 /var/opt/rh/collection_name/lib/pgsql/data/ data/입니다(/ opt/rh/ postgresql92 /postgresql92/var/lib/pgsql/data/ 디렉터리를 사용하는 postgresql92 제외).

RHEL 8 내의 이전 postgresql 스트림에서 업그레이드하려면 이후 스트림으로 전환에 설명된 절차를 수행한 다음 PostgreSQL 데이터를 마이그레이션합니다.

덤프 및 복원 업그레이드를 수행하려면 사용자를 root 로 변경합니다.

다음 절차에서는 RHEL 7 시스템 버전의 PostgreSQL 9.2 에서 RHEL 8 버전의 PostgreSQL 으로 마이그레이션하는 방법을 설명합니다.

프로세스

  1. RHEL 7 시스템에서 PostgreSQL 9.2 서버를 시작합니다.

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
  2. RHEL 7 시스템에서 모든 데이터베이스 콘텐츠를 pgdump_file.sql 파일에 덤프합니다.

    su - postgres -c "pg_dumpall > ~/pgdump_file.sql"
    Copy to Clipboard Toggle word wrap
  3. 데이터베이스가 올바르게 덤프되었는지 확인합니다.

    su - postgres -c 'less "$HOME/pgdump_file.sql"'
    Copy to Clipboard Toggle word wrap

    그 결과 덤프된 sql 파일의 경로가 표시됩니다. /var/lib/pgsql/pgdump_file.sql.

  4. RHEL 8 시스템에서 마이그레이션할 스트림(버전)을 활성화합니다.

    # yum module enable postgresql:stream
    Copy to Clipboard Toggle word wrap

    stream 을 선택한 PostgreSQL 서버의 버전으로 교체합니다.

    PostgreSQL 10 을 제공하는 기본 스트림을 사용하려면 이 단계를 생략할 수 있습니다.

  5. RHEL 8 시스템에서 postgresql-server 패키지를 설치합니다.

    # yum install postgresql-server
    Copy to Clipboard Toggle word wrap

    RHEL 7에서 PostgreSQL 서버 모듈을 사용한 경우 RHEL 8 시스템에도 설치합니다. 타사 PostgreSQL 서버 모듈을 컴파일해야 하는 경우 postgresql-devel 패키지에 대해 빌드합니다.

  6. RHEL 8 시스템에서 새 PostgreSQL 서버의 데이터 디렉터리를 초기화합니다.

    # postgresql-setup --initdb
    Copy to Clipboard Toggle word wrap
  7. RHEL 8 시스템에서 pgdump_file.sqlPostgreSQL 홈 디렉터리에 복사하고 파일이 올바르게 복사되었는지 확인합니다.

    su - postgres -c 'test -e "$HOME/pgdump_file.sql" && echo exists'
    Copy to Clipboard Toggle word wrap
  8. RHEL 7 시스템에서 구성 파일을 복사합니다.

    su - postgres -c 'ls -1 $PGDATA/*.conf'
    Copy to Clipboard Toggle word wrap

    복사할 구성 파일은 다음과 같습니다.

    • /var/lib/pgsql/data/pg_hba.conf
    • /var/lib/pgsql/data/pg_ident.conf
    • /var/lib/pgsql/data/postgresql.conf
  9. RHEL 8 시스템에서 새 PostgreSQL 서버를 시작합니다.

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
  10. RHEL 8 시스템에서 덤프된 sql 파일에서 데이터를 가져옵니다.

    su - postgres -c 'psql -f ~/pgdump_file.sql postgres'
    Copy to Clipboard Toggle word wrap
참고

Red Hat Software Collections 버전의 PostgreSQL 에서 업그레이드할 때 scl enable collection_name을 포함하도록 명령을 조정합니다. 예를 들어 rh-postgresql96 소프트웨어 컬렉션에서 데이터를 덤프하려면 다음 명령을 사용합니다.

su - postgres -c 'scl enable rh-postgresql96 "pg_dumpall > ~/pgdump_file.sql"'
Copy to Clipboard Toggle word wrap

postgresql RHEL 시스템 역할을 사용하여 PostgreSQL 데이터베이스 서버의 설치 및 관리를 자동화할 수 있습니다. 기본적으로 이 역할은 PostgreSQL 서비스 구성 파일에서 성능 관련 설정을 자동으로 구성하여 PostgreSQL을 최적화합니다.

애플리케이션에 PostgreSQL 데이터베이스 서버가 필요한 경우 이 서비스를 TLS 암호화로 구성하여 애플리케이션과 데이터베이스 간에 보안 통신을 활성화할 수 있습니다. postgresql RHEL 시스템 역할을 사용하면 이 프로세스를 자동화하고 TLS 암호화를 사용하여 PostgreSQL을 원격으로 설치하고 구성할 수 있습니다. 플레이북에서 기존 개인 키와 CA(인증 기관)에서 발급한 TLS 인증서를 사용할 수 있습니다.

참고

postgresql 역할은 firewalld 서비스에서 포트를 열 수 없습니다. PostgreSQL 서버에 대한 원격 액세스를 허용하려면 방화벽 RHEL 시스템 역할을 사용하는 작업을 플레이북에 추가합니다.

사전 요구 사항

  • 컨트롤 노드 및 관리형 노드를 준비했습니다.
  • 관리 노드에서 플레이북을 실행할 수 있는 사용자로 제어 노드에 로그인되어 있습니다.
  • 관리 노드에 연결하는 데 사용하는 계정에는 sudo 권한이 있습니다.
  • 관리 노드의 개인 키와 인증서 모두 다음 파일의 제어 노드에 저장됩니다.

    • 개인 키: ~/ &lt;FQDN_of_the_managed_node>.key
    • 인증서: ~/ &lt;FQDN_of_the_managed_node>.crt

프로세스

  1. 중요한 변수를 암호화된 파일에 저장합니다.

    1. 자격 증명 모음을 생성합니다.

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create 명령이 편집기를 열고 < key > : < value > 형식으로 중요한 데이터를 입력합니다.

      pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 변경 사항을 저장하고 편집기를 종료합니다. Ansible은 자격 증명 모음의 데이터를 암호화합니다.
  2. 다음 콘텐츠를 사용하여 플레이북 파일(예: ~/playbook.yml )을 생성합니다.

    ---
    - name: Installing and configuring PostgreSQL
      hosts: managed-node-01.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Create directory for TLS certificate and key
          ansible.builtin.file:
            path: /etc/postgresql/
            state: directory
            mode: 755
    
        - name: Copy CA certificate
          ansible.builtin.copy:
            src: "~/{{ inventory_hostname }}.crt"
            dest: "/etc/postgresql/server.crt"
    
        - name: Copy private key
          ansible.builtin.copy:
            src: "~/{{ inventory_hostname }}.key"
            dest: "/etc/postgresql/server.key"
            mode: 0600
    
        - name: PostgreSQL with an existing private key and certificate
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.postgresql
          vars:
            postgresql_version: "16"
            postgresql_password: "{{ pwd }}"
            postgresql_ssl_enable: true
            postgresql_cert_name: "/etc/postgresql/server"
            postgresql_server_conf:
              listen_addresses: "'*'"
              password_encryption: scram-sha-256
            postgresql_pg_hba_conf:
              - type: local
                database: all
                user: all
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '127.0.0.1/32'
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '::1/128'
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '192.0.2.0/24'
                auth_method: scram-sha-256
    
    
        - name: Open the PostgresQL port in firewalld
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.firewall
          vars:
            firewall:
              - service: postgresql
                state: enabled
    Copy to Clipboard Toggle word wrap

    예제 플레이북에 지정된 설정은 다음과 같습니다.

    postgresql_version: <version>

    설치할 PostgreSQL 버전을 설정합니다. 설정할 수 있는 버전은 관리 노드에서 실행되는 Red Hat Enterprise Linux에서 사용할 수 있는 PostgreSQL 버전에 따라 다릅니다.

    postgresql_version 변수를 변경하고 플레이북을 다시 실행하여 PostgreSQL을 업그레이드하거나 다운그레이드할 수 없습니다.

    postgresql_password: <password>

    postgres 데이터베이스 슈퍼유저의 암호를 설정합니다.

    postgresql_password 변수를 변경하고 플레이북을 다시 실행하여 암호를 변경할 수 없습니다.

    postgresql_cert_name: <private_key_and_certificate_file>

    .crt 및 키 접미사 없이 관리 노드의 인증서 및 개인 키의 경로와 기본 이름을 정의합니다. PostgreSQL 구성 중에 역할은 이러한 파일을 참조하는 /var/lib/pgsql/data/ 디렉터리에 심볼릭 링크를 생성합니다.

    인증서 및 개인 키는 관리 노드에 로컬로 존재해야 합니다. ansible.builtin.copy 모듈과 함께 작업을 사용하여 플레이북에 표시된 대로 제어 노드에서 관리 노드로 파일을 전송할 수 있습니다.

    postgresql_server_conf: <list_of_settings>

    역할이 설정해야 하는 postgresql.conf 설정을 정의합니다. 역할은 이러한 설정을 /etc/postgresql/system-roles.conf 파일에 추가하고 /var/lib/pgsql/data/postgresql.conf 끝에 이 파일을 포함합니다. 결과적으로 postgresql_server_conf 변수의 설정은 /var/lib/pgsql/data/postgresql.conf 의 설정을 재정의합니다.

    postgresql_server_conf 의 다른 설정으로 플레이북을 다시 실행하면 /etc/postgresql/system-roles.conf 파일을 새 설정으로 덮어씁니다.

    postgresql_pg_hba_conf: <list_of_authentication_entries>

    /var/lib/pgsql/data/pg_hba.conf 파일에서 클라이언트 인증 항목을 구성합니다. 자세한 내용은 PostgreSQL 설명서를 참조하십시오.

    이 예제에서는 PostgreSQL에 다음과 같은 연결을 허용합니다.

    • 로컬 UNIX 도메인 소켓을 사용하여 암호화되지 않은 연결입니다.
    • IPv4 및 IPv6 localhost 주소에 대한 TLS 암호화 연결
    • 192.0.2.0/24 서브넷의 TLS 암호화 연결 원격 주소의 액세스는 postgresql_server_conf 변수에서 listen_addresses 설정도 적절하게 구성하는 경우에만 가능합니다.

    postgresql_pg_hba_conf 의 다른 설정으로 플레이북을 다시 실행하면 새 설정으로 /var/lib/pgsql/data/pg_hba.conf 파일을 덮어씁니다.

    플레이북에 사용되는 모든 변수에 대한 자세한 내용은 제어 노드의 /usr/share/ansible/roles/rhel-system-roles.postgresql/README.md 파일을 참조하십시오.

  3. 플레이북 구문을 확인합니다.

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    이 명령은 구문만 검증하고 잘못되었지만 유효한 구성으로부터 보호하지 않습니다.

  4. Playbook을 실행합니다.

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

검증

  • postgres 슈퍼 사용자를 사용하여 PostgreSQL 서버에 연결하고 \conninfo meta 명령을 실행합니다.

    # psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo'
    Password for user postgres:
    You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432".
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
    Copy to Clipboard Toggle word wrap

    출력에 TLS 프로토콜 버전 및 암호 세부 정보가 표시되면 연결이 작동하고 TLS 암호화가 활성화됩니다.

애플리케이션에 PostgreSQL 데이터베이스 서버가 필요한 경우 애플리케이션과 데이터베이스 간에 보안 통신을 사용하도록 PostgreSQL 서비스를 TLS 암호화로 구성할 수 있습니다. PostgreSQL 호스트가 Red Hat Enterprise Linux IdM(Identity Management) 도메인의 멤버인 경우 certmonger 서비스에서 인증서 요청 및 향후 갱신을 관리할 수 있습니다.

postgresql RHEL 시스템 역할을 사용하면 이 프로세스를 자동화할 수 있습니다. TLS 암호화를 사용하여 PostgreSQL을 원격으로 설치하고 구성할 수 있으며 postgresql 역할은 인증서 RHEL 시스템 역할을 사용하여 certmonger 를 구성하고 IdM에서 인증서를 요청합니다.

참고

postgresql 역할은 firewalld 서비스에서 포트를 열 수 없습니다. PostgreSQL 서버에 대한 원격 액세스를 허용하려면 방화벽 RHEL 시스템 역할을 사용하는 플레이북에 작업을 추가합니다.

사전 요구 사항

  • 컨트롤 노드 및 관리형 노드를 준비했습니다.
  • 관리 노드에서 플레이북을 실행할 수 있는 사용자로 제어 노드에 로그인되어 있습니다.
  • 관리 노드에 연결하는 데 사용하는 계정에는 sudo 권한이 있습니다.
  • IdM 도메인에 관리형 노드를 등록하셨습니다.

프로세스

  1. 중요한 변수를 암호화된 파일에 저장합니다.

    1. 자격 증명 모음을 생성합니다.

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create 명령이 편집기를 열고 < key > : < value > 형식으로 중요한 데이터를 입력합니다.

      pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 변경 사항을 저장하고 편집기를 종료합니다. Ansible은 자격 증명 모음의 데이터를 암호화합니다.
  2. 다음 콘텐츠를 사용하여 플레이북 파일(예: ~/playbook.yml )을 생성합니다.

    ---
    - name: Installing and configuring PostgreSQL
      hosts: managed-node-01.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: PostgreSQL with certificates issued by IdM
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.postgresql
          vars:
            postgresql_version: "16"
            postgresql_password: "{{ pwd }}"
            postgresql_ssl_enable: true
            postgresql_certificates:
              - name: postgresql_cert
                dns: "{{ inventory_hostname }}"
                ca: ipa
                principal: "postgresql/{{ inventory_hostname }}@EXAMPLE.COM"
            postgresql_server_conf:
              listen_addresses: "'*'"
              password_encryption: scram-sha-256
            postgresql_pg_hba_conf:
              - type: local
                database: all
                user: all
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '127.0.0.1/32'
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '::1/128'
                auth_method: scram-sha-256
              - type: hostssl
                database: all
                user: all
                address: '192.0.2.0/24'
                auth_method: scram-sha-256
    
    
        - name: Open the PostgresQL port in firewalld
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.firewall
          vars:
            firewall:
              - service: postgresql
                state: enabled
    Copy to Clipboard Toggle word wrap

    예제 플레이북에 지정된 설정은 다음과 같습니다.

    postgresql_version: <version>

    설치할 PostgreSQL 버전을 설정합니다. 설정할 수 있는 버전은 관리 노드에서 실행되는 Red Hat Enterprise Linux에서 사용할 수 있는 PostgreSQL 버전에 따라 다릅니다.

    postgresql_version 변수를 변경하고 플레이북을 다시 실행하여 PostgreSQL을 업그레이드하거나 다운그레이드할 수 없습니다.

    postgresql_password: <password>

    postgres 데이터베이스 슈퍼유저의 암호를 설정합니다.

    postgresql_password 변수를 변경하고 플레이북을 다시 실행하여 암호를 변경할 수 없습니다.

    postgresql_certificates: <certificate_role_settings>
    인증서 역할의 설정이 포함된 YAML 사전 목록입니다.
    postgresql_server_conf: <list_of_settings>

    역할을 설정할 postgresql.conf 설정을 정의합니다. 역할은 이러한 설정을 /etc/postgresql/system-roles.conf 파일에 추가하고 /var/lib/pgsql/data/postgresql.conf 끝에 이 파일을 포함합니다. 결과적으로 postgresql_server_conf 변수의 설정은 /var/lib/pgsql/data/postgresql.conf 의 설정을 재정의합니다.

    postgresql_server_conf 의 다른 설정으로 플레이북을 다시 실행하면 /etc/postgresql/system-roles.conf 파일을 새 설정으로 덮어씁니다.

    postgresql_pg_hba_conf: <list_of_authentication_entries>

    /var/lib/pgsql/data/pg_hba.conf 파일에서 클라이언트 인증 항목을 구성합니다. 자세한 내용은 PostgreSQL 설명서를 참조하십시오.

    이 예제에서는 PostgreSQL에 다음과 같은 연결을 허용합니다.

    • 로컬 UNIX 도메인 소켓을 사용하여 암호화되지 않은 연결입니다.
    • IPv4 및 IPv6 localhost 주소에 대한 TLS 암호화 연결
    • 192.0.2.0/24 서브넷의 TLS 암호화 연결 원격 주소의 액세스는 postgresql_server_conf 변수에서 listen_addresses 설정도 적절하게 구성하는 경우에만 가능합니다.

    postgresql_pg_hba_conf 의 다른 설정으로 플레이북을 다시 실행하면 새 설정으로 /var/lib/pgsql/data/pg_hba.conf 파일을 덮어씁니다.

    플레이북에 사용되는 모든 변수에 대한 자세한 내용은 제어 노드의 /usr/share/ansible/roles/rhel-system-roles.postgresql/README.md 파일을 참조하십시오.

  3. 플레이북 구문을 확인합니다.

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    이 명령은 구문만 검증하고 잘못되었지만 유효한 구성으로부터 보호하지 않습니다.

  4. Playbook을 실행합니다.

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

검증

  • postgres 슈퍼 사용자를 사용하여 PostgreSQL 서버에 연결하고 \conninfo meta 명령을 실행합니다.

    # psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo'
    Password for user postgres:
    You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432".
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
    Copy to Clipboard Toggle word wrap

    출력에 TLS 프로토콜 버전 및 암호 세부 정보가 표시되면 연결이 작동하고 TLS 암호화가 활성화됩니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat