postgres

postgres — PostgreSQL 데이터베이스 서버

요약

postgres [옵션...]

설명

postgres 명령은 PostgreSQL 데이터베이스 서버다. 데이터베이스를 사용하는 응용 프로그램들은 이 서버에 (로컬 또는 리모트로) 접속한다. 이 명령은 이 서버 인스턴스를 실행하는 명령이다. postgres 인스턴스가 실행되면, 내부적으로 여러 하위 프로세스들이 같이 실행된다.

하나의 postgres 인스턴스는 하나의 데이터 클러스터를 관리한다. 데이터 클러스터란 일반적으로 데이터 영역이라고 하는 자료 파일들이 있는 위치를 말한다. 관리할 자료가 다르고, 접속할 포트가 다른 또 다른 데이터 클러스터를 관리하고자 한다면 또 다른 postgres 인스턴스를 실행해야 함을 의미한다. 즉, postgres 명령을 실행할 때는 그 인스턴스가 관리할 데이터 영역 위치가 어딘지를 알아야 한다. 이 위치는 -D 명령행 옵션이나, PGDATA 환경 변수값으로 지정한다. 이 값은 기본값이 없다. 일반적으로 -D 옵션이나, PGDATA 환경 변수값으로 사용하는 위치는 initdb 명령으로 만든 디렉터리 경로를 사용한다. Other possible file layouts are discussed in 19.2절.

기본적으로 postgres 명령은 사용자 대화식 foreground 으로 실행되며, 로그 메시지는 표준 오류 장치로 출력한다. 하지만, 일반적인 환경에서는 postgres 서버는 OS 부팅 때 백그라운드로 실행된다.

postgres 명령은 단일 사용자 모드로도 실행할 수 있다. 이렇게 사용하는 경우 중 가장 대표적인 것은 initdb 작업 중에 일어난다. 또한, 디버그 작업이나, 장애 복구 때 사용한다; 물론 단일 사용자 모드에서 모든 상황의 문제점을 디버그 할 수 있는 것은 아님을 기억해야한다. 여러 사용자들이 함께 사용하면서 발생하는 문제점은 찾을 수 없기 때문이다. 단일 사용자 모드로 실행되면, 사용자 대화식으로 실행된다. 사용자가 쿼리를 입력하면, 그 결과를 화면에 보여주는데, 일반 사용자를 위한 내용이라기보다는 개발자들을 위한 내용들이다. 단일 사용자 모드에서는 세션 사용자 ID를 1로 처리하며, 명령을 실행한 사용자가 슈퍼유저 권한을 가진다. 이 사용자는 다중 사용자 환경에서는 없는 사용자이며, 손상된 시스템 카탈로그를 수동으로 복구할 때 단일 사용자 모드로 실행할 수 있다.

옵션

다음은 postgres 명령을 실행할 때 사용할 수 있는 명령행 옵션들에 대한 설명이다. 서버 실행 환경에 대한 자세한 설명은 19장에서 다룬다. 여기서 설명하는 대부분 옵션들은 환경 설정 파일에 저장해서 지정할 수 있다. 일부 (안전한) 옵션들은 응용프로그램 의존적인 설정인 경우 그 세션에만 적용할 수 있도록 클라이언트가 접속할 때 적용할 수도 있다. 예를 들어, PGOPTIONS 환경 변수 값으로 지정한 옵션 값들은 libpq 기반 응용 프로그램이 실행 될 때 사용해서, 서버 연결 시 postgres 명령행 옵션으로 사용된다.

일반 옵션

-B 버퍼수

서버 프로세스들이 사용하는 공유 버퍼 수. 이 값은 initdb 작업 때 자동으로 기본값이 결정된다. shared_buffers 환경 설정 매개 변수 값과 같다.

-c 이름=

지정한 이름의 실시간 매개 변수 값 지정. 여기서 사용할 수 있는 매개 변수들은 19장에서 설명하고 있다. 대부분의 옵션들은 이렇게 지정할 수 있는 설정의 간단한 방식의 옵션들이다. -c 옵션은 명령행에서 여러 번 사용할 수 있다.

-C name

지정한 실시간 매개 변수 값을 출력하고, 프로그램을 종료한다. (위 -c 옵션 설명 참조) 이 옵션은 서버가 실행 중일 때도 사용할 수 있으며, postgresql.conf 파일에서 지정한 그 값을 보여준다. 서버 실행 시 명령행 옵션으로 지정한 값은 보여주지 않는다.

이 옵션은 pg_ctl 프로그램 같은 서버 운영에 필요한 다른 프로그램이 서버 환경 설정 값을 조회할 때 사용한다. 사용자가 현재 실행 중인 서버의 환경 설정 값들을 조회하려면, SHOW SQL 명령을 이용하거나, pg_settings 뷰를 살펴보아야 한다.

-d 디버그수준

디버그 수준 지정. 1-5까지 숫자를 지정할 수 있으며, 숫자가 크면 보다 자세한 정보를 출력한다. 특정 세션에만 -d 0 옵션을 사용할 수 있으며, 이런 경우는 다른 세션에 대해서는 이 디버그 수준을 변경하지 않는다.

-D 데이터디렉터리

데이터베이스 환경 설정 파일이 있는 디렉터리를 지정한다. 자세한 설명은 19.2절에서 다룬다.

-e

날짜 출력 양식을 European으로 바꾼다. 이는 DMY 순서다. 자세한 설명은 8.5절에서 한다.

-F

처리 성능을 높이기 위해 fsync 작업을 안한다. 이 옵션을 사용하면, 서버가 비정상 종료될 경우 자료 손실이 있을 수 있다. fsync 서버 환경 설정 매개 변수 값을 off로 지정하는 것과 같다. 이 옵션을 사용하기 전에 반드시 문서를 꼼꼼히 읽어 부작용을 충분히 알고 있어야 한다!

-h 호스트이름

postgres 서버의 TCP/IP 리슨용 호스트이름 또는 IP 주소를 지정한다. 쉼표로 구분해서 여러개를 지정할 수 있으며, * 문자를 사용해서 사용 가능한 모든 인터페이스를 리슨용으로 지정할 수 있다. 이 값을 지정하지 않고 이 옵션만 쓰면, 유닉스 도메인 소켓만 사용한다. (외부 TCP/IP 접속이 막힌다) 서버 초기값은 localhost 접속만 허용한다. 이 옵션은 listen_addresses 환경 설정 매개 변수 값을 지정하는 것과 같다.

-i

이 옵션은 클라이언트가 원격 접속을 허용한다. 이 옵션을 사용하지 않으면, 로컬 접속만 허용한다. 이 옵션은 -h 옵션을 사용하거나, postgresql.conf 파일에서 listen_addresses 값을 * 로 지정하는 것과 같다.

이 옵션은 -h 옵션에서 보다 다양하게 그 값을 지정할 수 있게 되어 이제는 쓰지 않는다.

-k 디렉터리

유닉스 도메인 소켓 파일이 있는 디렉터리를 지정한다. 디렉터리는 쉼표 구분문자로 여러 개 지정할 수 있다. 디렉터리를 지정하지 않으며, 유닉스 도메인 소켓 접속을 허용하지 않고, TCP/IP 소켓 접속만 허용한다. /tmp 디렉터리가 기본값이다. 기본값은 빌드 할 때 변경할 수 있다. unix_socket_directories 환경 설정 매개 변수 값을 지정하는 것과 같다.

-l

SSL 접속을 활성화 한다. 물론 서버가 SSL 접속을 사용할 수 있도록 빌드되어야 사용할 수 있다. SSL 접속 관련 정보는 18.9절에서 자세히 다룬다.

-N 최대연결수

클라이언트 최대 접속 수 지정. 이 값은 initdb 작업 시 기본값이 정해 진다. max_connections 환경 설정 매개 변수 값을 지정하는 것과 같다.

-o 기타옵션

서버 하위 프로세스가 만들어 질 때 넘겨줄 postgres 명령행 기타옵션을 지정한다.

기타옵션 값이 여러 옵션을 지정한다면, 그 옵션별로 공백 문자로 구분한다. 백슬래시(\) 문자가 값으로 쓸 경우는 \\ 형태로 이스케이핑 해야한다. -o 옵션은 명령행에서 여러번 사용할 수 있다.

이제는 이 옵션으로 지정하지 않아도, 자동으로 명령행 옵션이 하위 프로세스에서 사용되기 때문에 사용하지 않는다.

-p 포트

클라이언트가 서버 접속을 할 때 사용하는 포트 번호를 지정한다. TCP/IP, 유닉스 도메인 소켓 모두 동일 포트 번호를 사용한다. 기본값은 PGPORT 환경 변수에 지정한 값을 사용하며, 이 값이 없다면, 서버 빌드 때 지정한 값(일반적으로 5432)을 사용한다. 이 포트 번호를 기본값이 아닌 것으로 지정했다면, 클라이언트는 PGPORT 환경 변수를 이용하거나, 명령행에서 그 포트 번호를 사용할 수 있도록 옵션을 지정해야한다.

-s

서버에서 수행되는 각각의 명령들에 대한 그 수행시간과 여러 통계 정보를 출력한다. 이 옵션은 성능 검사나, 버퍼 수를 조정하는데 유용하게 쓰인다.

-S work-mem

정렬 작업이나, 해시 작업을 할 때 필요한 세션 별로 내부적으로 사용하는 기본 메모리 크기를 지정한다. 자세한 내용은 19.4.1절에서 work_mem 환경 설정 매개 변수 부분을 살펴보면 된다.

-V
--version

postgres 버전을 보여주고 마친다.

--name=value

지정한 이름의 실시간 매개 변수 값을 지정한다. -c 옵션의 단순한 사용법이다.

--describe-config

서버 내부 환경 설정 변수들에 대한 설명을 모두 보여 준다. 출력 양식은 COPY 명령 출력 양식과 같이 탭 구문 문자로 칼럼을 구분한다. 이 옵션은 관리 도구에서 사용하려고 제공한다.

-?
--help

postgres 명령행 옵션들을 보여주고 마친다.

Semi-Internal Options

여기서 다루는 옵션은 주로 서버 문제점 추적할 때, 또는 데이터베이스 저수순 복구를 해야할 때 사용한다. 운영 환경에서는 이런 옵션을 쓸 일이 없어야 한다. PostgreSQL 시스템 개발자들을 위한 옵션이다. 향후 이 옵션들은 고지 없이 바뀌거나 사라지기도 할 것이다.

-f { s | i | o | b | t | n | m | h }

실행 계획 최적화기의 특성 제어 옵션. Forbids the use of particular scan and join methods: s and i disable sequential and index scans respectively, o, b and t disable index-only scans, bitmap index scans, and TID scans respectively, while n, m, and h disable nested-loop, merge and hash joins respectively.

Neither sequential scans nor nested-loop joins can be disabled completely; the -fs and -fn options simply discourage the optimizer from using those plan types if it has any other alternative.

-n

세마포어, 공유 메모리 상태를 초기화 하지 않고 종료함. 이 부분 디버깅 용. This option is for debugging problems that cause a server process to die abnormally. The ordinary strategy in this situation is to notify all other server processes that they must terminate and then reinitialize the shared memory and semaphores. This is because an errant server process could have corrupted some shared state before terminating. This option specifies that postgres will not reinitialize shared data structures. A knowledgeable system programmer can then use a debugger to examine shared memory and semaphore state.

-O

시스템 카탈로그 테이블을 수정할 수 있음. initdb 작업에서 사용됨.

-P

시스템 카탈로그에서 사용하는 인덱스 사용을 금지함. 시스템 인덱스가 손상 되었을 때 유용하게 쓸 수 있음.

-t pa[rser] | pl[anner] | e[xecutor]

쿼리 실행 각 정보(구문분석기, 실행계획기, 실행기) 출력 이 옵션은 -s 옵션과 함께 쓸 때 유용하다.

-T

비정상 종료시 하위 프로세스 재 초기화 하는 작업을 안함. 하위 프로세스로 SIGSTOP 시그널을 보내지 않음. This option is for debugging problems that cause a server process to die abnormally. The ordinary strategy in this situation is to notify all other server processes that they must terminate and then reinitialize the shared memory and semaphores. This is because an errant server process could have corrupted some shared state before terminating. This option specifies that postgres will stop all other server processes by sending the signal SIGSTOP, but will not cause them to terminate. This permits system programmers to collect core dumps from all server processes by hand.

-v protocol

통신 프로토콜 버전을 지정한다. Specifies the version number of the frontend/backend protocol to be used for a particular session. This option is for internal use only.

-W seconds

새 하위 서버 프로세스를 만들 때, 지정한 초만큼 대기한다. 인증 절차 디버깅할 때 유용한다. A delay of this many seconds occurs when a new server process is started, after it conducts the authentication procedure. This is intended to give an opportunity to attach to the server process with a debugger.

단일 사용자 모드용 옵션

다음 옵션들은 단일 사용자 모드로 서버를 실행할 때 사용한다 (아래 단일 사용자 모드 참조).

--single

단일 사용자 모드로 실행한다. 이 옵션은 명령행 옵션들 가운데 가장 먼저 지정해야 한다.

데이터베이스

접속할 데이터베이스 이름을 지정한다. 이 값은 명령행에서 가장 마지막에 지정해야 한다. 이 값을 지정하지 않으면 현재 쉘을 사용하고 있는 사용자 이름과 같은 데이터베이스로 접속한다.

-E

모든 명령을 실행 전에 먼저 표준 출력으로 보여준다.

-j

세미콜론 다음 줄바꿈 문자 두 개를 명령 입력 종료로 처리한다. 기본은 세미콜론 다음 하나의 줄바꿈 문자다.

-r 파일이름

지정한 파일이름 파일에 모든 서버 출력을 기록한다. 이 옵션은 명령행 옵션으로 사용할 때만 반영 된다.

환경 변수

PGCLIENTENCODING

기본값으로 사용할 클라이언트 문자 세트 인코딩. (이 값은 클라이언트가 개별적으로 바꿀 수 있다.) 이 값은 환경 설정 파일에서도 지정할 수 있다.

PGDATA

데이터 디렉터리 위치, 이 환경 변수를 사용하면, -D 옵션을 지정하지 않아도 된다.

PGDATESTYLE

datestyle 실시간 매개 변수값을 지정한다. (이 환경 변수 사용은 권장하지 않는다.)

PGPORT

기본 포트 번호 (환경 설정 파일에서도 지정할 수 있으며, 이 설정이 우선 적용된다.)

진단

서버가 semget 또는 shmget 시스템 호출을 하다가 실패해서 실행이 안 된다는 실패 메시지를 볼 수도 있다. 이 문제는 OS 공유 메모리와 세마포어 설정 값이 서버를 운영하는 적당하지 않기 때문에 발생한다. 이 부분에 대해서는 18.4절에서 자세히 다루고 있다. OS 커널 설정을 변경할 수 없는 상황이라면, shared_buffers 값이나, max_connections 값을 줄여서 서버를 실행하는 것도 한 방법이다.

이미 다른 서버가 실행 되고 있어 서버를 실행 할 수다는 실패 메시지를 접하면, 다음과 같은 명령으로 서버가 실행 중인지 살펴 볼 수 있다.

$ ps ax | grep postgres

또는

$ ps -ef | grep postgres

이 명령은 사용하는 OS에 따라 다를 수 있다. 실행 중인 서버 프로세스가 없다는 것이 확인되면, 실패 메시지에서 알려 준 잠근 파일을 지우고 다시 실행하면 된다.

포트 바인드 실패로 서버가 실행되지 않을 수 있다. 이 경우는 해당 포트를 아직 사용 중인 하위 프로세스가 종료되지 못하고 있거나, 그 포트를 다른 서버 프로그램이 사용하고 있거나, OS에서 해당 포트를 정리하기 전에 postgres 프로세스가 바인드하려고 할 때(너무 빨리 재실행할때) 발생한다. 여러 상황을 살펴보아 적당한 조치를 한 뒤 다시 시도해 본다. 마지막으로 1024 보다 작은 포트 번호를 사용하는 경우, 시스템 내부적으로 이런 포트는 OS 슈퍼유저만 사용할 수 있도록 정책적으로 막은 경우도 있다.

참고

pg_ctl 도구는 postgres 서버를 실행하거나 중지하는 손쉽고, 안전한 도구다. 일반적으로 서버 관리는 이 명령어를 사용한다.

부득이한 경우가 아니라면, postgres 서버 프로세스로 SIGKILL 시그널을 보내지 말아야한다. (kill -9 PID 명령을 사용하지 말라 - 옮긴이) 서버는 공유 메모리나 세마포어 같은 시스템 전역 자원을 정리하고, 종료되어야한다. 이 시그널을 보내 서버가 갑자기 종료되면, 이런 정리 작업을 못해, 다시 실행할 때 자원 부족으로 서버가 실행 되지 않을 수 있다.

postgres 프로세스 종료는 SIGTERM, SIGINT, SIGQUIT 시그널을 보내서 종료해야 한다. SIGTERM은 모든 클라이언트 세션이 종료될 때까지 기다렸다가 서버를 종료하고, SIGINT는 모든 클라이언트 세션을 강제 종료한 뒤 서버를 종료하고, SIGQUIT는 최소한의 정리 작업 뒤 바로 종료한다. 이 경우는 다시 실행할 때 데이터베이스 복구 작업을 진행한다.

SIGHUP 시그널을 받으면, 환경 설정 파일을 다시 반영한다. 이 시스널은 메인 프로세스에만 보내면 된다. 하위 프로세스 쪽으로 보내봐야 무시된다.

세션 프로세스에서 진행 중인 쿼리 작업을 중지하려면, SIGINT 시그널을 보내고, 세션 프로세스를 강제 종료 하려면, 그 프로세스로 SIGTERM 시그널을 보내면 된다. 같은 역할을 하는 SQL 명령어는 pg_cancel_backend, pg_terminate_backend 함수를 실행하면 된다. (9.27.2절 참조)

SIGQUIT 시그널을 메인 포레스가 받으면, 하위 실행 중이던 모든 작업을 취소하고, 그 세션을 강제 종료하고 서버를 종료한다. 그렇기 때문에, 하위 프로세스에 이 시그널을 보내면 안된다. 또한 세션 프로세스에 SIGKILL 시그널을 보내면, 메인 프로세스가 그것을 감지해서, 모든 하위 프로세스를 재 초기화한다. (세션 프로세스도 kill -9 으로 강제 종료하면 안된다. - 옮긴이)

문제점

-- 옵션들은 FreeBSD, OpenBSD에서는 사용할 수 없다. -c 옵션을 사용해야 한다. 이 문제는 해당 OS 의존적인 문제다. 향후 PostgreSQL 에서는 이 문제를 해결할 수 없다면 피해갈 수 있는 방법을 제시할 것이다.

단일 사용자 모드

일반적인 단일 사용자 모드 실행 방법

postgres --single -D /usr/local/pgsql/data 기타옵션들 my_database

-D 옵션이나, PGDATA 환경 변수값으로 바른 데이터디렉터리를 지정하고 뒤에 사용할 데이터베이스 이름을 지정한다.

단일 사용자 모드로 실행된 경우 사용자 명령어 입력은 줄 단위로 실행된다. psql 프로그램을 사용할 때처럼 유연하게, 세미콜론으로 명령을 구분해서 실행하지 않는다. 명령을 여러 줄에 나눠 입력 해야할 경우는 각 줄 마지막에 백슬래시 문자를 추가해서 줄을 바꾼다. 이렇게 하면 명령 해석을 할 때, 백슬래시+줄바꿈 문자는 무시하는 방식으로 처리한다. 이 처리방식은 주석이나, 명령 속 문자열 처리에서도 같이 적용된다.

-j 옵션은 이런 부분을 감안해서, 세미콜론+줄바꿈문자+줄바꿈문자가 있으면, 그것을 명령 입력 마무리로 간주한다. 이 때는 백슬래시+줄바꿈문자 처리는 무시된다. 즉 명령 내 문자열 처리나, 주석 처리에서 그대로 반영된다.

실행 단위 명령에서 그 가운데, 세미콜론이 있으면, 그 기준으로 각각의 명령으로 간주하며, 하나의 트랜잭션으로 처리한다.

작업을 종료하려면, EOF 신호를 보낸다. (일반적으로 Control+D) (Windows 경우는 Control+Z) 명령 입력을 마무리한 상태(해당 명령을 서버가 처리하는 상태)에서 EOF 신호는 서버 처리 뒤 종료되며, 명령 입력을 기다리는 상태 EOF 신호는 바로 종료한다.

단일 사용자 모드는 정교한 명령행 편집 기능을 제공하지 않는다(예를 들어 명령 내역 보기 같은 것). 또한 단일 사용자 모드에서는 자동 체크포인트나, 복제 같은 백그라운드 프로세스가 실행되지 않는다.

예제

일반적인 postgres 백그라운드 실행 방법:

$ nohup postgres >logfile 2>&1 </dev/null &

postgres 서버 포트를 바꿔서(예, 1234) 실행:

$ postgres -p 1234

이렇게 실행된 서버로 접속하려면, psql 명령에서는 -p 옵션을 사용해서 접속한다.

$ psql -p 1234

또는 PGPORT 환경 변수를 지정하고 접속:

$ export PGPORT=1234
$ psql

서버 환경 설정 값을 지정해서 실행 하는 방법:

$ postgres -c work_mem=1234
$ postgres --work-mem=1234

이 경우, postgresql.conf 파일에서 지정한 work_mem 설정값은 무시된다. 환경 설정 변수 이름으로 사용되는 밑줄(_) 문자는 명령행에서는 중간줄(-) 문자로 바꿔 사용한다. 물론 -c 옵션을 사용하는 경우는 환경 설정 변수 이름 그대로 사용하면 된다.

관련 항목

initdb, pg_ctl