22.3. 템플릿 데이터베이스

CREATE DATABASE는 실제로 기존 데이터베이스를 복사한다. 기본적으로 template1이라는 표준 시스템 데이터베이스를 복사한다. 따라서 해당 데이터베이스는 새 데이터베이스를 만드는 템플릿이다. 객체를 template1에 추가하면, 이 객체는 나중에 생성되는 사용자 데이터베이스로 복사된다. 이 작업은 데이터베이스의 표준 객체 집합에 대한 사이트-로컬 수정을 가능하게 한다. 예를 들면, template1에서 프로시저 언어 PL/Perl을 설치하는 경우 새로운 데이터베이스를 생성할 때 추가적인 작업 없이 사용자 데이터베이스가 자동으로 사용 가능하게 된다.

template0이라는 2차 표준 시스템 데이터베이스가 있다. 이 데이터베이스에는 template1의 초기 내용과 동일한 데이터가 포함되어 있다. 즉, PostgreSQL 버전에 의해 사전 정의된 표준 객체만 포함되어 있다. 데이터베이스 클러스터를 초기화한 후에는 template0을 절대 변경하면 안 된다. template1 대신 template0을 복사하도록 CREATE DATABASE를 실행하면 template1에 사용자가 추가한 객체들을 제외한 "초기, 완벽한 깡통" 사용자 데이터베이스를 생성할 수 있다. (사용자가 template1 데이터베이스에 추가한 것도 없고, 사용자가 시스템 카탈로그 정보를 변경하기 전 완벽한 초기 상태의 데이터베이스가 만들어진다.) 이것은 pg_dump 덤프를 복원할 때 특히 유용하다. 나중에 template1에 추가되었을 수도 있는 객체와 충돌 없이 덤프된 데이터베이스를 올바르게 재생성 하도록 깡통 데이터베이스에서 덤프 스크립트를 복원해야 한다.

template1 대신 template0을 복사하는 일반적인 다른 이유는, template1의 복사는 동일한 설정을 사용해야 하지만 template0을 복사하는 경우에는 새 인코딩 및 로케일(locale) 설정을 지정할 수 있기 때문이다. template1은 인코딩 또는 로케일(locale)에 관한 데이터를 포함하지만 template0은 그렇지 않다.

template0을 복사하여 데이터베이스를 생성하려면

CREATE DATABASE dbname TEMPLATE template0;

SQL 환경에서 다음을 사용해야 한다.

createdb -T template0 dbname

또는 쉘에서 다음을 사용해야 한다.

템플릿 데이터베이스를 추가적으로 생성하는 것이 가능하며, CREATE DATABASE의 경우 템플릿 이름을 지정하면 클러스터의 데이터베이스를 복사할 수도 있다. 그러나, 아직까지는 COPY DATABASE가 범용으로 사용되는 기능이 아니라는 점을 이해해야 한다. 이러한 제한은 복사 중인 소스 데이터베이스에 다른 세션을 연결할 수 없다는 것을 의미한다. 시작 시 다른 연결이 존재하면 CREATE DATABASE가 실패하며, 복사 명령 중에 소스 데이터베이스에 대한 새로운 연결이 방지된다.

데이터베이스별로 pg_database에는 datistemplate 칼럼 및 datallowconn 칼럼의 두 가지 유용한 플래그가 존재한다. datistemplate를 설정하여 데이터베이스가 CREATE DATABASE의 템플릿임을 나타낼 수 있다. 이 플래그가 설정되면 CREATEDB 권한이 있는 사용자가 데이터베이스를 복제할 수 있다. 설정되지 않으면 수퍼유저와 데이터베이스 소유자만 복제할 수 있다. datallowconn이 false인 경우 해당 데이터베이스에 대한 새로운 연결이 허용되지 않는다(단, 플래그를 false로 설정해도 기존 세션은 중단되지 않는다). template0 데이터베이스는 수정 방지를 위해 일반적으로 datallowconn = false로 표시된다. 양쪽 template0template1datistemplate = true로 항상 표시되어야 한다.

참고

template1template0은 이름 template1CREATE DATABASE의 기본 소스 데이터베이스 이름이라는 사실 외에는 특별한 상태를 나타내지 않는다. 예를 들면, template1를 삭제하고, 부작용 없이 template0으로부터 재생성 가능하다. 이러한 작업 과정은 template1에 잘못 추가한 것이 많을 경우에 바람직할 수 있다. (template1을 삭제하려면 pg_database.datistemplate = false여야 한다.)

데이터베이스 클러스터가 초기화될 때 postgres 데이터베이스도 생성된다. 이 데이터베이스는 연결하는 사용자 및 애플리케이션의 기본 데이터베이스임을 의미한다. 이것은 단순히 template1의 사본이며, 필요시 삭제 및 재생성이 가능하다.