15.1.20.12 Установка параметров комментариев NDB
Можно задать ряд параметров, специфичных для кластера 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. В NDB 8.4.4 и более поздних версиях он запрещен для 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 Cluster”).
Дополнительную информацию о том, как 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 при создании или изменении таблицы означает, что эта таблица не ведёт журнал обратной записи или не включена в локальные контрольные точки. В этом случае таблица всё ещё реплицируется по узлам данных для высокой доступности и обновляется с помощью транзакций, но изменения, внесённые в неё, не записываются в журналы обратной записи узла данных и не сохраняются на диск; при восстановлении после сбоя кластера кластер сохраняет определение таблицы, но не строки, то есть таблица пуста.
Использование таких нерегистрируемых таблиц уменьшает требования узла данных к вводу-выводу на диск и хранилищу, а также к процессору для контрольных точек. Это может подойти для краткосрочных данных, которые часто обновляются, и где потеря всех данных в маловероятном случае полного сбоя кластера приемлема.
END_OF_DOCUMENT_MARKER Также можно использовать системную переменную ndb_table_no_logging, чтобы все NDB таблицы, созданные или изменённые, пока эта переменная активна, вели себя так, как будто они были созданы с комментарием NOLOGGING. В отличие от случая, когда используется комментарий напрямую, в выводе SHOW CREATE TABLE в этом случае нет ничего, что указывает на то, что это таблица без журналирования. Рекомендуется использовать подход с комментарием к таблице, поскольку он предоставляет контроль за функцией на уровне каждой таблицы, а этот аспект схемы таблицы встроен в оператор создания таблицы, где его легко найти с помощью инструментов на основе SQL.
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, «Операции в режиме реального времени с ALTER TABLE в кластере NDB».
PARTITION_BALANCE: Предоставляет дополнительный контроль над назначением и размещением партиций. Поддерживаются следующие четыре схемы:
-
FOR_RP_BY_NODE: Одна партиция на узел.Только один LDM на каждом узле хранит основную партицию. Каждая партиция хранится в том же LDM (с тем же идентификатором) на всех узлах.
-
FOR_RA_BY_NODE: Одна партиция на группу узлов.Каждый узел хранит одну партицию, которая может быть как первичной репликой, так и резервной. Каждая партиция хранится в том же LDM на всех узлах.
-
FOR_RP_BY_LDM: Одна партиция для каждого LDM на каждом узле; по умолчанию.Это значение используется, если
READ_BACKUPустановлено в 1. -
FOR_RA_BY_LDM: Одна партиция на каждый LDM в каждой группе узлов.Эти партиции могут быть первичными или резервными.
-
FOR_RA_BY_LDM_X_2: Две партиции на каждый LDM в каждой группе узлов.Эти партиции могут быть первичными или резервными.
-
FOR_RA_BY_LDM_X_3: Три партиции на каждый LDM в каждой группе узлов.Эти партиции могут быть первичными или резервными.
-
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.