22.3. Шаблоны баз данных
По факту команда CREATE DATABASE
выполняет копирование существующей базы данных. По умолчанию копируется стандартная системная база template1
. Таким образом, template1
это шаблон, на основе которого создаются новые базы. Если добавить объекты в template1
, то впоследствии они будут копироваться в новые базы данных. Это позволяет внести изменения в стандартный набор объектов. Например, если в template1
установить процедурный язык PL/Perl, то он будет доступен в новых базах без дополнительных действий.
Также существует вторая системная база 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
, и может быть удалена и повторно создана при необходимости.