Spec-Zone.ru › MySQL 9.2

25.6.11.1 Объекты данных на диске NDB Cluster

Хранение данных на диске NDB Cluster реализовано с использованием следующих объектов:

  • Пространство имен: Выступает в качестве контейнера для других объектов данных на диске. Пространство имен содержит один или несколько файлов данных и одну или несколько групп файлов журнала отката.

  • Файл данных: Хранит данные столбцов. Файл данных напрямую назначается пространству имен.

  • Файл журнала отката: Содержит информацию отката, необходимую для отмены транзакций. Назначается группе файлов журнала отката.

  • Группа файлов журнала: Содержит один или несколько файлов журнала отката. Назначается пространству имен.

Файлы журнала отката и файлы данных являются фактическими файлами в файловой системе каждого узла данных; по умолчанию они размещаются в ndb_node_id_fs в DataDir, указанном в файле конфигурации NDB Cluster config.ini, где node_id — идентификатор узла данных. Размещение этих файлов в других местах возможно, указав абсолютный или относительный путь в имени файла при создании файла журнала отката или файла данных. Команды для создания этих файлов показаны далее в этом разделе.

Файлы журнала отката используются только таблицами данных на диске и не нужны или не используются таблицами NDB, которые хранятся только в памяти.

Пространства имен и группы файлов журнала NDB Cluster не реализованы как файлы.

Хотя не все объекты данных на диске реализованы как файлы, все они используют одно и то же пространство имен. Это означает, что каждый объект данных на диске должен иметь уникальное имя (а не только каждый объект данных данного типа). Например, вы не можете иметь пространство имен и группу файлов журнала, оба с именем dd1.

Предполагая, что вы уже настроили NDB Cluster со всеми узлами (включая управляющие и SQL-узлы), основные шаги по созданию таблицы NDB Cluster на диске следующие:

  1. Создайте группу файлов журнала и назначьте один или несколько файлов журнала отката (файл журнала отката также иногда называется файлом отката).

  2. Создайте пространство имен; назначьте группу файлов журнала, а также один или несколько файлов данных пространству имен.

  3. Создайте таблицу данных на диске, использующую это пространство имен для хранения данных.

Каждая из этих задач может быть выполнена с помощью SQL-запросов в клиенте mysql или другом приложении-клиенте MySQL, как показано в следующем примере.

  1. Мы создаём группу файлов журнала под названием lg_1 с помощью CREATE LOGFILE GROUP. Эта группа файлов журнала должна состоять из двух файлов журнала отката, которые мы назовём undo_1.log и undo_2.log, начальный размер которых составляет 16 МБ и 12 МБ соответственно. (По умолчанию начальный размер файла журнала отката составляет 128 МБ.) По желанию, вы также можете указать размер буфера отката группы файлов журнала или разрешить использование значения по умолчанию — 8 МБ. В этом примере мы устанавливаем размер буфера UNDO в 2 МБ. Группа файлов журнала должна создаваться с файлом журнала отката; поэтому мы добавляем undo_1.log к lg_1 в этом CREATE LOGFILE GROUP операторе:

    CREATE LOGFILE GROUP lg_1
        ADD UNDOFILE 'undo_1.log'
        INITIAL_SIZE 16M
        UNDO_BUFFER_SIZE 2M
        ENGINE NDBCLUSTER;
    

    Для добавления undo_2.log в группу файлов журнала используйте следующий ALTER LOGFILE GROUP оператор:

    ALTER LOGFILE GROUP lg_1
        ADD UNDOFILE 'undo_2.log'
        INITIAL_SIZE 12M
        ENGINE NDBCLUSTER;
    

    Некоторые важные моменты:

    • Расширение файлов .log, используемое здесь, необязательно. Мы используем его только для удобной идентификации файлов журналов.

    • Каждый CREATE LOGFILE GROUP и ALTER LOGFILE GROUP оператор должен включать опцию ENGINE. Допустимые значения для этой опции — NDBCLUSTER и NDB.

      Важно

      В одном кластере NDB Cluster может существовать не более одной группы файлов журнала.

    • При добавлении файла журнала отката в группу файлов журнала с помощью ADD UNDOFILE 'filename', файл с именем filename создаётся в каталоге ndb_node_id_fs в DataDir каждого узла данных в кластере, где node_id — идентификатор узла данных. Каждый файл журнала отката имеет размер, указанный в операторе SQL. Например, если в кластере NDB Cluster 4 узла данных, то ALTER LOGFILE GROUP оператор, показанный выше, создаёт 4 файла журнала отката, по одному на каждом узле данных; каждый из этих файлов называется undo_2.log и имеет размер 12 МБ.

    • UNDO_BUFFER_SIZE ограничено объёмом доступной оперативной памяти.

    • Более подробную информацию об этих операторах см. в разделе 15.1.17, «Оператор CREATE LOGFILE GROUP» и разделе 15.1.6, «Оператор ALTER LOGFILE GROUP».

  2. Теперь мы можем создать табличное пространство — абстрактный контейнер для файлов, используемых таблицами с данными на диске для хранения данных. Табличное пространство ассоциировано с конкретной группой файлов журнала; при создании нового табличного пространства необходимо указать группу файлов журнала, используемую для журнала отката. Также необходимо указать по меньшей мере один файл данных; вы можете добавить дополнительные файлы данных в табличное пространство после его создания. Также возможно удаление файлов данных из табличного пространства (см. пример ниже в этом разделе).

    Предположим, мы хотим создать табличное пространство с именем ts_1, которое использует lg_1 в качестве группы файлов журнала. Мы хотим, чтобы табличное пространство содержало два файла данных с именами data_1.dat и data_2.dat, начальный размер которых составляет 32 МБ и 48 МБ соответственно. (Значение по умолчанию для INITIAL_SIZE составляет 128 МБ.) Это можно сделать с помощью двух операторов SQL, как показано здесь:

    CREATE TABLESPACE ts_1
        ADD DATAFILE 'data_1.dat'
        USE LOGFILE GROUP lg_1
        INITIAL_SIZE 32M
        ENGINE NDBCLUSTER;
    
    ALTER TABLESPACE ts_1
        ADD DATAFILE 'data_2.dat'
        INITIAL_SIZE 48M;
    

    Оператор CREATE TABLESPACE создаёт табличное пространство ts_1 с файлом данных data_1.dat и связывает ts_1 с группой файлов журнала lg_1. Оператор ALTER TABLESPACE добавляет второй файл данных (data_2.dat).

    Некоторые важные моменты:

    • Как и в случае с расширением файлов .log, используемым в этом примере для файлов журнала отката, расширение .dat файлов данных не имеет специального значения; оно используется только для удобной идентификации.

    • При добавлении файла данных в табличное пространство с помощью ADD DATAFILE 'filename', файл с именем filename создаётся в каталоге ndb_node_id_fs в DataDir каждого узла данных в кластере, где node_id — идентификатор узла данных. Каждый файл данных имеет размер, указанный в операторе SQL. Например, если в кластере NDB Cluster 4 узла данных, то оператор ALTER TABLESPACE, который был показан выше, создаёт 4 файла данных, по одному на каждом узле данных; каждый из этих файлов называется data_2.dat и имеет размер 48 МБ.

    • NDB резервирует 4% каждого табличного пространства для использования во время перезагрузки узлов данных. Этот объём не доступен для хранения данных.

    • Операторы CREATE TABLESPACE должны содержать клаузу ENGINE; только таблицы, использующие тот же движок хранения, что и табличное пространство, могут быть созданы в этом пространстве. Для NDB табличных пространств, ALTER TABLESPACE принимает клаузу ENGINE только для ALTER TABLESPACE ... ADD DATAFILE; ENGINE отбрасывается для любых других операторов ALTER TABLESPACE. Для NDB табличных пространств, допустимые значения для опции ENGINE — NDBCLUSTER и NDB.

    • Распределение экстентов выполняется в циклической последовательности среди всех файлов данных, используемых данным табличным пространством.

    • Более подробную информацию об операторах CREATE TABLESPACE и ALTER TABLESPACE см. в разделе 15.1.22, «Оператор CREATE TABLESPACE» и разделе 15.1.10, «Оператор ALTER TABLESPACE».

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

    CREATE TABLE dt_1 (
        member_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        last_name VARCHAR(50) NOT NULL,
        first_name VARCHAR(50) NOT NULL,
        dob DATE NOT NULL,
        joined DATE NOT NULL,
        INDEX(last_name, first_name)
        )
        TABLESPACE ts_1 STORAGE DISK
        ENGINE NDBCLUSTER;
    

    TABLESPACE ts_1 STORAGE DISK сообщает движку хранения NDB использовать табличное пространство ts_1 для хранения данных на диске.

    После создания таблицы ts_1, как показано, вы можете выполнять операторы INSERT, SELECT, UPDATE и DELETE так же, как и с любой другой MySQL таблицей.

    Также возможно указать, хранится ли отдельный столбец на диске или в оперативной памяти, используя клаузу STORAGE как часть определения столбца в операторе CREATE TABLE или ALTER TABLE. STORAGE DISK указывает хранение столбца на диске, а STORAGE MEMORY — использование памяти.

    Более подробную информацию см. в разделе 15.1.21, «Оператор CREATE TABLE».

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

mysql> SELECT
              FILE_NAME AS File, FILE_TYPE AS Type,
              TABLESPACE_NAME AS Tablespace, TABLE_NAME AS Name,
              LOGFILE_GROUP_NAME AS 'File group',
              FREE_EXTENTS AS Free, TOTAL_EXTENTS AS Total
          FROM INFORMATION_SCHEMA.FILES
          WHERE ENGINE='ndbcluster';
+--------------+----------+------------+------+------------+------+---------+
| File         | Type     | Tablespace | Name | File group | Free | Total   |
+--------------+----------+------------+------+------------+------+---------+
| ./undo_1.log | UNDO LOG | lg_1       | NULL | lg_1       |    0 | 4194304 |
| ./undo_2.log | UNDO LOG | lg_1       | NULL | lg_1       |    0 | 3145728 |
| ./data_1.dat | DATAFILE | ts_1       | NULL | lg_1       |   32 |      32 |
| ./data_2.dat | DATAFILE | ts_1       | NULL | lg_1       |   48 |      48 |
+--------------+----------+------------+------+------------+------+---------+
4 rows in set (0.00 sec)

Более подробную информацию и примеры см. в разделе 28.3.15, «Таблица INFORMATION_SCHEMA FILES».

Индексирование столбцов, неявно хранящихся на диске. Для таблицы dt_1, определённой в только что показанном примере, только столбцы dob и joined хранятся на диске. Это связано с тем, что существуют индексы на столбцах id, last_name и first_name, и данные этих столбцов хранятся в ОЗУ. Только столбцы без индексов могут храниться на диске; индексы и данные индексированных столбцов продолжают храниться в памяти. Этот компромисс между использованием индексов и сохранением ОЗУ следует учитывать при проектировании таблиц с данными на диске.

Нельзя добавить индекс к столбцу, который был явно объявлен STORAGE DISK, без предварительного изменения его типа хранения на MEMORY; любая попытка сделать это завершается ошибкой. Столбец, неявным образом использующий хранение на диске, может быть индексирован; при этом тип хранения столбца изменяется на MEMORY автоматически. Под “неявным” мы понимаем столбец, тип хранения которого не объявлен, но который унаследован от родительской таблицы. В следующем операторе CREATE TABLE (используя ранее определенный файловый пространство ts_1), столбцы c2 и c3 неявно используют хранение на диске:

mysql> CREATE TABLE ti (
    ->     c1 INT PRIMARY KEY,
    ->     c2 INT,
    ->     c3 INT,
    ->     c4 INT
    -> )
    ->     STORAGE DISK
    ->     TABLESPACE ts_1
    ->     ENGINE NDBCLUSTER;
Query OK, 0 rows affected (1.31 sec)

Поскольку c2, c3 и c4 сами по себе не объявлены с STORAGE DISK, их можно индексировать. Здесь мы добавляем индексы к c2 и c3, используя соответственно CREATE INDEX и ALTER TABLE:

mysql> CREATE INDEX i1 ON ti(c2);
Query OK, 0 rows affected (2.72 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE ti ADD INDEX i2(c3);
Query OK, 0 rows affected (0.92 sec)
Records: 0  Duplicates: 0  Warnings: 0

SHOW CREATE TABLE подтверждает, что индексы были добавлены.

mysql> SHOW CREATE TABLE ti\G
*************************** 1. row ***************************
       Table: ti
Create Table: CREATE TABLE `ti` (
  `c1` int(11) NOT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  `c4` int(11) DEFAULT NULL,
  PRIMARY KEY (`c1`),
  KEY `i1` (`c2`),
  KEY `i2` (`c3`)
) /*!50100 TABLESPACE `ts_1` STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

Можно увидеть с помощью ndb_desc, что индексированные столбцы (выделенный текст) теперь используют хранение в памяти, а не на диске:

$> ./ndb_desc -d test t1
-- t1 --
Version: 33554433
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 4
Number of primary keys: 1
Length of frm data: 317
Max Rows: 0
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
PartitionCount: 4
FragmentCount: 4
PartitionBalance: FOR_RP_BY_LDM
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
Table options:
HashMap: DEFAULT-HASHMAP-3840-4
-- Attributes --
c1 Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c2 Int NULL AT=FIXED ST=MEMORY
c3 Int NULL AT=FIXED ST=MEMORY
c4 Int NULL AT=FIXED ST=DISK
-- Indexes --
PRIMARY KEY(c1) - UniqueHashIndex
i2(c3) - OrderedIndex
PRIMARY(c1) - OrderedIndex
i1(c2) - OrderedIndex

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

Можно использовать абсолютные и относительные пути файловой системы с ADD UNDOFILE и ADD DATAFILE; относительные пути рассчитываются относительно каталога данных узла данных.

Группа файлов журнала, файловое пространство и любые таблицы Disk Data, использующие их, должны быть созданы в определенном порядке. Это также относится к удалению этих объектов, с учетом следующих ограничений:

  • Группа файлов журнала не может быть удалена, пока ею пользуются какие-либо файловые пространства.

  • Файловое пространство не может быть удалено, пока оно содержит какие-либо файлы данных.

  • Нельзя удалить какие-либо файлы данных из файлового пространства, пока существуют какие-либо таблицы, использующие это файловое пространство.

  • Невозможно удалить файлы, созданные в связи с другим файловым пространством, отличным от того, с которым файлы были созданы.

Например, для удаления всех созданных до сих пор объектов в этом разделе можно использовать следующие операторы:

mysql> DROP TABLE dt_1;

mysql> ALTER TABLESPACE ts_1
    -> DROP DATAFILE 'data_2.dat';

mysql> ALTER TABLESPACE ts_1
    -> DROP DATAFILE 'data_1.dat';

mysql> DROP TABLESPACE ts_1;

mysql> DROP LOGFILE GROUP lg_1;

Эти операторы должны выполняться в указанном порядке, за исключением двух операторов ALTER TABLESPACE ... DROP DATAFILE, которые могут быть выполнены в любом порядке.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/mysql-cluster-disk-data-objects.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API