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

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

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

CREATE DATABASE на самом деле работает путем копирования существующей базы данных. По умолчанию она копирует стандартную системную базу данных с именем template1. Таким образом, эта база данных является шаблоном, из которого создаются новые базы данных. Если вы добавляете объекты в template1, эти объекты будут скопированы в последующе созданные пользовательские базы данных. Такое поведение позволяет вносить локальные изменения в стандартный набор объектов в базах данных. Например, если вы устанавливаете процедурный язык PL/Perl в template1, он будет автоматически доступен в пользовательских базах данных без каких-либо дополнительных действий при создании этих баз данных.

Однако, CREATE DATABASE не копирует разрешения уровня базы данных GRANT, прикрепленные к исходной базе данных. Новая база данных имеет разрешения уровня базы данных по умолчанию.

Есть вторая стандартная системная база данных с именем template0. Эта база данных содержит те же данные, что и исходное содержимое template1, то есть только стандартные объекты, предопределенные вашей версией Tantor BE. 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 и может быть удалена и воссоздана при необходимости.