13.1.18.9 Настройка параметров комментариев NDB
Можно установить ряд параметров, специфичных для NDB Cluster, в комментариях к таблице или столбцам таблицы NDB. Параметры уровня таблицы для управления чтением из любой реплики и баланса партиций могут быть встроены в комментарий к таблице с помощью NDB_TABLE.
NDB_COLUMN можно использовать в комментарии к столбцу для задания размера таблицы блоков blob, используемой для хранения частей значений blob, путем NDB до максимального значения. Это работает для столбцов BLOB, MEDIUMBLOB, LONGBLOB, TEXT, MEDIUMTEXT, LONGTEXT и JSON.
NDB_TABLE можно использовать в комментарии к таблице для задания параметров, относящихся к балансу партиций и тому, полностью ли реплицирована таблица, среди прочего.
Остальная часть этого раздела описывает эти параметры и их использование.
Параметры NDB_COLUMN
В NDB Cluster комментарий к столбцу в CREATE
TABLE или ALTER TABLE операторе также можно использовать для указания параметра NDB_COLUMN. NDB 7.5 и 7.6 поддерживают единственный параметр комментария столбца MAX_BLOB_PART_SIZE; синтаксис этого параметра показан здесь:
COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE[={0|1}]'
Знак = и значение, за которым он следует, являются необязательными. Использование любого значения, отличного от 0 или 1, приводит к синтаксической ошибке.
Эффект использования MAX_BLOB_PART_SIZE в комментарии к столбцу заключается в установке размера части blob для столбца TEXT или BLOB на максимальное количество байтов, поддерживаемое NDB (13948). Этот параметр может быть применен к любому типу столбца blob, поддерживаемому MySQL, за исключением TINYBLOB или TINYTEXT (BLOB, MEDIUMBLOB, LONGBLOB, TEXT, MEDIUMTEXT, LONGTEXT). MAX_BLOB_PART_SIZE не влияет на столбцы JSON.
Следует также помнить, особенно при работе со столбцами TEXT, что заданное значение MAX_BLOB_PART_SIZE представляет размер столбца в байтах. Оно не указывает количество символов, которое зависит от набора символов и сортировки, используемых столбцом.
Чтобы увидеть эффект этого параметра, сначала выполните следующий SQL-запрос в клиенте mysql для создания таблицы с двумя столбцами BLOB, один (c1) без дополнительных параметров, а другой (c2) с MAX_BLOB_PART_SIZE:
mysql> CREATE TABLE test.t (
-> 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 t
-- 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.
Вы можете изменить размер части blob для данного столбца blob таблицы NDB с помощью оператора ALTER
TABLE, например, такого:
mysql> ALTER TABLE test.t
-> 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.t\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`p` int(11) NOT NULL,
`c1` blob COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE',
`c2` blob,
PRIMARY KEY (`p`)
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> EXIT
Bye
Вывод ndb_desc показывает, что размер частей blob для столбцов был изменён как ожидалось:
$> ndb_desc -d test t
-- 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
NDBT_ProgramExit: 0 - OK
Изменение размера части blob столбца необходимо выполнять с использованием копирующего ALTER TABLE; эта операция не может быть выполнена онлайн (см. Раздел 21.6.12, «Операции онлайн с ALTER TABLE в NDB Cluster»).
Более подробная информация о том, как NDB хранит столбцы типов blob, приведена в Требованиях к хранению типов строк.
Параметры NDB_TABLE
Для таблицы NDB Cluster комментарий к таблице в 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.
READ_BACKUP: Установка этого параметра в 1 имеет тот же эффект, что и включение ndb_read_backup; позволяет читать из любой реплики. Это значительно улучшает производительность чтения из таблицы при относительно небольших затратах на запись.
Начиная с MySQL NDB Cluster 7.5.3, можно задать READ_BACKUP для существующей таблицы онлайн (Bug #80858, Bug #23001617), используя оператор ALTER TABLE, подобный одному из показанных здесь:
ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=1";
ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=0";
До MySQL NDB Cluster 7.5.4 установка READ_BACKUP в 1 также приводила к установке FRAGMENT_COUNT_TYPE в ONE_PER_LDM_PER_NODE_GROUP.
Более подробная информация о параметре ALGORITHM для ALTER TABLE приведена в Раздел 21.6.12, «Операции онлайн с ALTER TABLE в NDB Cluster».
PARTITION_BALANCE: Предоставляет дополнительный контроль над назначением и размещением партиций. Поддерживаются следующие четыре схемы:
-
FOR_RP_BY_NODE: Одна партиция на узел.Только один LDM на каждом узле хранит первичную партицию. Каждая партиция хранится в одном LDM (с одинаковым идентификатором) на всех узлах.
-
FOR_RA_BY_NODE: Одна партиция на группу узлов.Каждый узел хранит одну партицию, которая может быть основной репликой или резервной репликой. Каждая партиция хранится в том же LDM на всех узлах.
-
FOR_RP_BY_LDM: Одна партиция для каждого LDM на каждом узле; значение по умолчанию.Это то же поведение, что и до MySQL NDB Cluster 7.5.2, за исключением немного изменённого сопоставления партиций с LDM, начиная с LDM 0 и размещая по одной партиции на группу узлов, затем переходя к следующему LDM.
В MySQL NDB Cluster 7.5.4 и более поздних версиях это значение используется, если
READ_BACKUPустановлено в 1. (Bug #82634, Bug #24482114) -
FOR_RA_BY_LDM: Одна партиция на каждый LDM в каждой группе узлов.Эти партиции могут быть первичными или резервными партициями.
До MySQL NDB Cluster 7.5.4 это значение использовалось, если
READ_BACKUPбыло установлено в 1. -
FOR_RA_BY_LDM_X_2: Две партиции на каждый LDM в каждой группе узлов.Эти партиции могут быть первичными или резервными партициями.
Эта установка была добавлена в NDB 7.5.4.
-
FOR_RA_BY_LDM_X_3: Три партиции на каждый LDM в каждой группе узлов.Эти партиции могут быть первичными или резервными партициями.
Эта установка была добавлена в NDB 7.5.4.
-
FOR_RA_BY_LDM_X_4: Четыре партиции на каждый LDM в каждой группе узлов.Эти партиции могут быть первичными или резервными партициями.
Эта установка была добавлена в NDB 7.5.4.
Начиная с NDB 7.5.4, PARTITION_BALANCE является предпочтительным интерфейсом для установки количества партиций на таблицу. Использование MAX_ROWS для принудительного указания количества партиций устарело, начиная с NDB 7.5.4, но продолжает поддерживаться в NDB 7.6 для обратной совместимости, однако может быть удалено в будущих релизах MySQL NDB Cluster. (Ошибка #81759, Ошибка #23544301)
До MySQL NDB Cluster 7.5.4, PARTITION_BALANCE называлось FRAGMENT_COUNT_TYPE и принимало в качестве значения одно из (в том же порядке, что и в списке выше) ONE_PER_NODE, ONE_PER_NODE_GROUP, ONE_PER_LDM_PER_NODE или ONE_PER_LDM_PER_NODE_GROUP. (Ошибка #81761, Ошибка #23547525)
FULLY_REPLICATED управляет тем, полностью ли реплицируется таблица, то есть, имеет ли каждый узел данных полную копию таблицы. Для включения полной репликации таблицы используйте FULLY_REPLICATED=1.
Этот параметр также можно контролировать с помощью системной переменной ndb_fully_replicated. Установка её значения в ON включает этот параметр по умолчанию для всех новых таблиц NDB; по умолчанию значение равно OFF, что сохраняет предыдущее поведение (как в MySQL NDB Cluster 7.5.1 и более ранних версиях, до введения поддержки полностью реплицируемых таблиц). Переменная системной переменной 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
Начиная с NDB 7.6.15, столбец 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)
До NDB 7.6.15 комментарий к таблице, используемый с ALTER
TABLE, заменял любой существующий комментарий к таблице. Это означало, что (например), значение READ_BACKUP не переносилось в новый комментарий, заданный оператором ALTER TABLE, и любые не указанные значения возвращались к своим значениям по умолчанию. (Ошибка #30428829) Таким образом, больше не было способа с помощью SQL извлечь ранее заданное значение комментария. Чтобы предотвратить сброс значений комментариев к значениям по умолчанию, было необходимо сохранить все такие значения из существующей строки комментария и включить их в комментарий, переданный оператору ALTER
TABLE.
Вы также можете увидеть значение опции PARTITION_BALANCE в выводе программы ndb_desc. ndb_desc также показывает, установлены ли опции READ_BACKUP и FULLY_REPLICATED для таблицы. Дополнительную информацию см. в описании этой программы.
© 2025 Oracle
Licensed under the GPLv2 License.