19.1. 매개 변수 설정

19.1.1. 매개 변수 이름 및 값
19.1.2. 환경 설정 파일을 통한 매개 변수 인터랙션
19.1.3. SQL을 통한 매개 변수 인터랙션
19.1.4. 쉘을 통한 매개 변수 인터랙션
19.1.5. 환경 설정 파일 내용 관리

19.1.1. 매개 변수 이름 및 값

모든 매개 변수 이름은 대소문자를 구분한다. 각 매개 변수 값은 boolean, string, integer, floating point 또는 enumerated(enum)의 5가지 타입 중 하나이다. 데이터 타입은 매개 변수 설정을 위한 구문을 설정한다.

  • Boolean: on, off, true, false, yes, no, 1, 0 (대소문자 구문 안함) 또는 이들 중 하나의 모호하지 않은 접두사 아무거나 값을 설정할 수 있다.

  • String: 일반적으로 앞뒤에 작은따옴표가 표시되며, 값 내에서는 작은따옴표가 겹쳐서 사용된다. 값이 보통 단순한 숫자 또는 식별자일 경우에는 따옴표를 생략할 수 있다. (값이 SQL 키워드인 경우 몇 문맥에서는 작은 따옴표가 필요할 수도 있다.)

  • Numeric (integer and floating point): Numeric parameters can be specified in the customary integer and floating-point formats; fractional values are rounded to the nearest integer if the parameter is of integer type. Integer parameters additionally accept hexadecimal input (beginning with 0x) and octal input (beginning with 0), but these formats cannot have a fraction. Do not use thousands separators. Quotes are not required, except for hexadecimal input.

  • Numeric with Unit: 일부 숫자 매개 변수는 메모리 또는 시간을 설명하므로 암시적 단위를 갖고 있다. 단위는 바이트, 킬로바이트, 블록(보통 8킬로바이트), 밀리초, 초 또는 분일 수 있다. 이러한 설정들 중 단위가 없는 숫자 값은 설정의 기본 단위를 사용하는 데, pg_settings.unit에서 확인할 수 있다. 편의상, 설정은 명시적으로 지정된 단위를 지정할 수 있다. 예를 들면, 시간 값이 '120 ms'인 경우, 매개 변수의 실제 단위가 무엇이든 변환 된다. 이 기능을 사용하려면 값을 string(따옴표 포함)으로 작성해야 한다는 점에 유의하라. 단위 이름은 대소문자를 구분하며, 숫자 값과 단위 사이에 공백이 올 수 있다.

    • 유효 메모리 단위는 B (바이트), kB(킬로바이트), MB(메가바이트), GB(기가바이트) 및 TB(테라바이트)이다. 메모리 단위의 승수는 1000이 아니라 1024이다.

    • 유효 시간 단위는 us (microseconds), ms(밀리초), s(초), min(분), h(시) 및 d(일)이다.

    If a fractional value is specified with a unit, it will be rounded to a multiple of the next smaller unit if there is one. For example, 30.1 GB will be converted to 30822 MB not 32319628902 B. If the parameter is of integer type, a final rounding to integer occurs after any unit conversion.

  • Enumerated: Enumerated 타입의 매개 변수는 string 매개 변수와 작성 방식이 동일하지만 값 집합이 하나로 제한된다. 이 매개 변수에서 허용되는 값은 pg_settings.enumvals를 참고할 수 있다. Enum 매개 변수 값은 대소문자를 구분하지 않는다.

19.1.2. 환경 설정 파일을 통한 매개 변수 인터랙션

이러한 매개 변수를 설정하는 가장 기본적인 방법은 일반적으로 데이터 디렉터리에 있는 postgresql.conf 파일을 편집하는 것이다. 데이터베이스 클러스터 디렉터리가 초기화된 경우 기본 사본이 설치된다. 이 파일과 유사한 예시는 다음과 같다.

# This is a comment
log_connections = yes
log_destination = 'syslog'
search_path = '"$user", public'
shared_buffers = 128MB

라인당 매개 변수 하나가 지정되어 있다. 이름과 값 사이의 등호는 옵션이다. 공백은 중요하지 않으며(따옴표로 둘러싼 매개 변수 제외), 빈 라인은 무시된다. 해시 마크(#)는 라인의 나머지가 주석임을 의미한다. 단순 식별자 또는 숫자가 아닌 매개 변수 값은 작은 따옴표를 사용해야 한다. 작은 따옴표를 매개 변수 값에 포함하려면 따옴표 2개를 겹치거나 역슬래시와 따옴표를 사용해야 한다. 같은 매개 변수 설정이 여러개 있는 경우, 마지막 것을 제외하고 나머지 모두 무시된다.

이렇게 설정된 매개 변수는 클러스터에 기본값으로 제공된다. 값을 오버라이드하지 않은 경우 활성 세션에서 보이는 설정은 이 값들이다. 다음 절에서는 관리자 또는 사용자가 이러한 기본값을 오버라이드하는 방법을 설명한다.

메인 서버 프로세스가 SIGHUP 신호를 수신할 때마다 환경 설정 파일이 다시 읽히게 된다. 이 신호는 커맨드 라인에서 pg_ctl reload를 실행하거나 SQL 함수 pg_reload_conf()를 호출함으로써 가장 최근에 전송된 것이다. 또한 메인 서버 프로세스는 현재 실행 중인 모든 서버 프로세스에 이 신호를 퍼트려서 기존 세션에도 새 값이 적용되게 한다(현재 실행 중인 클라이언트 명령이 완료된 후에 진행됨). 또는 사용자가 단일 서버 프로세스에 직접 신호를 전송할 수도 있다. 일부 매개 변수는 서버 시작 시에만 설정 가능하다. 환경 설정 파일의 항목 변경은 서버가 재시작되기 전까지 무시된다. 마찬가지로, 환경 설정 파일에서 잘못된 매개 변수 설정도 SIGHUP 처리 중에 무시된다(단, 로그에는 기록된다).

postgresql.conf 외에, PostgreSQL 데이터 디렉터리에는 postgresql.auto.conf 파일이 포함되어 있으며, postgresql.conf와 형식은 동일하지만 자동으로 편집됨으로, 직접 편집해서는 안 된다. 이 파일에는 ALTER SYSTEM 명령을 통해 설정한 것들이 포함되어 있다. postgresql.conf 파일과 같이 환경 설정을 읽어야 할 때, 동일하게 읽으며, 같은 매개 변수 설정이 두 곳 모두 있다면, postgresql.auto.conf의 설정이 최종 반영 된다.

외부 도구들로 postgresql.auto.conf 파일을 변경할 수는 있다. 하지만, ALTER SYSTEM 명령으로 충분히 그 내용이 바뀔 수 있음으로 서버 실행 중에는 이 파일을 외부 도구로 편집하는 것을 추천하지 않는다. 외부 도구들로 새 설정을 맨 밑에 추가하거나, 중복된 설정을 지우거나, 주석 처리를 하거나 주석 처리를 취소하거나 할 수 있다. (ALTER SYSTEM 명령이 하는 것들이다.)

19.1.3. SQL을 통한 매개 변수 인터랙션

PostgreSQL는 환경 설정 기본값을 설정하기 위한 3가지 SQL 명령을 제공한다. 앞에서 언급한 ALTER SYSTEM 명령은 SQL 구문으로 전역 기본값을 변경할 수 있는 방법을 제공하는데, 기능상 postgresql.conf를 편집하는 것과 동일하다. 또한 데이터베이스별로 또는 role별로 기본값 설정이 가능한 명령이 2가지 있다.

  • ALTER DATABASE 명령은 전역 설정을 데이터베이스별로 오버라이드한다.

  • ALTER ROLE 명령은 전역 및 데이터베이스별 설정을 모두 사용자 지정 값으로 오버라이드한다.

ALTER DATABASEALTER ROLE로 설정된 값은 데이터베이스 세션을 새로 시작하는 경우에만 적용된다. 이것은 환경 설정 파일 또는 서버 커맨드 라인에서 구한 값을 오버라이드하고 나머지 세션에 대해 기본값을 적용한다. 서버 시작 후에 일부 설정은 변경이 불가하므로 이 명령(또는 아래 나열된 것 중 하나)으로 설정할 수 없다는 점에 유의해야 한다.

클라이언트가 데이터베이스에 연결되면 PostgreSQL 세션-로컬 환경 설정 설정과 인터랙션이 가능한 SQL 명령(또는 동등한 함수) 2개를 추가 제공한다.

  • SHOW 명령으로 모든 매개 변수의 현재 값을 확인할 수 있다. 해당 SQL 함수는 current_setting(setting_name text)이다 (9.27.1절 참조).

  • SET 명령으로는 세션에 로컬로 설정할 수 있는 이 매개 변수의 현재 값을 수정할 수 있다. 다른 세션에는 영향을 미치지 않는다. 해당 SQL 함수는 set_config(setting_name, new_value, is_local)이다 (9.27.1절 참조).

또한, 시스템 뷰 pg_settings는 세션-로컬 값을 확인하고 변경하는 데 사용할 수 있다.

  • 뷰 쿼리는 SHOW ALL과 유사하지만, 좀 더 상세한 결과를 보여준다. 또한 필터 조건을 지정하거나 다른 릴레이션과 조인할 수 있어서 좀 더 유연하다.

  • 이 뷰에서, setting 칼럼을 업데이트하기 위해 UPDATE를 사용하는 것은 SET 명령을 실행하는 것과 동일하다. 예를 들면,

    SET configuration_parameter TO DEFAULT;
    

    위의 구문은 아래와 동일하다.

    UPDATE pg_settings SET setting = reset_val WHERE name = 'configuration_parameter';
    

19.1.4. 쉘을 통한 매개 변수 인터랙션

전역 기본값을 설정하거나 데이터베이스 또는 role 레벨에서 오버라이드를 첨부하는 것 외에도, 쉘 기능을 통해 PostgreSQL로 설정을 전달할 수 있다. 서버와 libpq 클라이언트 라이브러리 모두 쉘을 통해 매개 변수를 전달 받는다.

  • 서버 시작 도중에 -c 커맨드 라인 매개 변수를 사용하여 매개 변수 설정을 postgres 명령에 전달할 수 있다. 예를 들면,

    postgres -c log_connections=yes -c log_destination='syslog'
    

    이런 방법으로 제공된 설정은 postgresql.conf 또는 ALTER SYSTEM을 통해 해당 설정을 오버라이드 하므로 서버를 재시작하지 않고는 전역적으로 설정을 변경할 수 없다.

  • libpq를 통해 클라이언트 세션을 시작하면 PGOPTIONS 환경 변수를 사용하여 매개 변수 설정을 지정할 수 있다. 이렇게 지정된 설정은 세션의 일생 중에 기본값을 환경 설정하지만 다른 세션에는 영향을 주지 않는다. 기록을 위해 PGOPTIONS의 형식은 postgres 명령을 실행할 때 사용되는 것과 유사한데, 특히 -c 플래그의 지정이 필요하다. 예를 들면,

    env PGOPTIONS="-c geqo=off -c statement_timeout=5min" psql
    

    다른 클라이언트와 라이브러리는 쉘을 통해 자체 메커니즘을 제공하거나, SQL 명령을 직접적으로 사용하지 않고 사용자가 세션 설정을 변경할 수 있게 한다.

19.1.5. 환경 설정 파일 내용 관리

PostgreSQL는 복잡한 postgresql.conf 파일을 작은 파일로 세분화하는 몇 가지 기능을 제공한다. 이 기능은 환경 설정이 동일하지는 않지만 연관성이 있는 서버들을 관리할 때 특히 유용하다.

개별 매개 변수 설정 외에, postgresql.conf 파일에는 include 지시어가 포함되어 있는데, 이것은 읽어올 다른 파일을 지정함으로써 환경 설정 파일의 해당 위치에 파일이 삽입된 것 같이 처리된다. 이 기능은 환경 설정 파일을 물리적으로 분할 한다. Include 지시어는 간략하게 다음과 같이 나타난다.

include 'filename'

파일 이름이 절대 경로가 아니면 레퍼런스 환경 설정 파일이 있는 디렉터리의 상대 경로로 취급된다. include는 중첩이 가능하다.

include_if_exists 지시어도 있는데, 이것은 레퍼런스 파일이 존재하지 않거나 파일을 읽을 수 없는 경우 외에는 include 지시어와 동일하게 작동된다. 정규 include는 이것을 에러 조건으로 간주하지만 include_if_exists는 단순히 메시지를 로깅하고 레퍼런스 환경 설정 파일의 처리를 계속한다.

postgresql.conf 파일에는 include_dir 지시어도 포함될 수 있는데, 이것은 포함할 환경 설정 파일의 전체 디렉터리를 지정한다. 다음과 같이 나타난다.

include_dir 'directory'

절대 경로가 아닌 디렉터리 이름은 참고 환경 설정 파일이 포함된 디렉터리의 상대 경로로 취급된다. 지정된 디렉터리 내에서 디렉터리가 아닌 파일은 이름이 접미사 .conf로 끝나는 경우에만 포함된다. 해당 파일이 일부 플랫폼에서 숨겨질 수 있으므로 실수 예방 차원에서 문자 .로 시작되는 파일 이름도 무시된다. include 디렉터리 내의 파일들은 파일 이름 순으로 처리된다(C 로케일(locale) 규칙에 따라, 예를 들면, 숫자-문자 순 및 대문자-소문자 순).

Include 파일 또는 디렉터리는 postgresql.conf 파일 하나만 쓰지 않고, 데이터베이스 환경 설정을 논리적으로 분리하는 데 사용될 수 있다. 메모리 용량이 각각 다른 데이터베이스 서버 2대를 운용하는 회사를 생각해보자. 로깅 같이 데이터베이스 2개가 공유하는 환경 설정 요소가 있을 가능성이 높다. 그러나 서버의 메모리 관련 매개 변수는 서로 상이하다. 그리고 서버 전용 커스텀화customization를 했을 것이다. 이러한 상황을 관리하는 한 방법은 커스텀 환경 설정 변경 내용을 3개의 파일로 분할하는 것이다. 사용자는 아래 코드를 postgresql.conf 파일의 끝에 추가하여 각 파일을 포함하면 된다.

include 'shared.conf'
include 'memory.conf'
include 'server.conf'

모든 시스템의 shared.conf 파일은 동일하다. 메모리 크기가 다른 각 서버는 동일한 memory.conf를 공유할 수 있다. 사용자는 RAM이 8GB인 서버와 16GB인 서버를 모두 한 파일로 관리할 수 있다. 그리고 server.conf에는 서버별 환경 설정 정보가 포함된다.

환경 설정 파일 디렉터리를 생성하고 이 정보를 그 파일에 넣는 방법도 있다. 예를 들면, conf.d 디렉터리는 postgresql.conf의 끝에서 참고할 수 있다.

include_dir 'conf.d'

그런 다음, conf.d 디렉터리의 파일 이름을 다음과 같이 지정한다.

00shared.conf
01memory.conf
02server.conf

이러한 네이밍 규칙으로 파일이 로드되는 순서가 명확해진다. 서버가 환경 설정 파일을 읽을 때, 매개 변수의 마지막 설정만 사용되므로 이 규칙은 중요하다. 이 예시에서, conf.d/02server.conf에서 설정된 값들은 conf.d/01memory.conf에서 설정된 값을 오버라이드한다.

이 방법을 대신 사용하여 파일을 서술적으로 네이밍할 수 있다.

00shared.conf
01memory-8GB.conf
02server-foo.conf

이러한 배치 순서는 각각의 환경 설정 파일 변화에 대해 고유한 이름을 부여한다. 이로써 버전 관리 저장소처럼 몇 개의 서버 환경 설정이 한곳에 저장되는 경우 모호성을 줄일 수 있다(데이터베이스 환경 설정 파일을 버전 관리에 저장하는 것은 생각해볼 만한 좋은 사례이다.).