19.1. 매개변수 설정

19.1.1. 매개변수 이름 및 값

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

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.conf의 설정을 오버라이드한다.

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

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

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

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

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

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

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

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

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