22.3. Шаблоны баз данных
По факту команда CREATE DATABASE
выполняет копирование существующей базы данных. По умолчанию копируется стандартная системная база template1
. Таким образом, template1
это шаблон, на основе которого создаются новые базы. Если добавить объекты в template1
, то впоследствии они будут копироваться в новые базы данных. Это позволяет внести изменения в стандартный набор объектов. Например, если в template1
установить процедурный язык PL/Perl, то он будет доступен в новых базах без дополнительных действий.
Однако команда CREATE DATABASE
не копирует права GRANT
уровня базы из исходной БД. Новая база получает права уровня базы по умолчанию.
Также существует вторая системная база template0
. При инициализации она содержит те же самые объекты, что и template1
, предопределённые в рамках устанавливаемой версии PostgreSQL. В 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
не установлен, то новые подключения к этой базе не допустимы (однако текущие сеансы не закрываются при сбросе этого флага). База template0
обычно помечена как datallowconn = false
для избежания любых её модификаций. И template0
, и template1
всегда должны быть помечены флагом datistemplate = true
.
Примечание
template1
и template0
не выделены как-то особенно, кроме того факта, что template1
используется по умолчанию в команде CREATE DATABASE
. Например, можно удалить template1
и безболезненно создать заново из template0
. Это можно посоветовать в случае, если template1
был замусорен. (Чтобы удалить template1
, необходимо сбросить флаг pg_database.datistemplate = false
.)
База данных postgres
также создаётся при инициализации кластера. Она используется пользователями и приложениями для подключения по умолчанию. Представляет собой всего лишь копию template1
, и может быть удалена и повторно создана при необходимости.