Перейти к основному содержимому

Шаблоны баз данных

примечание

Эта страница переведена при помощи нейросети GigaChat.

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

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

Вторая стандартная база данных, называемая template0, содержит только минимальный набор базовых объектов, установленных экземпляром PostgreSQL. Ее не следует изменять после инициализации кластера. Копируя template0 вместо template1, получается чистая база данных, свободная от локальных модификаций, сделанных в template1. Это полезно при восстановлении резервных копий, так как гарантирует, что восстанавливаемый дамп будет воспроизведен без конфликта с изменениями, внесенными позднее в template1.

Еще одна важная особенность копирования template0 заключается в том, что при этом можно указать новое значение кодировки и региональные настройки, тогда как копия template1 вынуждена придерживаться текущих настроек.

Чтобы создать базу данных на основе template0, используйте следующую команду:

CREATE DATABASE dbname TEMPLATE template0;

Из среды SQL или из оболочки.

createdb -T template0 dbname

Дополнительно можно создавать и другие шаблоны баз данных, причем в качестве шаблона для команды CREATE 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 необходимо снять с него статус шаблона (pg_database.datistemplate = false).

Третья стандартная база данных — postgres — создается автоматически при инициализации кластера. Она выступает в роли стартового пункта для пользователей и приложений при подключении. Фактически, postgres — это обычная копия template1, которую при необходимости можно удалить и создать заново.