데이터베이스 PostrageSQL- 데이터베이스 서버 시작

18.3. 데이터베이스 서버 시작

누구나 데이터베이스에 액세스하려면 먼저 데이터베이스 서버를 시작해야합니다. 데이터베이스 서버 프로그램은 postgres이며 필요한 데이터를 찾을 수있는 위치를 알아야합니다. 이것은 -D 옵션으로 수행됩니다. 따라서 서버를 시작하는 가장 쉬운 방법은 다음과 같습니다.

$ postgres -D /usr/local/pgsql/data

이렇게하면 서버가 포 그라운드에서 실행됩니다. 이 단계는 작동하려면 PostgreSQL 사용자 계정으로 로그인해야합니다. -D 옵션이 없으면 서버는 환경 변수 PGDATA로 명명 된 디렉토리를 사용하려고 시도합니다. 이 환경 변수가 제공되지 않으면 실패합니다.

일반적으로 백그라운드에서 postgres를 시작하는 것이 가장 좋습니다. 이렇게하려면 일반적인 Unix 셸 구문을 사용합니다.
$ postgres -D / usr / local / pgsql / data> logfile 2> & 1 &

위와 같이 서버의 stdout 및 stderr 출력을 어딘가에 저장하는 것은 매우 중요합니다. 이는 감사 목적 및 문제 진단에 유용합니다 (로그 파일 처리에 대한보다 심층적 인 논의는 (24.3 절) 참조).

postgres는 다른 명령 줄 옵션도 허용합니다. 자세한 내용은 postgres 참조 페이지와 아래 19 장을 참조하십시오. 이러한 쉘 구문은 쉽게 지루해질 수 있습니다. 따라서 일부 작업을 단순화하기 위해 래퍼 프로그램 pg_ctl을 제공합니다.
예 :

pg_ctl start -l logfile

백그라운드에서 서버를 시작하고 지정된 로그 파일에 출력을 저장합니다. -D 옵션은 postgres와 동일합니다. pg_ctl을 사용하여 서버를 중지 할 수도 있습니다.

일반적으로 컴퓨터가 시작될 때 데이터베이스 서버를 시작하려고합니다. 자동 시작 스크립트는 운영 체제에 따라 다릅니다. PostgreSQL은 contrib / start-scripts 디렉토리에서 여러 가지를 제공합니다. 설치하려면 루트 권한이 필요합니다.

시스템마다 부팅시 데몬을 시작하는 습관이 다릅니다. 많은 시스템에는 /etc/rc.local 또는 /etc/rc.d/rc.local. 다른 사람들은 init.d 또는 rc.d 디렉토리를 사용합니다. 어떤 작업을 수행하든 루트 또는 다른 사용자가 아닌 PostgreSQL 사용자 계정으로 서버를 시작해야합니다. 따라서 명령에 su postgres -c '...'를 사용해야합니다. 예 :

su postgres -c 'pg_ctl start -D /usr/local/pgsql/data -l serverlog'

다음은 운영 체제와 더 관련이있는 몇 가지 제안 사항입니다 (각 경우 공통 값을 표시하는 올바른 설치 디렉토리와 사용자 이름을 사용해야합니다).

  • FreeBSD의 경우 PostgreSQL 소스 배포에서 contrib / start-scripts / freebsd 파일을 찾습니다.
  • OpenBSD에서 /etc/rc.local 파일에 다음 줄을 추가합니다 :
if [ -x /usr/local/pgsql/bin/pg_ctl -a -x /usr/local/pgsql/bin/postgres ];
 then
 su -l postgres -c '/usr/local/pgsql/bin/pg_ctl start -s -l /var/
postgresql/log -D /usr/local/pgsql/data'
 echo -n ' postgresql'
fi
  • Linux 시스템 또는 Linux 시스템에 /usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data추가되며 PostgreSQL 소스 코드 릴리스에서도 파일을 찾을 수 있습니다 ./etc/rc.d/rc.local/etc/rc.localcontrib/start-scripts/linux

systemd를 사용할 때 다음 서비스 유닛 파일 (예 : / etc /

systemd/system/postgresql.service):
[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
[Service]
Type=notify
User=postgres
ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0
[Install]
WantedBy=multi-user.target

Type = notify를 사용하려면 서버의 바이너리 파일이 configure --with-systemd로 컴파일되어야합니다.

시간 제한 설정을주의 깊게 고려하십시오. 이 문서를 작성할 당시 systemd의 기본 제한 시간은 90 초이며이 기간 내에 준비가보고되지 않은 프로세스를 종료합니다. 그러나 PostgreSQL 서버는 충돌 복구로 인해 시작 프로세스가 기본 시간을 크게 초과 할 수 있습니다. 시간 초과 논리를 사용하지 않으려면 권장되는 값은 0입니다.

  • NetBSD에서는 선호도에 따라 FreeBSD 또는 Linux 시작 스크립트를 선택할 수 있습니다.
  • Solaris에서는 다음 줄을 사용하여 /etc/init.d/postgresql이라는 파일을 만듭니다.
su - postgres -c "/usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data"

그런 다음 /etc/rc3.d에서 가리키는 심볼릭 링크 S99postgresql을 만듭니다.

서버가 실행 중일 때 PID는 데이터 디렉토리의 postmaster.pid 파일에 저장됩니다. 이렇게하면 여러 서버 인스턴스가 동일한 데이터 디렉토리에서 실행되는 것을 방지 할 수 있으며 서버를 종료하는 데 사용할 수도 있습니다.

18.3.1. 서버 시작 실패

서버가 시작되지 않는 몇 가지 일반적인 이유가 있습니다. 서버 로그를 확인하거나 수동 시작 방법을 사용하여 (표준 출력 또는 표준 오류를 리디렉션하지 않음) 어떤 오류 메시지가 나타나는지 확인할 수 있습니다. 아래에서는 가장 일반적인 오류 메시지 중 일부를 자세히 설명합니다.

LOG: could not bind IPv4 address "127.0.0.1": Address already in use
HINT: Is another postmaster already running on port 5432? If not, wait a few
 seconds and retry.
FATAL: could not create any TCP/IP sockets

메시지에서 알 수 있듯이 이는 서버가 이미 실행중인 포트에서 다른 서버를 시작하려고한다는 의미입니다. 그러나 핵심 오류 메시지가 그렇지 Address already in use않거나 그 변형이 아니면 다른 것일 수 있습니다. 예를 들어 예약 된 포트에서 서버를 시작하려고하면 다음 메시지가 표시됩니다.

$ postgres -p 666
LOG: could not bind IPv4 address "127.0.0.1": Permission denied
HINT: Is another postmaster already running on port 666? If not, wait a few
 seconds and retry.
FATAL: could not create any TCP/IP sockets

다음과 같은 메시지 :

FATAL: could not create shared memory segment: Invalid argument
DETAIL: Failed system call was shmget(key=5440001, size=4011376640, 03600).

공유 메모리 영역에 대한 커널의 제한이 PostgreSQL이 생성하려는 작업 영역 (이 예에서는 4011376640 바이트)보다 작다는 의미 일 수 있습니다. 또는 커널에 System-V 스타일 공유 메모리 지원이 전혀 구성되지 않았 음을 의미 할 수 있습니다. 임시 해결책으로 정상적인 버퍼 수 (shared_buffers)보다 적은 수로 서버를 시작할 수 있습니다. 결국 커널을 재구성하여 공유 메모리의 허용 가능한 크기를 늘리는 것이 좋습니다. 이 오류는 동일한 시스템에서 여러 서버를 시작하려고 할 때에도보고되며 필요한 총 공간이 커널 제한을 초과합니다. 다음과 같은 오류 :

FATAL: could not create semaphores: No space left on device
DETAIL: Failed system call was semget(5440126, 17, 03600).

디스크 공간이 부족하다는 의미는 아닙니다. 이는 System V 세마포어에 대한 커널의 제한이 PostgreSQL이 생성하려는 수보다 적다는 것을 의미합니다. 위와 같이 허용 된 연결 수 (max_connections)를 줄임으로써이 제한을 피할 수 있지만 결국 커널 제한을 늘려야합니다.

"불법 시스템 호출"오류가 발생하면 커널이 공유 메모리 또는 세마포어를 전혀 지원하지 않는 것일 수 있습니다. 이 경우 유일한 옵션은 커널을 재구성하고 이러한 기능을 켜는 것입니다. System V IPC 기능 구성에 대한 자세한 내용은 섹션 18.4.1을 참조하십시오.

18.3.2. 클라이언트 연결 문제

클라이언트 측에서 발생할 수있는 오류 조건은 광범위하고 응용 프로그램과 관련이 있지만 실제로 서버 시작 방법과 직접 관련된 몇 가지가 있습니다. 아래 언급 된 오류 이외의 모든 문제는 해당 클라이언트 응용 프로그램 설명서에 있어야합니다.

psql: could not connect to server: Connection refused
 Is the server running on host "server.joe.com" and accepting
 TCP/IP connections on port 5432?

이것은 일반적인 "대화 할 서버를 찾을 수 없습니다"오류입니다. 위의 상황은 TCP / IP 통신을 시도 할 때 발생하는 것 같습니다. 일반적인 실수는 TCP / IP 연결을 허용하도록 서버를 구성하는 것을 잊는 것입니다.

또한 Unix 도메인 소켓을 통해 로컬 서버와 통신하려고하면 다음과 같은 내용이 표시됩니다.

psql: could not connect to server: No such file or directory
 Is the server running locally and accepting
 connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

마지막 줄은 클라이언트가 올바른 위치에 연결을 시도하고 있는지 확인합니다. 실제로 실행중인 서버가없는 경우 일반적인 핵심 오류 메시지는 Connection refused또는입니다 No such file or directory(이 환경에서 연결이 거부되었다고해서 서버가 연결 요청을 받고 거부했음을 의미하지는 않습니다. 섹션 20.15에 표시된대로 다른 메시지). 이와 같은 다른 Connection timed out메시지는 네트워크 연결 부족과 같은 더 기본적인 문제를 나타낼 수 있습니다.

추천

출처blog.csdn.net/weixin_42528266/article/details/108593536