2016-10-14 2 views
2

초기화 스크립트에서 PostgreSQL 디렉토리를 초기화하려고하지만이 단계에서는 실행중인 PostgreSQL 서버가 필요하지 않습니다.PostgreSQL 서버를 실행하지 않고 PostgreSQL 데이터베이스를 초기화하는 방법

이 난 그냥 (사용자 postgres 등) 클러스터를 만들 경우 생각할 수 없을 것이다 :

initdb -D ... 

그러나, 나는 또한 PostgreSQL의 역할을 만들 데이터베이스를 작성하고도 (일부 확장 기능을 추가 할 필요가) 사용자 postgres 같이

createuser someuser 
createdb -O someuser somedb 
echo 'CREATE EXTENSION xyz;' | psql somedb 

후자의 명령은 실행중인 PostgreSQL 서버가 필요합니다. 따라서이 모든 일이 상당히 복잡해집니다 :

특히 PostgreSQL 서버를 기다리는 부분은 절대로 100 % 신뢰할 수 없습니다. 나는 많은 변종을 시험해 보았는데, 각각은 약 20 회 실행에 실패했다. 또한 프로세스를 강제 종료하는 것이 간단한 쉘 스크립트에서 100 % 신뢰할 수있는 것은 아니며 올바르게 중지 된 것은 아닙니다.

저는 이것이 서버 부트 스트랩이나 VM 이미지 준비와 관련된 모든 사용 사례에서 발생하는 표준 문제라고 생각합니다. 따라서 2016 년에는 기존의 현실적인 도구가 있어야합니다. 따라서 내 질문은 다음과 같습니다.

  • 더 간단하고 안정적인 방법이 있습니까?
  • 예를 들어 PostgreSQL 서버를 일부 특수 모드로 실행하는 방법이 있습니다.이 모드는 방금 시작되어 특정 SQL 명령을 실행하고 마지막 SQL 명령이 끝난 직후 종료됩니다.
  • 거친 아이디어로, 내부에서 PostgreSQL 테스트 스위트가이 용도로 재사용 될 수 있습니까?

답변

5

single-user mode을 찾고 있습니다.

이와 같이 PostgreSQL을 시작하면 표준 입력에서 SQL 문을 기다리는 수퍼 유저로 연결된 세션입니다. 연결을 끊으면 (파일 끝으로) 서버 프로세스가 중지됩니다.

그래서 당신은 (bash와) 같이 그것을 할 수 :

postgres --single -D /usr/local/pgsql/data postgres <<-"EOF" 
CREATE USER ...; 
CREATE DATABASE somedb ...; 
EOF 

postgres --single -D /usr/local/pgsql/data somedb <<-"EOF" 
CREATE EXTENSION ...; 
EOF 
+0

감사합니다! 단일 사용자 모드는 누락 된 힌트였습니다. 그러나 예제 코드에는 약간의 결함이 있습니다. 데이터베이스를 작성하기 전에 데이터베이스에 액세스하려고 시도합니다. 'postgres --single'은'postgres' 데이터베이스로 한 번, 그리고 나서 생성 된 데이터베이스로 두 번 실행해야합니다. – vog

+0

물론. dbname은 예제 일뿐입니다. 더 명확하게 답변을 업데이트하겠습니다. –

관련 문제