pg_ctl

pg_ctl — PostgreSQL 서버 초기화, 시작, 중지, 제어

요약

pg_ctl init[db] [-D 데이터디렉터리] [-s] [-o initdb옵션]

pg_ctl start [-D 데이터디렉터리] [-l 파일이름] [-W] [-t ] [-s] [-o 옵션] [-p 경로] [-c]

pg_ctl stop [-D 데이터디렉터리] [-m s[mart] | f[ast] | i[mmediate] ] [-W] [-t ] [-s]

pg_ctl restart [-D 데이터디렉터리] [-m s[mart] | f[ast] | i[mmediate] ] [-W] [-t ] [-s] [-o 옵션] [-c]

pg_ctl reload [-D 데이터디렉터리] [-s]

pg_ctl status [-D 데이터디렉터리]

pg_ctl promote [-D 데이터디렉터리] [-W] [-t ] [-s]

pg_ctl logrotate [-D datadir] [-s]

pg_ctl kill 시그널이름 프로세스ID

Microsoft Windows 환경에서는 다음 명령도 가능하다:

pg_ctl register [-D 데이터디렉터리] [-N 서비스이름] [-U 사용자이름] [-P 비밀번호] [-S a[uto] | d[emand] ] [-e 이벤트소스] [-W] [-t ] [-s] [-o 옵션]

pg_ctl unregister [-N 서비스이름]

설명

pg_ctl 명령은 PostgreSQL 데이터베이스 서버 (postgres) 제반 작업을 수행한다. 이 작업은 데이터베이스 클러스터 초기화, 서버 시작, 중지, 재시작, 서버 상태 출력등이다. 물론 서버는 postgres 명령으로 직접 실행할 수 있으나, pg_ctl 명령을 이용하면, 보다 쉽고, 안전하게 관리할 수 있다. 서버의 로그 처리나, 하위 프로세스 관리나, 중지 방법을 보다 직관적으로 선택할 있게 한다.

init 또는 initdb 모드는 PostgreSQL 데이터베이스 클러스터를 만드는 일을 한다. 데이터베이스 클러스터란 하나의 서버 인스턴스가 관리하는 최상위 자료 집합이다. 이 작업은 내부적으로 initdb 명령을 사용한다. 이 명령의 자세한 설명은 initdb 설명서에서 다룬다.

start 모드는 서버를 실행하는 일을 한다. 이 서버는 백그라운드로 실행되며, 표준 입력 장치로 /dev/null 장치를 사용한다(Windows에서는 nul). 표준 출력 장치는 여느 유닉스 프로그램과 마찮가지로, /dev/stdout, /dev/stderr 장치를 사용한다. (유닉스 장치 개념을 잘 모르는 이들을 위한 설명 - 아주 단순하게 설명하면, 서버가 출력하는 각종 메시지 가운데, 오류 메시지들은 /dev/stderr 쪽으로 보내고, 나머지는 /dev/stdout 즉 사용자가 현재 보고 있는 화면으로 보낸다. - 옮긴이) 이렇기 때문에, 파이프를 이용해서, 서버 로그를 rotatelogs 프로그램으로 보낼 수 있다. (이 부분에 대한 자세한 설명은 유닉스, 리눅스 설명서를 살펴 보면 된다.) 이와 달리 이 표준 출력과 표준 오류 장치로 보내는 내용을 파일로 저장하려면, -l 옵션을 사용하면 된다. (실 업무 환경에서는 서버 로그 처리는 서버 환경 설정에서 지정하기 때문에, pg_ctl 명령에 의해서 만들어지는 로그는 극히 적다. pg_ctl 명령이 시스템 부팅 때 자동으로 실행되는 경우라면, 이 명령어 실행 내역을 보관하기 위해서 -l 옵션이 필요 할지도 모르겠지만, 서버 실행을 사용자 직접 한다면, postgres 서버 로그는 로그 파일로 따로 저장하도록 설정하고, pg_ctl 실행 로그는 작업자가 화면에서 바로 보는 것이 일반적이다. - 옮긴이)

stop 모드는 서버를 중지하는 일을 한다. 서버 중지 방법은 세가지다. 이는 -m 옵션으로 지정한다. Smart: 이 모드는 새 연결 금지, 기존 연결 끊길 때까지 대기, 모든 온라인 백업 종료한다. Fast: 현재 접속해 있는 클라이언트의 모든 작업을 강제로 중지하고, 모든 클라이언트 접속을 끊고, 서버를 중지한다. Immediate: 클라이언트 세션 정리 작업을 모두 무시하고, 즉시 서버를 중지한다. 이렇게 중지된 서버가 재실행되면, 자동 복구 모드로 실행된다.

restart 모드는 서버 재실행하는 일을 한다. 여기서 postgres 명령행 옵션이나, 환경 설정 파일 내용을 바꾸고 그것을 서버 재실행 해야만 하는 경우 이 모드를 사용한다. 만약 서버를 실행 할 때, 상대 경로를 지정했다면, 그 시작할 때의 위치에서 재실행해야 정상적으로 재실행 될 수 있다. 그렇지 않은 경우는 오류가 발생할 수 있다.

reload 모드는 단순하게 postgres 서버 프로세스에 SIGHUP 시그널만 보낸다. 이 신호를 받으면, 서버는 환경 설정 파일(postgresql.conf, pg_hba.conf 등)을 다시 불러 온다. 이렇게 해서 서버 재시작 없이 환경 설정을 바꿀 때 이용한다. 물론 재시작을 해야만 변경 할 수 있는 환경 설정은 설정 파일에서 변경 했다 하더라도 이 때 반영되지 않는다.

status 모드는 지정한 데이터 디렉터리를 사용하는 서버 실행 상태를 보여준다. 실행 중인 서버가 있다면, 그 서버의 PID와 명령행 옵션을 보여준다. 실행 중인 서버가 없다면, pg_ctl 실행 반환 값으로 3을 반환하고 종료한다. 지정한 데이터 디렉터리로 접근 할 수 없다면, 4를 반환하고 종료한다.

promote 모드는 해당 서버가 읽기 전용 보조 서버였다면, 운영 서버와의 관계를 끊고, 그 서버를 읽기-쓰기 가능한 또 다른 운영 서버로 바꾸는 일을 한다.

logrotate mode rotates the server log file. For details on how to use this mode with external log rotation tools, see 24.3절.

kill 모드는 지정한 프로세스에 지정한 시그널을 보내는 일을 한다. 이 명령은 내장된 kill 명령이 없는 Microsoft Windows 환경에서도 사용할 수 있다. 사용할 수 있는 시그널 이름은 --help 옵션을 이용해 볼 수 있는 도움말에서 소개하고 있다.

register 모드는 Microsoft Windows 에서 PostgreSQL 서버 운영을 위해 시스템 서비스로 등록하는 일을 한다. -S 옵션으로 해당 서비스 시작 유형을 지정할 수 있다. auto는 OS 시작 할 때 자동으로 실행, demand는 수동으로 서비스를 시작한다.

unregister 모드는 Microsoft Windows 에서 등록한 해당 서비스를 삭제하는 일을 한다. register 작업의 반대 일이다.

옵션

-c
--core-files

해당 OS가 지원한다면, 서버가 비정상 종료될 경우 코어 덤프 파일을 만들도록 지정한다. 이 코어 덤프 파일에는 서버 종료 때의 여러 자원 상황을 기록해 놓는다. 이 코어 덤프 파일은 서버 문제점을 찾는데 유용하게 사용된다.

-D 데이터디렉터리
--pgdata=데이터디렉터리

데이터베이스 환경 설정 파일이 있는 디렉터리. 이 옵션을 생략하면, PGDATA 환경 변수 값을 이 디렉터리로 간주한다.

-l 파일이름
--log=파일이름

지정한 filename 파일에 로그를 기록한다. 해당 파일이 없으면 만든다. 이 때 사용하는 umask 값이 077이며, 이게 기본값이다. 이 명령을 실행하는 사용자만 그 내용을 볼 수 있다.

-m 모드
--mode=모드

서버 중지 방법을 지정한다. 모드값은 smart, fast, immediate 이 세가지며, 각 단어의 첫글자만 사용할 수도 있다. 이 옵션이 없으며, fast 모드로 서버가 중지된다.

-o 옵션
--options=옵션

postgres 서버를 실행할 때 사용할 옵션을 지정한다. -o 옵션은 하나의 명령행에 여러번 사용할 수 있다.

옵션 값으로 여러 옵션을 지정한다면, 그 모두를 작은 따옴표나, 큰 따옴표로 둘러쌓야한다. (하나의 -o 옵션 값으로 해석되도록 해야한다.)

-o initdb옵션
--options=initdb옵션

initdb 명령을 호출 할 때 사용하는 옵션을 지정한다. -o 옵션은 하나의 명령행에 여러번 사용할 수 있다.

initdb옵션 값으로 여러 옵션을 지정한다면, 그 모두를 작은 따옴표나, 큰 따옴표로 둘러쌓야한다. (하나의 -o 옵션 값으로 해석되도록 해야한다.)

-p 경로

postgres 실행 파일 경로를 지정한다. 기본적으로 pg_ctl 실행 파일이 있는 디렉터리 안에 이 실행 파일도 있으며, 그렇지 않은 경우는 정상적으로 실행할 수 없다. 이 옵션은 특이한 상황에서 postgres 실행 파일을 찾을 수 없다고 할 때 사용하지, 일반적인 상황에서는 사용하지 않는다.

init 모드에서도 이 옵션은 initdb 실행 파일의 경로를 지정하는 역할을 한다.

-s
--silent

정보성 메시지를 보여주지 않고, 오류 메시지만 보여 줌.

-t
--timeout=

해당 작업을 시작한 뒤, 최대 기다리는 시간(초단위) (-w 옵션 설명 참조). 기본값은 60초이며, PGCTLTIMEOUT 환경 변수 값으로 이 기본값을 바꿀 수 있다.

-V
--version

pg_ctl 버전을 보여주고 마침

-w
--wait

해당 작업이 완료되기까지 기다림. start, stop, restart, promote, register 작업은 실재 데이터베이스 서버가 그 일을 진행하기 때문에, pg_ctl 입장에서는 해당 작업이 완료 될 때까지 기다릴지, 바로 작업을 마무리했다고 간주하고, 프로그램을 종료할지를 결정해야한다. 이 옵션을 사용하면, 해당 작업이 완료될까지 기다린다.

pg_ctl 명령은 기다릴 때, 서버 PID 파일을 주기적으로 확인한다. 서버 시작 작업이라면, PID 파일이 생성되고, 클라이언트 접속이 가능한 상태를 확인할 때까지 기다리며, 서버 중지 작업이라면, PID 파일이 없어 질 때까지 기다린다. pg_ctl 명령의 실행 반환값은 서버의 시작, 중지 작업이 정상적으로 수행 되었느냐에 따라 적당한 값을 반환한다.

이 기다리는 시간은 -t (위 옵션 설명 참조) 옵션으로 그 최대 시간을 지정할 수 있으며, 이 시간까지도 작업이 완료되지 않으면, pg_ctl 명령은 0 아닌 값을 반환하며 마친다. 이렇게 pg_ctl 명령이 종료되었다할지라도 서버 시작, 중지 작업은 백그라운드로 계속 중일 수 있음을 기억해야 한다. (이런 경우는 관리자가 직접 확인하고 필요하다면 적당한 조치를 취해야 한다. - 옮긴이)

-W
--no-wait

작업 대기를 하지 않고 바로 종료한다. -w 옵션의 반대 기능이다.

작업 대기를 하지 않아도, 원하는 작업은 백그라운드로 진행을 하지만, 그 실 작업의 정상적인 완료 상태는 확인할 수 없다. 이 경우는 서버 로그를 확인하거나 일련의 다른 작업 상태를 확인하는 작업이 필요하다.

이 옵션은 이전 버전까지 stop 모드를 제외하고는 모든 모드에서 기본값으로 사용되었다.

-?
--help

pg_ctl 명령행 옵션들 설명을 보여주고 마침

구문상 옵션 지정은 바르게 했지만, 그 옵션이 사용하는 모드와 관계 없다면, 그 옵션들은 무시된다.

Windows에서 사용하는 옵션

-e 이벤트소스

Windows 서비스로 서버를 운영할 때, 이벤트 로그에서 사용할 이벤트 소스 이름. 기본값은 PostgreSQL이다. 이것은 pg_ctl 명령이 만드는 로그에 대해서만 관여한다. 서버 설정으로 event_source 환경 설정 매개 변수값을 지정해서 이벤트 소스를 다르게 지정했다면, 서버에서 만드는 로그는 다르게 다룬다. 하지만, 서버가 이 설정을 반영하기도 전에 중지 된다면 - 서버 시작을 실패한다면, 기본값인 PostgreSQL로 이벤트 소스를 사용할 것이다.

-N 서비스이름

시스템 서비스로 등록할 서비스 이름. 이 이름은 서비스 목록에 서비스 이름으로 사용한다. 기본값은 PostgreSQL이다.

-P 비밀번호

서비스를 시작할 사용자의 비밀번호.

-S 시작유형

서비스 시작 유형. 시작유형 값으로 auto 또는 demand를 사용할 수 있으며, 이 단어의 첫글자만 사용해도 된다. 기본값은 auto다.

-U 사용자이름

서비스를 시작할 사용자 이름. 도메인 사용자라면, DOMAIN\username 형태로 지정한다.

환경 변수

PGCTLTIMEOUT

기본 대기 시간. 이 값(초)만큼 서버 시작이나, 종료 작업시, 해당 작업이 정상적으로 완료되었는지 확인하는 작업을 한다. 이 환경 변수 설정이 없으면, 60초 동안 기다린다.

PGDATA

기본 데이터 디렉터리

pg_ctl의 여러 모드는 데이터 디렉터리를 꼭 지정해야 한다. 이 때, -D 옵션을 생략하면, 이 PGDATA 환경 변수값을 사용한다.

pg_ctl 명령도 대부분 여러 PostgreSQL 도구들과 마찬가지로 libpq 라이브러를 사용하기 때문에, 이 라이브러리에서 사용할 수 있는 환경 변수들을 사용할 수 있다(33.14절 참조).

추가적으로 서버에서 사용하는 환경 변수 설명은 postgres에서 소개하고 있다.

관련 파일

postmaster.pid

pg_ctl 프로그램이 서버가 현재 실행 중인지 검사 할 때 찾는 파일.

postmaster.opts

이 파일이 데이터 디렉터리 안에 있다면, pg_ctl restart 모드에서 이 파일의 내용을 postgres 실행 옵션으로 지정해서 재실행한다. 물론 -o 옵션으로 지정해 그 값을 바꿀 수 있다면, 그 값을 우선 사용한다. pg_ctl 프로그램이 status 모드로 실행되고, 서버가 실행 중일 때 이 파일의 내용을 보여준다.

예제

서버 실행

클라이언트 접속이 가능한 상태로 서버가 실행되는데까지 기다리는 명령:

$ pg_ctl start

fsync 기능을 끄고, 포트를 5433으로 서비를 실행하는 명령:

$ pg_ctl -o "-F -p 5433" start

서버 중지

서버 중지 명령:

$ pg_ctl stop

-m 옵션을 사용해 서버 중지 방법을 지정한 경우:

$ pg_ctl stop -m smart

서버 재실행하기

서버 재실행은 중지하고 시작하는 것과 같다. pg_ctl 명령을 사용하면, 서버가 시작될 때 지정한 여러 명령행 옵션들을 보관했다가 재시작할 때 사용하기 때문에, 재시작 할 때는 특별히 바꿀 경우가 아니라면, 아무 옵션 없이 사용해도 된다:

$ pg_ctl restart

-o 옵션을 사용하면 재 시작시 서버 실행 환경이 바뀐다. 다음은 fsync 기능을 끄고, 포트를 5433으로 바꾸어 재실행하는 경우다:

$ pg_ctl -o "-F -p 5433" restart

서버 상태 보기

pg_ctl 명령을 이용한 서버 상태 보기:

$ pg_ctl status

pg_ctl: server is running (PID: 13718)
/usr/local/pgsql/bin/postgres "-D" "/usr/local/pgsql/data" "-p" "5433" "-B" "128"

두번째 줄은 서버 재실행 할 때 사용되는 명령이다.

관련 항목

initdb, postgres