21.3. Шаблонные базы данных#

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 и может быть удалена и воссоздана при необходимости.