CREATE DATABASE — 새 데이터베이스 생성하기

CREATE DATABASE — 새 데이터베이스 생성하기

CREATE DATABASE 명령은 새 PostgreSQL 데이터베이스를 생성하는 명령이에요. 기본적으로 표준 시스템 데이터베이스 template1을 복제해 만들어요.

출처: PostgreSQL 문서

본문

Synopsis

CREATE DATABASE name
    [ WITH ] [ OWNER [=] user_name ]
           [ TEMPLATE [=] template ]
           [ ENCODING [=] encoding ]
           [ STRATEGY [=] strategy ]
           [ LOCALE [=] locale ]
           [ LC_COLLATE [=] lc_collate ]
           [ LC_CTYPE [=] lc_ctype ]
           [ BUILTIN_LOCALE [=] builtin_locale ]
           [ ICU_LOCALE [=] icu_locale ]
           [ ICU_RULES [=] icu_rules ]
           [ LOCALE_PROVIDER [=] locale_provider ]
           [ COLLATION_VERSION = collation_version ]
           [ TABLESPACE [=] tablespace_name ]
           [ ALLOW_CONNECTIONS [=] allowconn ]
           [ CONNECTION LIMIT [=] connlimit ]
           [ IS_TEMPLATE [=] istemplate ]
           [ OID [=] oid ]

Description

CREATE DATABASE는 새 PostgreSQL 데이터베이스를 생성해요.

데이터베이스를 생성하려면 슈퍼유저이거나 특별한 CREATEDB 권한을 가져야 해요. CREATE ROLE을 참고해요.

기본적으로 새 데이터베이스는 표준 시스템 데이터베이스 template1을 복제해 생성돼요. TEMPLATE *name*을 작성해 다른 템플릿을 지정할 수 있어요. 특히 TEMPLATE template0을 작성하면, 사용자 정의 객체가 없고 시스템 객체가 수정되지 않은, 여러분의 PostgreSQL 버전에 미리 정의된 표준 객체만 담긴 깨끗한(pristine) 데이터베이스를 만들 수 있어요. 이는 template1에 추가됐을 수 있는 설치 로컬 객체를 복사하는 것을 피하고 싶을 때 유용해요.

Parameters

name

생성할 데이터베이스의 이름이에요.

user_name

새 데이터베이스를 소유할 사용자의 역할 이름이에요. 기본값(즉 명령을 실행하는 사용자)을 사용하려면 DEFAULT를 써요. 다른 역할이 소유한 데이터베이스를 생성하려면 그 역할로 SET ROLE을 할 수 있어야 해요.

template

새 데이터베이스를 만들 템플릿의 이름이에요. 기본 템플릿(template1)을 사용하려면 DEFAULT를 써요.

encoding

새 데이터베이스에 사용할 문자 집합 인코딩이에요. 문자열 상수(예: 'SQL_ASCII'), 정수 인코딩 번호, 또는 기본 인코딩(즉 템플릿 데이터베이스의 인코딩)을 사용하려면 DEFAULT를 지정해요. PostgreSQL 서버가 지원하는 문자 집합은 23.3.1 절에 설명되어 있어요. 추가 제한 사항은 아래를 참고해요.

strategy

새 데이터베이스를 만드는 데 사용할 전략이에요. WAL_LOG 전략을 사용하면 데이터베이스가 블록별로 복사되고 각 블록이 쓰기 전 로그(write-ahead log)에 개별적으로 기록돼요. 이는 템플릿 데이터베이스가 작을 때 가장 효율적인 전략이라 기본값이에요. 더 오래된 FILE_COPY 전략도 사용할 수 있어요. 이 전략은 대상 데이터베이스가 사용하는 각 테이블스페이스에 대해 쓰기 전 로그에 작은 레코드를 작성해요. 각 레코드는 파일시스템 수준에서 전체 디렉토리를 새 위치로 복사하는 것을 나타내요. 이는 특히 템플릿 데이터베이스가 클 때 쓰기 전 로그 양을 크게 줄이지만, 시스템이 새 데이터베이스 생성 전후에 모두 체크포인트를 수행하게 강제해요. 어떤 상황에서는 이것이 전체 시스템 성능에 눈에 띄는 부정적 영향을 줄 수 있어요. FILE_COPY 전략은 file_copy_method 설정의 영향을 받아요.

locale

새 데이터베이스의 기본 콜레이션 정렬 순서와 문자 분류를 설정해요. 콜레이션은 예를 들어 ORDER BY가 있는 쿼리에서 문자열에 적용되는 정렬 순서와, 텍스트 컬럼의 인덱스에서 사용되는 순서에 영향을 미쳐요. 문자 분류는 문자 범주화(예: 소문자, 대문자, 숫자)에 영향을 미쳐요. 또한 운영체제 환경의 관련 측면인 LC_COLLATELC_CTYPE도 설정해요. 기본값은 템플릿 데이터베이스와 동일한 설정이에요. 자세한 내용은 23.2.2.3.1 절과 23.2.2.3.2 절을 참고해요.

lc_collate, lc_ctype, builtin_locale, 또는 *icu_locale*을 개별적으로 설정해 재정의할 수 있어요.

*locale_provider*가 builtin이면 locale 또는 *builtin_locale*이 반드시 지정되어야 하고 C, C.UTF-8, 또는 PG_UNICODE_FAST 중 하나여야 해요.

팁 (Tip)

다른 로케일 설정인 lc_messages, lc_monetary, lc_numeric, lc_time은 데이터베이스별로 고정되지 않으며 이 명령으로 설정되지 않아요. 특정 데이터베이스의 기본값으로 만들고 싶다면 ALTER DATABASE ... SET을 사용할 수 있어요.

lc_collate

데이터베이스 서버의 운영체제 환경에서 LC_COLLATE를 설정해요. 기본값은 *locale*이 지정된 경우 그 설정이고, 그렇지 않으면 템플릿 데이터베이스와 같은 설정이에요. 추가 제한 사항은 아래를 참고해요.

*locale_provider*가 libc이면, 새 데이터베이스에 사용할 기본 콜레이션 정렬 순서도 설정해서 locale 설정을 재정의해요.

lc_ctype

데이터베이스 서버의 운영체제 환경에서 LC_CTYPE을 설정해요. 기본값은 *locale*이 지정된 경우 그 설정이고, 그렇지 않으면 템플릿 데이터베이스와 같은 설정이에요. 추가 제한 사항은 아래를 참고해요.

*locale_provider*가 libc이면, 새 데이터베이스에 사용할 기본 문자 분류도 설정해서 locale 설정을 재정의해요.

builtin_locale

데이터베이스 기본 콜레이션 정렬 순서와 문자 분류를 위한 builtin 프로바이더 로케일을 지정해서 locale 설정을 재정의해요. 로케일 프로바이더는 builtin이어야 해요. 기본값은 *locale*이 지정된 경우 그 설정이고, 그렇지 않으면 템플릿 데이터베이스와 같은 설정이에요.

builtin 프로바이더에 사용 가능한 로케일은 C, C.UTF-8, PG_UNICODE_FAST예요.

icu_locale

데이터베이스 기본 콜레이션 정렬 순서와 문자 분류를 위한 ICU 로케일(23.2.2.3.2 절 참고)을 지정해서 locale 설정을 재정의해요. 로케일 프로바이더는 ICU여야 해요. 기본값은 *locale*이 지정된 경우 그 설정이고, 그렇지 않으면 템플릿 데이터베이스와 같은 설정이에요.

icu_rules

이 데이터베이스의 기본 콜레이션 동작을 사용자 지정하는 추가 콜레이션 규칙을 지정해요. 이 기능은 ICU에서만 지원돼요. 자세한 내용은 23.2.3.4 절을 참고해요.

locale_provider

이 데이터베이스의 기본 콜레이션에 사용할 프로바이더를 지정해요. 가능한 값은 builtin, icu (서버가 ICU 지원으로 빌드된 경우), libc예요. 기본적으로 프로바이더는 *template*과 동일해요. 자세한 내용은 23.1.4 절을 참고해요.

collation_version

데이터베이스와 함께 저장할 콜레이션 버전 문자열을 지정해요. 보통은 생략해야 하며, 생략하면 운영체제가 제공하는 데이터베이스 콜레이션의 실제 버전에서 버전이 계산돼요. 이 옵션은 기존 설치에서 버전을 복사하기 위해 pg_upgrade가 사용하도록 만들어진 거예요.

데이터베이스 콜레이션 버전 불일치를 처리하는 방법은 ALTER DATABASE도 참고해요.

tablespace_name

새 데이터베이스와 연결될 테이블스페이스의 이름이에요. 템플릿 데이터베이스의 테이블스페이스를 사용하려면 DEFAULT를 써요. 이 테이블스페이스는 이 데이터베이스에서 생성되는 객체에 사용되는 기본 테이블스페이스가 돼요. 자세한 내용은 CREATE TABLESPACE를 참고해요.

allowconn

false면 아무도 이 데이터베이스에 연결할 수 없어요. 기본값은 true로, 연결을 허용해요 (GRANT/REVOKE CONNECT 같은 다른 메커니즘으로 제한되지 않는 한).

connlimit

이 데이터베이스에 만들 수 있는 동시 연결 수예요. -1 (기본값)은 제한 없음을 뜻해요.

istemplate

true면 CREATEDB 권한이 있는 모든 사용자가 이 데이터베이스를 복제할 수 있어요. false(기본값)면 슈퍼유저 또는 데이터베이스 소유자만 복제할 수 있어요.

oid

새 데이터베이스에 사용할 객체 식별자예요. 이 매개변수를 지정하지 않으면 PostgreSQL이 적절한 OID를 자동으로 선택해요. 이 매개변수는 주로 pg_upgrade의 내부 사용을 위한 것이며, 16384보다 작은 값을 지정할 수 있는 것은 pg_upgrade뿐이에요.

선택적 매개변수는 위에 설명된 순서뿐 아니라 어떤 순서로든 작성할 수 있어요.

Notes

CREATE DATABASE는 트랜잭션 블록 안에서는 실행할 수 없어요.

"데이터베이스 디렉토리를 초기화할 수 없음(could not initialize database directory)" 같은 오류는 데이터 디렉토리의 권한 부족, 디스크 가득 참, 또는 다른 파일시스템 문제와 가장 관련이 깊어요.

데이터베이스를 제거하려면 DROP DATABASE를 사용해요.

createdb 프로그램은 이 명령의 래퍼 프로그램으로, 편의를 위해 제공돼요.

데이터베이스 수준 구성 매개변수(ALTER DATABASE로 설정)와 데이터베이스 수준 권한(GRANT로 설정)은 템플릿 데이터베이스에서 복사되지 않아요.

template1이 아닌 데이터베이스를 템플릿으로 지정해 복사하는 것도 가능하지만, 이는 (아직) 범용 "COPY DATABASE" 기능으로 의도된 것이 아니에요. 주된 제한은 복사되는 동안 템플릿 데이터베이스에 다른 세션이 연결될 수 없다는 거예요. CREATE DATABASE는 시작할 때 다른 연결이 존재하면 실패해요. 그렇지 않으면 템플릿 데이터베이스에 대한 새 연결은 CREATE DATABASE가 완료될 때까지 잠겨요. 자세한 내용은 22.3 절을 참고해요.

새 데이터베이스에 지정된 문자 집합 인코딩은 선택한 로케일 설정(LC_COLLATELC_CTYPE)과 호환되어야 해요. 로케일이 C (동등하게 POSIX)이면 모든 인코딩이 허용되지만, 다른 로케일 설정에서는 제대로 작동하는 인코딩이 하나뿐이에요. (다만 Windows에서는 UTF-8 인코딩을 어떤 로케일과도 사용할 수 있어요.) CREATE DATABASE는 슈퍼유저가 로케일 설정과 무관하게 SQL_ASCII 인코딩을 지정하는 것을 허용하지만, 이 선택은 더 이상 권장되지 않으며 로케일과 인코딩이 호환되지 않는 데이터가 데이터베이스에 저장되면 문자 문자열 함수의 잘못된 동작을 초래할 수 있어요.

인코딩과 로케일 설정은 template0을 템플릿으로 사용하는 경우를 제외하고 템플릿 데이터베이스의 것과 일치해야 해요. 이는 다른 데이터베이스가 지정된 인코딩과 일치하지 않는 데이터를 포함하거나, LC_COLLATELC_CTYPE의 영향을 받는 정렬 순서를 가진 인덱스를 포함할 수 있기 때문이에요. 그런 데이터를 복사하면 새 설정에 따라 손상된 데이터베이스가 생길 수 있어요. 하지만 template0은 영향을 받을 데이터나 인덱스를 포함하지 않는 것으로 알려져 있어요.

현재 비결정적 비교(설명은 CREATE COLLATION 참고)를 가진 데이터베이스 로케일을 사용하는 옵션은 없어요. 이것이 필요하다면 컬럼별 콜레이션을 사용해야 해요.

CONNECTION LIMIT 옵션은 대략적으로만 적용돼요. 데이터베이스에 연결 "슬롯"이 하나만 남았을 때 두 개의 새 세션이 거의 동시에 시작되면 둘 다 실패할 수 있어요. 또한 이 제한은 슈퍼유저나 백그라운드 워커 프로세스에는 적용되지 않아요.

Examples

새 데이터베이스를 생성하기:

CREATE DATABASE lusiadas;

사용자 salesapp이 소유하고 기본 테이블스페이스가 salesspace인 데이터베이스 sales를 생성하기:

CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;

다른 로케일로 데이터베이스 music을 생성하기:

CREATE DATABASE music
    LOCALE 'sv_SE.utf8'
    TEMPLATE template0;

이 예에서 지정된 로케일이 template1의 것과 다르면 TEMPLATE template0 절이 필요해요. (그렇지 않으면 로케일을 명시적으로 지정하는 것이 중복돼요.)

다른 로케일과 다른 문자 집합 인코딩으로 데이터베이스 music2를 생성하기:

CREATE DATABASE music2
    LOCALE 'sv_SE.iso885915'
    ENCODING LATIN9
    TEMPLATE template0;

지정된 로케일과 인코딩 설정은 일치해야 하며, 그렇지 않으면 오류가 보고돼요.

로케일 이름은 운영체제마다 다르므로 위 명령이 모든 곳에서 동일하게 작동하지 않을 수 있다는 점을 참고하세요.

Compatibility

SQL 표준에는 CREATE DATABASE 문이 없어요. 데이터베이스는 카탈로그와 동등하며, 그 생성은 구현 정의로 남아 있어요.

더 알아보기 (Learn more)