Лекция 08. Базы данных
В этой главе:
- Кластер баз данных
- Базы данных
- Объекты баз данных
- Системный каталог
- Расширения
Кластер баз данных
Один экземпляр СУБД обслуживает сразу несколько баз данных. Все базы данных, обслуживаемые экземпляром, называют кластером баз данных.
Кластер создается командой initdb, которая создает сразу три базы данных: template1, template0 и postgres. Процедура создания баз данных определена в Backend Interface (BKI). https://www.postgresql.org/docs/15/bki.html.
Подробно о initdb: https://www.postgresql.org/docs/15/app-initdb.html.
Помимо исходных баз данных initdb создает необходимые для работы СУБД служебные файлы и каталоги, а также файлы конфигурации. Новые базы данных создаются путем копирования существующих.
Три базы данных создаются сразу:
– template1 - основной шаблон для создания новых баз данных; – template0 - шаблон, к которому по умолчанию нельзя подключиться, не предназначен для изменения; – postgres - специальная база данных для подключения суперпользователя postgres.
База данных postgres имеет специальное предназначение для подключения суперпользователя postgres.
База данных template1 используется в качестве шаблона, из которого создаются новые базы данных по умолчанию. К этой базе данных можно подключаться и изменять ее содержимое.
В отличие от предыдущей, база данных template0, хотя также и является шаблоном, но она не предназначена для подключения и ее не следует изменять. Базу данных template0 можно использовать для восстановления template1 при его порче, а также она используется при восстановлении из резервных копий и при необходимости создания новой базы данных с измененной кодировкой по сравнению с кодировкой, использованной при создании кластера баз данных.
Создание кластера БД
$ initdb -k
Файлы, относящиеся к этой СУБД, будут принадлежать пользователю "postgres". От его имени также будет запускаться процесс сервера.
Кластер баз данных будет инициализирован с локалью "ru_RU.UTF-8". Кодировка БД по умолчанию, выбранная в соответствии с настройками: "UTF8". Выбрана конфигурация текстового поиска по умолчанию "russian".
Контроль целостности страниц данных включён.
исправление прав для существующего каталога /pgdata/06/data... ок
создание подкаталогов... ок
выбирается реализация динамической разделяемой памяти... posix
Каталог данных определяется либо опцией -D, либо установкой переменной окружения PGDATA.
В примере опция -k включила контроль целостности данных на страницах.
Команда initdb предназначена для создания нового кластера баз данных. Кластер - коллекция баз данных, обслуживаемых одним экземпляром.
Команда initdb не будет работать, если ее запускает суперпользователь ОС root. Непривилегированный пользователь ОС (обычно postgres), запускающий эту команду, указывает путь к каталогу данных с помощью опции -D, на который этот пользователь должден иметь соответствующие права на запись. Если путь не указан, используется значение переменной окружения PGDATA. Пользователь ОС, создающий кластер становится исходным суперпользователем СУБД. Права на каталог данных обычно устанавливают с правами на чтение и запись только для выполнившего initdb пользователя. Например:
[postgres@p620 ~]$ ls -ld $PGDATA
drwx------ 24 postgres postgres 4096 окт 11 08:43 /pgdata/06/data
У initdb имеются опции -g и --allow-group-access, предоставляющими доступ на чтение к каталогу с данными при инициализации кластера. Это бывает необходимо для задач резервного копирования. Опция -k необходима для включения проверки контрольных сумм на страницах данных. Также имеются опции для установки настроек локализации, если необходимо чтобы они отличались от настроек ОС. https://www.postgresql.org/docs/15/app-initdb.html.
Базы данных
Исходные базы данных
[postgres@p620 ~]$ psql
psql (15.5)
Введите "help", чтобы получить справку.
postgres=# \l
Список баз данных
Имя | Владелец | Кодировка | LC_COLLATE | LC_CTYPE | локаль ICU | Провайдер локали | Права доступа
-----------+----------+-----------+------------+-----------+------------+------------------+-----------------------
| postgres | postgres | UTF8 | en_US.UTF8 | en_US.UTF8| | libc |
| template0| postgres | UTF8 | en_US.UTF8 | en_US.UTF8| | libc | =c/postgres postgres=CTc/postgres
| template1| postgres | UTF8 | en_US.UTF8 | en_US.UTF8| | libc | =c/postgres postgres=CTc/postgres
(3 строки)
После создания кластера с настройками по умолчанию к нему можно подключиться суперпользователем postgres.
Метакоманда \l позволяет получить список (list) баз данных.
При создании кластера командой initdb создаются три исходные базы данных:
- postgres - эта база данных нужна для подключений суперпользователя postgres, в ней обычно не хранят какие-либо бизнес-данные;
- template1 - шаблонная база данных, необходимая для создания других баз данных, ее содержимое можно изменять;
- template0 - шаблонная база данных, содержимое которой НЕ следует изменять.
https://www.postgresql.org/docs/15/app-initdb.html.
https://www.postgresql.org/docs/15/manage-ag-templatedbs.html.
Получить список баз данных в psql можно метакомандой \l . https://www.postgresql.org/docs/15/app-psql.html.
Создание и удаление базы данных
postgres=# CREATE DATABASE db1;
CREATE DATABASE
postgres=# \l db1
Список баз данных
Имя | Владелец | Кодировка | LC_COLLATE | LC_CTYPE | локаль ICU | Провайдер локали | Права доступа
-----+----------+-----------+------------+------------+------------+------------------+---------------
db1 | postgres | UTF8 | en_US.UTF8 | en_US.UTF8 | | libc |
(1 строка)
postgres=# DROP DATABASE db1;
DROP DATABASE
postgres=# \l db1
Список баз данных
Имя | Владелец | Кодировка | LC_COLLATE | LC_CTYPE | локаль ICU | Провайдер локали | Права доступа
-----+----------+-----------+------------+----------+------------+------------------+---------------
(0 строк)
Команды SQL CREATE DATABASE и DROP DATABASE, соответственно, предназначены для создания и удаления баз данных. При создании базы данных создаются необходимые структуры в файловой системе, а в метаданных записываются сведения о новой базе данных.
Все базы данных создаются с помощью копирования содержимого существующих баз данных.
По умолчанию команда CREATE DATABASE использует шаблон template1 для копирования его содержимого во вновь создаваемую базу данных, однако это может быть изменено. Например, при создании базы данных с кодировкой, отличающейся от кодировки кластера, необходимо будет использовать шаблон template0.
Создавать базы данных имеют право суперпользователи и пользователи, имеющие атрибут CREATEDB. https://www.postgresql.org/docs/current/sql-createdatabase.html.
Удалить базу данных может суперпользователь или ее владелец (исходно - пользователь, который ее создавал). Удалить базу, к которой есть подключения, нельзя. Операция удаления невозвратная, все данные будут удалены. https://www.postgresql.org/docs/15/sql-dropdatabase.html.
Для создания и удаления баз данных можно использовать утилиты командной строки ОС createdb и dropdb. [https://www.postgresql.org/docs/15/app-createdb.html https://www.postgresql.org/docs/15/app-dropdb.html](https://www.postgresql.org/docs/15/app-createdb.html https://www.postgresql.org/docs/15/app-dropdb.html).