GitHub

Базы данных

Андрей Аксенов

База данных (БД) — это именованная коллекция объектов, используемая для хранения и управления данными. Примерами таких объектов могут служить схемы, таблицы, индексы или представления.

Как правило, объект принадлежит одной базе данных и доступен только внутри нее. Некоторые объекты, такие как роли, принадлежат всему кластеру и доступны любой базе данных в кластере.

После инициализации кластера Greengage DB доступны несколько шаблонных (template) и используемых по умолчанию (default) баз данных. Эти базы данных не предназначены для изменения. Для хранения ваших данных создайте новую базу данных и определите в ней необходимые объекты.

Шаблонные и используемые по умолчанию БД

В только что инициализированном кластере Greengage DB доступны следующие шаблонные и используемые по умолчанию базы данных:

  • postgres

    postgres — база данных, которая может быть использована для административных подключений. Она также используется процессами запуска, процессом обнаружения взаимных блокировок (Global Deadlock Detector) и так далее.

  • template0

    База данных template0 используется для внутренних нужд СУБД Greengage. Вы можете использовать template0 для создания "чистой" базы данных, содержащей только стандартные объекты, определяемые при инициализации СУБД.

  • template1

    База данных template1 используется в качестве шаблона по умолчанию при создании новых баз данных.

ПРИМЕЧАНИЕ

Шаблонные и используемые по умолчанию базы данных не могут быть удалены.

Подключение к БД

Чтобы подключиться к кластеру Greengage DB впервые, используйте базу данных postgres. Сначала подключитесь к мастер-хосту и переключитесь на пользователя gpadmin. Затем подключитесь к базе данных postgres локально с помощью команды psql:

$ psql postgres

Таким же образом вы можете подключаться к новым базам данных, созданным вручную. Узнайте больше о локальном и удаленном подключении к базам данных в статье Подключение к Greengage DB с использованием psql.

ПРИМЕЧАНИЕ

Вы можете подключиться только к одной базе данных одновременно: кросс-запросы между разными базами данных не поддерживаются.

Создание новой БД

Чтобы создавать новые базы данных, роль должна иметь один из следующих атрибутов:

  • SUPERUSER

  • CREATEDB

Используйте команду CREATE DATABASE для создания новой базы данных:

CREATE DATABASE books_store;

Новая база данных создается клонированием шаблонной базы данных template1 со всеми объектами и данными, содержащимися в ней. Вы также можете явно указать базу данных для клонирования с помощью параметра TEMPLATE.

После создания базы данных можно подключиться к ней с помощью метакоманды \c:

\c books_store

Вывод должен выглядеть следующим образом:

You are now connected to database "books_store" as user "gpadmin".

Теперь можно создавать объекты баз данных: схемы, таблицы и т.д.

Чтобы разрешить конечным пользователям подключаться к созданной базе данных, используйте поле database в файле pg_hba.conf.

ПРИМЕЧАНИЕ

Вы можете использовать утилиту командной строки createdb для создания баз данных.

Изменение БД

Команда ALTER DATABASE позволяет изменять различные атрибуты базы данных, например, владельца базы данных, максимальное количество одновременных подключений или настройки по умолчанию. Данный запрос устанавливает максимальное количество одновременных подключений равным 10:

ALTER DATABASE books_store WITH CONNECTION LIMIT 10;

Данная команда задает путь поиска схемы по умолчанию для указанной базы данных с помощью параметра search_path:

ALTER DATABASE books_store SET search_path TO catalog, sales, public;

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

Просмотр информации о БД

Список БД

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

\l

В выводе вы можете увидеть владельца каждой базы данных, кодировку и другие настройки:

                                List of databases
    Name     |  Owner  | Encoding |  Collate   |   Ctype    |  Access privileges
-------------+---------+----------+------------+------------+---------------------
 books_store | gpadmin | UTF8     | en_US.utf8 | en_US.utf8 |
 postgres    | gpadmin | UTF8     | en_US.utf8 | en_US.utf8 |
 template0   | gpadmin | UTF8     | en_US.utf8 | en_US.utf8 | =c/gpadmin         +
             |         |          |            |            | gpadmin=CTc/gpadmin
 template1   | gpadmin | UTF8     | en_US.utf8 | en_US.utf8 | =c/gpadmin         +
             |         |          |            |            | gpadmin=CTc/gpadmin
(4 rows)

Вы также можете выполнить запрос к системной таблице pg_catalog.pg_database, чтобы получить информацию обо всех базах данных в кластере:

SELECT *
from pg_catalog.pg_database
ORDER BY datname;

Данный вывод показывает, что база данных books_store поддерживает до 10 одновременных подключений (столбец datconnlimit) и не может использоваться в качестве шаблона для создания новых баз данных (datistemplate имеет значение f):

   datname   | datdba | encoding | datcollate |  datctype  | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace |              datacl
-------------+--------+----------+------------+------------+---------------+--------------+--------------+---------------+--------------+------------+---------------+----------------------------------
 books_store |     10 |        6 | en_US.utf8 | en_US.utf8 | f             | t            |           10 |         12809 |          703 |          1 |          1663 |
 postgres    |     10 |        6 | en_US.utf8 | en_US.utf8 | t             | t            |           -1 |         12809 |          703 |          1 |          1663 |
 template0   |     10 |        6 | en_US.utf8 | en_US.utf8 | t             | f            |           -1 |         12809 |          703 |          1 |          1663 | {=c/gpadmin,gpadmin=CTc/gpadmin}
 template1   |     10 |        6 | en_US.utf8 | en_US.utf8 | t             | t            |           -1 |         12809 |          703 |          1 |          1663 | {=c/gpadmin,gpadmin=CTc/gpadmin}
(4 rows)

Настройки по умолчанию

Чтобы увидеть настройки по умолчанию для различных сочетаний ролей и баз данных, используйте метакоманду \drds:

\drds

Результат показывает значение search_path для базы данных books_store:

                    List of settings
 Role |  Database   |              Settings
------+-------------+------------------------------------
      | books_store | search_path=catalog, sales, public

Вы также можете использовать системную таблицу pg_catalog.pg_db_role_setting, чтобы узнать, какие значения конфигурации сервера используются по умолчанию для каждой комбинации роли и базы данных:

SELECT *
FROM pg_catalog.pg_db_role_setting;

Мониторинг и статистика

Greengage DB предоставляет различные средства для мониторинга созданных баз данных. Ниже приведено несколько примеров:

  • Функция pg_database_size() позволяет узнать размер базы данных:

    SELECT pg_size_pretty(pg_database_size('books_store'));

    Результат может выглядеть так:

     pg_size_pretty
    ----------------
     65 MB
  • Системное представление pg_catalog.pg_stat_database выводит статистику по каждой базе данных кластера:

    SELECT *
    FROM pg_catalog.pg_stat_database;

    Результат может выглядеть следующим образом:

     datid  |   datname   | numbackends | xact_commit | xact_rollback | blks_read | blks_hit | tup_returned | tup_fetched | tup_inserted | tup_updated | tup_deleted | conflicts | temp_files | temp_bytes | deadlocks | blk_read_time | blk_write_time |          stats_reset
    --------+-------------+-------------+-------------+---------------+-----------+----------+--------------+-------------+--------------+-------------+-------------+-----------+------------+------------+-----------+---------------+----------------+-------------------------------
          1 | template1   |           0 |          69 |            12 |       274 |    43721 |        76827 |       58772 |            0 |           0 |           0 |         0 |          0 |          0 |         0 |             0 |              0 | 2025-03-10 14:22:37.336925+00
      12809 | template0   |           0 |           0 |             0 |         0 |        0 |            0 |           0 |            0 |           0 |           0 |         0 |          0 |          0 |         0 |             0 |              0 |
      12812 | postgres    |           0 |          19 |             6 |       112 |     7935 |        13661 |       13056 |            0 |           0 |           0 |         0 |          0 |          0 |         0 |             0 |              0 | 2025-03-10 14:22:36.43759+00
      16385 | books_store |           1 |          14 |             0 |       102 |     5003 |         7158 |        7157 |            4 |           0 |           0 |         0 |          0 |          0 |         0 |             0 |              0 | 2025-03-10 14:46:21.281755+00
    (4 rows)

Удаление БД

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

  • Удаление базы данных необратимо.

  • Команда DROP DATABASE не является транзакционной.

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

\c postgres

Затем используйте команду DROP DATABASE для удаления базы данных:

DROP DATABASE books_store;

Следует учитывать, что активные клиентские подключения могут препятствовать удалению базы данных:

ERROR:  database "books_store" is being accessed by other users
DETAIL:  There is 1 other session using the database.

В этом случае их необходимо закрыть, как описано в разделе Остановка клиентских запросов и процессов.

ПРИМЕЧАНИЕ

Вы также можете использовать утилиту командной строки dropdb для удаления баз данных.