21.3. Шаблонные базы данных#
21.3. Шаблонные базы данных #
CREATE DATABASE
на самом деле работает путем копирования существующей базы данных. По умолчанию она копирует стандартную системную базу данных с именем template1
.
Таким образом, эта база данных является “шаблоном”, из которого создаются новые базы данных. Если вы добавляете объекты в template1
, эти объекты будут скопированы в последующе созданные пользовательские базы данных. Такое поведение позволяет вносить локальные изменения в стандартный набор объектов в базах данных. Например, если вы устанавливаете процедурный язык PL/Perl в template1
, он будет автоматически доступен в пользовательских базах данных без каких-либо дополнительных действий при создании этих баз данных.
Однако, CREATE DATABASE
не копирует разрешения уровня базы данных
GRANT
, прикрепленные к исходной базе данных.
Новая база данных имеет разрешения уровня базы данных по умолчанию.
Есть вторая стандартная системная база данных с именем template0
.
Эта база данных содержит те же данные, что и исходное содержимое template1
, то есть только стандартные объекты, предопределенные вашей версией Tantor SE-1C. template0
никогда не должен изменяться после инициализации кластера баз данных. При указании CREATE DATABASE
скопировать template0
вместо template1
, вы можете создать "чистую" пользовательскую базу данных (такую, в которой нет пользовательских объектов и системные объекты не были изменены), которая не содержит локальные дополнения в template1
. Это особенно удобно при восстановлении дампа pg_dump
: скрипт дампа должен быть восстановлен в чистой базе данных, чтобы гарантировать правильное воссоздание содержимого дампированной базы данных без конфликтов с объектами, которые могли быть добавлены в template1
позже.
Еще одна распространенная причина копирования template0
вместо template1
заключается в том, что при копировании template0
можно указать новые настройки кодировки и локали, в то время как копия template1
должна использовать те же настройки, что и оригинал. Это связано с тем, что template1
может содержать данные, зависящие от кодировки или локали, в то время как известно, что 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
и может быть удалена и воссоздана при необходимости.