Spec-Zone.ru › MySQL 5.7

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

  • Параметры NDB_COLUMN

  • Параметры NDB_TABLE

Можно установить ряд параметров, специфичных для 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: Предоставляет дополнительный контроль над назначением и размещением партиций. Поддерживаются следующие четыре схемы:

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

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

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

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

  3. 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)

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

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

    До MySQL NDB Cluster 7.5.4 это значение использовалось, если READ_BACKUP было установлено в 1.

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

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

    Эта установка была добавлена в NDB 7.5.4.

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

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

    Эта установка была добавлена в NDB 7.5.4.

  7. 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/create-table-ndb-comment-options.html

Spec-Zone.ru

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