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
로 표시된다.
양쪽 template0
및 template1
은 datistemplate = true
로 항상 표시되어야 한다.
template1
및 template0
은 이름 template1
이 CREATE DATABASE
의 기본 소스 데이터베이스 이름이라는 사실 외에는 특별한 상태를 나타내지 않는다.
예를 들면, template1
를 삭제하고, 부작용 없이 template0
으로부터 재생성 가능하다. 이러한 작업 과정은 template1
에 잘못 추가한 것이 많을 경우에 바람직할 수 있다.
(template1
을 삭제하려면 pg_database.datistemplate = false
여야 한다.)
데이터베이스 클러스터가 초기화될 때 postgres
데이터베이스도 생성된다.
이 데이터베이스는 연결하는 사용자 및 애플리케이션의 기본 데이터베이스임을 의미한다.
이것은 단순히 template1
의 사본이며, 필요시 삭제 및 재생성이 가능하다.