Spec-Zone.ru › MySQL 9.2

15.1.21.12 Настройка параметров комментариев NDB

  • Параметры NDB_COLUMN

  • Параметры NDB_TABLE

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

NDB_COLUMN можно использовать в комментарии к столбцу для задания размера таблицы фрагментов BLOB, используемой для хранения фрагментов значений BLOB, устанавливая NDB на максимальное значение. Это работает для столбцов BLOB, MEDIUMBLOB, LONGBLOB, TEXT, MEDIUMTEXT, LONGTEXT и JSON. Комментарий к столбцу также может использоваться для управления внутренним размером столбца BLOB. Комментарии NDB_COLUMN не поддерживают столбцы TINYBLOB или TINYTEXT, поскольку они имеют только внутреннюю часть фиксированного размера и не имеют отдельных фрагментов для хранения в другом месте.

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

Остальная часть этого раздела описывает эти параметры и их использование.

Параметры NDB_COLUMN

В кластере NDB комментарий к столбцу в операторе CREATE TABLE или ALTER TABLE также может использоваться для указания параметра NDB_COLUMN. NDB поддерживает два параметра комментариев к столбцам BLOB_INLINE_SIZE и MAX_BLOB_PART_SIZE. Синтаксис этих параметров показан здесь:

COMMENT 'NDB_COLUMN=speclist'

speclist := spec[,spec]

spec :=
    BLOB_INLINE_SIZE=value
  | MAX_BLOB_PART_SIZE[={0|1}]

BLOB_INLINE_SIZE задаёт количество байтов, которые должны храниться в строке столбца; ожидаемое значение — целое число в диапазоне от 1 до 29980 включительно. Установка значения больше 29980 приводит к ошибке; установка значения меньше 1 разрешена, но используется значение по умолчанию для размера внутреннего хранения типа столбца.

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

Также следует помнить, особенно при работе со столбцами TEXT, что значение, установленное с помощью MAX_BLOB_PART_SIZE или BLOB_INLINE_SIZE, представляет размер столбца в байтах. Оно не указывает количество символов, которое варьируется в зависимости от набора символов и сортировки, используемых столбцом.

Чтобы увидеть влияние этого параметра, сначала создайте таблицу с двумя столбцами BLOB, один (b1) без дополнительных параметров, а другой (b2) с настройкой для BLOB_INLINE_SIZE, как показано здесь:

mysql> CREATE TABLE t1 (
    ->    a INT NOT NULL PRIMARY KEY,
    ->    b1 BLOB,
    ->    b2 BLOB COMMENT 'NDB_COLUMN=BLOB_INLINE_SIZE=8000'
    ->  ) ENGINE NDB;
Query OK, 0 rows affected (0.32 sec)

Вы можете посмотреть настройки BLOB_INLINE_SIZE для столбцов BLOB, запросив таблицу ndbinfo.blobs, например так:

mysql> SELECT
    ->   column_name AS 'Column Name',
    ->   inline_size AS 'Inline Size',
    ->   part_size AS 'Blob Part Size'
    -> FROM ndbinfo.blobs
    -> WHERE table_name = 't1';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| b1          |         256 |           2000 |
| b2          |        8000 |           2000 |
+-------------+-------------+----------------+
2 rows in set (0.01 sec)

Также можно проверить вывод утилиты ndb_desc, как показано здесь, с соответствующими строками, отображёнными с использованием выделения текста:

$> ndb_desc -d test t1
-- t --
Version: 1
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 945
Max Rows: 0
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
PartitionCount: 2
FragmentCount: 2
PartitionBalance: FOR_RP_BY_LDM
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
Table options: readbackup
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
b1 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_64_1
b2 Blob(8000,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_64_2
-- Indexes --
PRIMARY KEY(a) - UniqueHashIndex
PRIMARY(a) - OrderedIndex

BLOB_INLINE_SIZE не разрешено для столбцов TINYBLOB и вызывает предупреждение, если используется.

Для MAX_BLOB_PART_SIZE знак = и значение, за ним идущее, необязательны. Использование любого значения, отличного от 0 или 1, приведёт к синтаксической ошибке.

Влияние использования MAX_BLOB_PART_SIZE в комментарии к столбцу заключается в установке размера фрагмента BLOB столбца TEXT или BLOB на максимальное количество байтов, поддерживаемое для этого NDB (13948). Этот параметр может быть применён к любому типу столбца BLOB, поддерживаемому MySQL, за исключением TINYBLOB или TINYTEXT (BLOB, MEDIUMBLOB, LONGBLOB, TEXT, MEDIUMTEXT, LONGTEXT). В отличие от BLOB_INLINE_SIZE, MAX_BLOB_PART_SIZE не оказывает никакого влияния на столбцы JSON.

Чтобы увидеть влияние этого параметра, сначала выполним следующее SQL-предложение в клиенте mysql для создания таблицы с двумя столбцами BLOB, один (c1) без дополнительных параметров, а другой (c2) с MAX_BLOB_PART_SIZE:

mysql> CREATE TABLE test.t2 (
    ->   p INT PRIMARY KEY,
    ->   c1 BLOB,
    ->   c2 BLOB COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE'
    -> ) ENGINE NDB;
Query OK, 0 rows affected (0.32 sec)

Из командной оболочки выполните утилиту ndb_desc для получения информации о только что созданной таблице, как показано в этом примере:

$> ndb_desc -d test t2
-- t --
Version: 1
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 324
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
p Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c1 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_22_1
c2 Blob(256,13948,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_22_2
-- Indexes --
PRIMARY KEY(p) - UniqueHashIndex
PRIMARY(p) - OrderedIndex

Информация о столбцах в выводе приведена в разделе Attributes; для столбцов c1 и c2 она отображается здесь с выделением текста. Для c1 размер фрагмента BLOB составляет 2000, значение по умолчанию; для c2 он составляет 13948, как задано MAX_BLOB_PART_SIZE.

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

mysql> SELECT
    ->   column_name AS 'Column Name',
    ->   inline_size AS 'Inline Size',
    ->   part_size AS 'Blob Part Size'
    -> FROM ndbinfo.blobs
    -> WHERE table_name = 't2';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1          |         256 |           2000 |
| c2          |         256 |          13948 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)

Вы можете изменить размер фрагмента BLOB для данного столбца BLOB таблицы NDB с помощью оператора ALTER TABLE, например такого, и проверить изменения позднее с помощью SHOW CREATE TABLE:

mysql> ALTER TABLE test.t2
    ->    DROP COLUMN c1,
    ->     ADD COLUMN c1 BLOB COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE',
    ->     CHANGE COLUMN c2 c2 BLOB AFTER c1;
Query OK, 0 rows affected (0.47 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE test.t2\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t2` (
  `p` int(11) NOT NULL,
  `c1` blob COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE',
  `c2` blob,
  PRIMARY KEY (`p`)
) ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql> EXIT
Bye

Вывод ndb_desc показывает, что размеры фрагментов BLOB столбцов были изменены как ожидалось:

$> ndb_desc -d test t2
-- t --
Version: 16777220
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 324
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
p Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c1 Blob(256,13948,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_26_1
c2 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_26_2
-- Indexes --
PRIMARY KEY(p) - UniqueHashIndex
PRIMARY(p) - OrderedIndex

Вы также можете увидеть изменение, повторно выполнив запрос к таблице ndbinfo.blobs:

mysql> SELECT
    ->   column_name AS 'Column Name',
    ->   inline_size AS 'Inline Size',
    ->   part_size AS 'Blob Part Size'
    -> FROM ndbinfo.blobs
    -> WHERE table_name = 't2';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1          |         256 |          13948 |
| c2          |         256 |           2000 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)

Возможно задать как BLOB_INLINE_SIZE, так и MAX_BLOB_PART_SIZE для столбца BLOB, как показано в этом операторе CREATE TABLE:

mysql> CREATE TABLE test.t3 (
    ->   p INT NOT NULL PRIMARY KEY,
    ->   c1 JSON,
    ->   c2 JSON COMMENT 'NDB_COLUMN=BLOB_INLINE_SIZE=5000,MAX_BLOB_PART_SIZE'
    -> ) ENGINE NDB;
Query OK, 0 rows affected (0.28 sec)

Запрос таблицы blobs показывает нам, что оператор работал как ожидалось:

mysql> SELECT
    ->   column_name AS 'Column Name',
    ->   inline_size AS 'Inline Size',
    ->   part_size AS 'Blob Part Size'
    -> FROM ndbinfo.blobs
    -> WHERE table_name = 't3';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1          |        4000 |           8100 |
| c2          |        5000 |           8100 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)

Вы также можете проверить, что оператор сработал, проверив вывод утилиты ndb_desc.

Изменение размера фрагмента BLOB столбца должно выполняться с использованием копирующего ALTER TABLE; данная операция не может быть выполнена онлайн (см. Раздел 25.6.12, “Операции в режиме онлайн с ALTER TABLE в кластере NDB”).

Для получения дополнительной информации о том, как NDB хранит столбцы типов BLOB, см. Требования к хранению типов строк.

Параметры NDB_TABLE

Для таблицы кластера NDB комментарий к таблице в операторе CREATE TABLE или ALTER TABLE также может использоваться для указания параметра NDB_TABLE, который состоит из одной или нескольких пар имя-значение, разделённых запятыми при необходимости, следующих за строкой NDB_TABLE=. Полный синтаксис для имен и значений показан здесь:

COMMENT="NDB_TABLE=ndb_table_option[,ndb_table_option[,...]]"

ndb_table_option: {
    NOLOGGING={1 | 0}
  | READ_BACKUP={1 | 0}
  | PARTITION_BALANCE={FOR_RP_BY_NODE | FOR_RA_BY_NODE | FOR_RP_BY_LDM
                      | FOR_RA_BY_LDM | FOR_RA_BY_LDM_X_2
                      | FOR_RA_BY_LDM_X_3 | FOR_RA_BY_LDM_X_4}
  | FULLY_REPLICATED={1 | 0}
}

Пробелы внутри строкового значения не допускаются. Строка регистронезависима.

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

NOLOGGING: По умолчанию таблицы NDB регистрируются и выполняется проверка состояния. Это обеспечивает их надёжность при сбоях всего кластера. Использование NOLOGGING при создании или изменении таблицы означает, что эта таблица не регистрируется в журнале изменений или не включается в локальные контрольные точки. В этом случае таблица по-прежнему реплицируется по узлам данных для высокой доступности и обновляется с помощью транзакций, но изменения, внесённые в неё, не записываются в журналы изменений узлов данных и их содержимое не записывается на диск в контрольных точках; при восстановлении после сбоя кластера кластер сохраняет определение таблицы, но не сохраняет ни одной её строки — то есть таблица пуста.

Использование таких таблиц без регистрации уменьшает нагрузку узлов данных на ввод-вывод на диске и хранение, а также вычисления для создания контрольных точек. Это может быть уместно для краткосрочных данных, которые часто обновляются, и при этом потеря всех данных в случае редкого полного сбоя кластера приемлема.

Также можно использовать системную переменную ndb_table_no_logging, чтобы любые таблицы NDB, созданные или изменённые, пока эта переменная активна, вели себя так, как будто они были созданы с комментарием NOLOGGING. В отличие от прямого использования комментария, в выводе SHOW CREATE TABLE в этом случае нет ничего, что указывало бы на то, что это таблица без регистрации. Рекомендуется использовать подход с комментарием к таблице, так как он предоставляет управление функцией на уровне таблицы, и эта часть схемы таблицы встроена в оператор создания таблицы, где она легко находится инструментами, основанными на SQL.

END_OF_DOCUMENT_MARKER

READ_BACKUP: Установка этого параметра в 1 эквивалентна включению ndb_read_backup; позволяет чтение с любой реплики. Это значительно улучшает производительность чтения из таблицы с относительно небольшими затратами на производительность записи. 1 является значением по умолчанию для READ_BACKUP, а значение по умолчанию для ndb_read_backup — ON (ранее чтение с любой реплики было отключено по умолчанию).

Вы можете установить READ_BACKUP для существующей таблицы онлайн, используя оператор ALTER TABLE, аналогичный одному из показанных здесь:

ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=1";

ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=0";

Для получения дополнительной информации об опции ALGORITHM для ALTER TABLE, см. Раздел 25.6.12, «Online Operations with ALTER TABLE in NDB Cluster».

PARTITION_BALANCE: Предоставляет дополнительный контроль над назначением и размещением партиций. Поддерживаются следующие четыре схемы:

  1. FOR_RP_BY_NODE: Одна партиция на узел.

    Только один LDM на каждом узле хранит основную партицию. Каждая партиция хранится в том же LDM (с тем же идентификатором) на всех узлах.

  2. FOR_RA_BY_NODE: Одна партиция на группу узлов.

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

  3. FOR_RP_BY_LDM: Одна партиция для каждого LDM на каждом узле; значение по умолчанию.

    Это значение используется, если READ_BACKUP установлено в 1.

  4. FOR_RA_BY_LDM: Одна партиция на каждый LDM в каждой группе узлов.

    Эти партиции могут быть основными или резервными.

  5. FOR_RA_BY_LDM_X_2: Две партиции на каждый LDM в каждой группе узлов.

    Эти партиции могут быть основными или резервными.

  6. FOR_RA_BY_LDM_X_3: Три партиции на каждый LDM в каждой группе узлов.

    Эти партиции могут быть основными или резервными.

  7. FOR_RA_BY_LDM_X_4: Четыре партиции на каждый LDM в каждой группе узлов.

    Эти партиции могут быть основными или резервными.

PARTITION_BALANCE является предпочтительным интерфейсом для установки количества партиций на таблицу. Использование MAX_ROWS для принудительного задания количества партиций устарело, но продолжает поддерживаться для обратной совместимости; оно может быть удалено в будущих выпусках MySQL NDB Cluster. (Ошибка #81759, Ошибка #23544301)

FULLY_REPLICATED управляет тем, полностью ли реплицируется таблица, то есть, содержит ли каждый узел данных полную копию таблицы. Чтобы включить полную репликацию таблицы, используйте FULLY_REPLICATED=1.

Этот параметр также можно контролировать с помощью системной переменной ndb_fully_replicated. Установка ее значения в ON по умолчанию включает этот параметр для всех новых NDB таблиц; значение по умолчанию — OFF. Системная переменная ndb_data_node_neighbour также используется для полностью реплицированных таблиц, чтобы обеспечить, что при доступе к полностью реплицированной таблице мы обращаемся к узлу данных, локальному для этого сервера MySQL.

Пример оператора CREATE TABLE, использующего такой комментарий при создании таблицы NDB, приведен здесь:

mysql> CREATE TABLE t1 (
     >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     >     c2 VARCHAR(100),
     >     c3 VARCHAR(100) )
     > ENGINE=NDB
     >
COMMENT="NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE";

Комментарий отображается в выводе SHOW CREATE TABLE. Текст комментария также доступен при запросе к таблице схемы MySQL Information Schema TABLES, как в этом примере:

mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
     > FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1"\G
*************************** 1. row ***************************
   TABLE_NAME: t1
 TABLE_SCHEMA: test
TABLE_COMMENT: NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE
1 row in set (0.01 sec)

Этот синтаксис комментария также поддерживается с операторами ALTER TABLE для NDB таблиц, как показано здесь:

mysql> ALTER TABLE t1 COMMENT="NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE";
Query OK, 0 rows affected (0.40 sec)
Records: 0  Duplicates: 0  Warnings: 0

Столбец TABLE_COMMENT отображает комментарий, необходимый для повторного создания таблицы после выполнения оператора ALTER TABLE, как показано здесь:

mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
    ->     FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1"\G
*************************** 1. row ***************************
   TABLE_NAME: t1
 TABLE_SCHEMA: test
TABLE_COMMENT: NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE
1 row in set (0.01 sec)
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
     > FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1";
+------------+--------------+--------------------------------------------------+
| TABLE_NAME | TABLE_SCHEMA | TABLE_COMMENT                                    |
+------------+--------------+--------------------------------------------------+
| t1         | c            | NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE       |
| t1         | d            |                                                  |
+------------+--------------+--------------------------------------------------+
2 rows in set (0.01 sec)

Имейте в виду, что комментарий к таблице, используемый с ALTER TABLE, заменяет любой существующий комментарий, который может быть у таблицы.

mysql> ALTER TABLE t1 COMMENT="NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE";
Query OK, 0 rows affected (0.40 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
     > FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1";
+------------+--------------+--------------------------------------------------+
| TABLE_NAME | TABLE_SCHEMA | TABLE_COMMENT                                    |
+------------+--------------+--------------------------------------------------+
| t1         | c            | NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE       |
| t1         | d            |                                                  |
+------------+--------------+--------------------------------------------------+
2 rows in set (0.01 sec)

Вы также можете увидеть значение опции PARTITION_BALANCE в выводе программы ndb_desc. ndb_desc также отображает, установлены ли опции READ_BACKUP и FULLY_REPLICATED для таблицы. Для получения дополнительной информации см. описание этой программы.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/create-table-ndb-comment-options.html

Spec-Zone.ru

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