21.2.7.1 Несоблюдение синтаксиса SQL в кластере NDB
Некоторые операторы SQL, относящиеся к определенным функциям MySQL, генерируют ошибки при использовании с таблицами NDB, как описано в следующем списке:
Временные таблицы. Временные таблицы не поддерживаются. Попытка создать временную таблицу, использующую движок
NDBили изменить существующую временную таблицу для использованияNDBзавершается ошибкой Движок хранения таблиц 'ndbcluster' не поддерживает опцию создания 'TEMPORARY'.-
Индексы и ключи в таблицах NDB. Ключи и индексы таблиц NDB Cluster ограничены следующим:
-
Ширина столбца. Попытка создать индекс для столбца таблицы
NDB, ширина которого превышает 3072 байта, отклоняется с сообщением: Указанный ключ слишком длинный; максимальная длина ключа составляет 3072 байта.Попытка создать индекс для столбца таблицы
NDB, ширина которого превышает 3056 байт, приводит к предупреждению. В таких случаях статистическая информация не генерируется, что может привести к выбору неоптимального плана выполнения запроса. Поэтому рекомендуется, по возможности, сделать длину индекса короче 3056 байт. Столбцы TEXT и BLOB. Нельзя создавать индексы для столбцов таблицы
NDB, использующих любой из типов данныхTEXTилиBLOB.-
Индексы FULLTEXT. Движок хранения
NDBне поддерживает индексыFULLTEXT, которые возможны только для таблицMyISAMиInnoDB.Однако можно создавать индексы для столбцов
VARCHARтаблицNDB. Ключи HASH и NULL. Использование столбцов с возможностью значения NULL в уникальных ключах и первичных ключах означает, что запросы, использующие эти столбцы, обрабатываются как полные сканирования таблицы. Чтобы обойти эту проблему, сделайте столбец
NOT NULLили пересоздайте индекс без опцииUSING HASH.Префиксы. Нет индексов-префиксов; можно индексировать только целые столбцы. (Размер индекса столбца
NDBвсегда равен ширине столбца в байтах, не превышая 3072 байта, как описано ранее в этом разделе. Также см. Раздел 21.2.7.6, «Неподдерживаемые или отсутствующие функции в кластере NDB» для дополнительной информации.)Столбцы BIT. Столбец
BITне может быть первичным ключом, уникальным ключом или индексом, а также не может быть частью составного первичного ключа, уникального ключа или индекса.-
Столбцы AUTO_INCREMENT. Как и другие движки хранения MySQL, движок
NDBможет обрабатывать максимум один столбецAUTO_INCREMENTна таблицу, и этот столбец должен быть индексирован. Однако в случае таблицы NDB без явного первичного ключа автоматически определяется и используется столбецAUTO_INCREMENTв качестве “скрытого” первичного ключа. По этой причине нельзя создать таблицуNDBс столбцомAUTO_INCREMENTи без явного первичного ключа.Следующие операторы
CREATE TABLEне работают, как показано здесь:# No index on AUTO_INCREMENT column; table has no primary key # Raises mysql>
CREATE TABLE n (->a INT,->b INT AUTO_INCREMENT->)->ENGINE=NDB;ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key # Index on AUTO_INCREMENT column; table has no primary key # Raises NDB error mysql>CREATE TABLE n (->a INT,->b INT AUTO_INCREMENT,-> KEY k (b) -> ) -> ENGINE=NDB; ERROR 1296 (HY000): Got error 4335 'Only one autoincrement column allowed per table. Having a table without primary key uses an autoincr' from NDBCLUSTERСледующий оператор создает таблицу с первичным ключом, столбцом
AUTO_INCREMENTи индексом на этом столбце, и выполняется успешно:# Index on AUTO_INCREMENT column; table has a primary key mysql> CREATE TABLE n ( -> a INT PRIMARY KEY, -> b INT AUTO_INCREMENT, -> KEY k (b) -> ) -> ENGINE=NDB; Query OK, 0 rows affected (0.38 sec)
-
-
Ограничения на внешние ключи. Поддержка ограничений внешних ключей в NDB 7.5 сопоставима с поддержкой в
InnoDB, с учетом следующих ограничений:Каждый столбец, указанный как внешний ключ, требует явного уникального ключа, если он не является первичным ключом таблицы.
-
ON UPDATE CASCADEне поддерживается, когда ссылка относится к первичному ключу родительской таблицы.Это связано с тем, что обновление первичного ключа реализуется как удаление старой строки (содержащей старый первичный ключ) плюс вставка новой строки (с новым первичным ключом). Это не видно для ядра
NDB, которое рассматривает эти две строки как одинаковые, и, таким образом, не может знать, что это обновление должно быть каскадировано. Начиная с NDB 7.5.14 и NDB 7.6.10:
ON DELETE CASCADEне поддерживается, если дочерняя таблица содержит один или несколько столбцов любого из типовTEXTилиBLOB. (Ошибка #89511, Ошибка #27484882)SET DEFAULTне поддерживается. (Также не поддерживаетсяInnoDB.)Ключевые слова
NO ACTIONпринимаются, но обрабатываются какRESTRICT. (Также аналогичноInnoDB.)В более ранних версиях NDB Cluster, при создании таблицы с внешним ключом, ссылающимся на индекс в другой таблице, иногда казалось возможным создать внешний ключ, даже если порядок столбцов в индексах не совпадал, из-за того, что соответствующая ошибка не всегда возвращалась внутри. Частичное исправление этой проблемы улучшило используемую внутреннюю ошибку, чтобы она работала в большинстве случаев; однако, в случае уникального индекса родителя, такая ситуация может возникнуть. (Ошибка #18094360)
-
До версии NDB 7.5.6, при добавлении или удалении внешнего ключа с помощью
ALTER TABLE, метаданные родительской таблицы не обновляются, что позволяет впоследствии выполнять операторыALTER TABLEна родительской таблице, которые должны быть недействительными. Для решения этой проблемы выполнитеSHOW CREATE TABLEдля родительской таблицы сразу после добавления или удаления внешнего ключа; это заставит перезагрузить метаданные родительской таблицы.Эта проблема исправлена в NDB 7.5.6. (Ошибка #82989, Ошибка #24666177)
Для получения дополнительной информации, см. Раздел 13.1.18.5, «Ограничения внешних ключей» и Раздел 1.6.3.2, «Ограничения внешних ключей».
Кластер NDB и типы данных геометрии. Типы данных геометрии (
WKTиWKB) поддерживаются для таблицNDB. Однако пространственные индексы не поддерживаются.-
Наборы символов и файлы журнала бинарных логов. В настоящее время таблицы
ndb_apply_statusиndb_binlog_indexсоздаются с набором символовlatin1(ASCII). Так как имена бинарных логов записываются в эту таблицу, файлы бинарных логов с именами, использующими нелатинские символы, не ссылаются правильно в этих таблицах. Это известная проблема, над которой мы работаем. (Ошибка #50226)Для решения этой проблемы используйте только латинские символы при именовании файлов бинарных логов или при настройке параметров
--basedir,--log-binили--log-bin-index.
-
Создание таблиц NDB с пользовательским разбиением. Поддержка пользовательского разбиения в NDB Cluster ограничена разбиением по [
LINEAR]KEY. Использование любого другого типа разбиения сENGINE=NDBилиENGINE=NDBCLUSTERв оператореCREATE TABLEприводит к ошибке.Существует возможность обойти это ограничение, но в производственных условиях такая возможность не поддерживается. Подробнее см. Пользовательское разбиение и хранилище данных NDB (NDB Cluster).
Схема разбиения по умолчанию. Все таблицы NDB Cluster по умолчанию разбиваются по
KEYс использованием первичного ключа таблицы в качестве ключа разбиения. Если для таблицы явно не задан первичный ключ, вместо него используется автоматически созданный «скрытый» первичный ключ хранилищем данныхNDB. Дополнительную информацию по этим и сопутствующим вопросам см. в разделе 22.2.5 «Разбиение по ключу».Операторы
CREATE TABLEиALTER TABLE, которые приведут к тому, что таблица с пользовательским разбиениемNDBCLUSTERне будет удовлетворять одному или обоим из следующих двух требований, запрещены и завершаются ошибкой:Таблица должна иметь явный первичный ключ.
Все столбцы, перечисленные в выражении разбиения таблицы, должны быть частью первичного ключа.
Исключение. Если таблица с пользовательским разбиением
NDBCLUSTERсоздается с пустым списком столбцов (т. е. с использованиемPARTITION BY [LINEAR] KEY()), то явный первичный ключ не требуется.Максимальное количество разделов для таблиц NDBCLUSTER. Максимальное количество разделов, которое можно определить для таблицы
NDBCLUSTERпри использовании пользовательского разбиения, составляет 8 на группу узлов. (Дополнительную информацию о группах узлов NDB Cluster см. в разделе 21.2.2 «Узлы NDB Cluster, группы узлов, фрагментные реплики и разделы»).DROP PARTITION не поддерживается. Невозможно удалить разделы из таблиц
NDBс использованиемALTER TABLE ... DROP PARTITION. Другие расширения разбиения для оператораALTER TABLE—ADD PARTITION,REORGANIZE PARTITIONиCOALESCE PARTITION—поддерживаются для таблиц NDB, но используют копирование и поэтому не оптимизированы. См. раздел 22.3.1 «Управление разделами RANGE и LIST» и раздел 13.1.8 «Оператор ALTER TABLE».Выбор раздела. Выбор раздела не поддерживается для таблиц
NDB. Дополнительную информацию см. в разделе 22.5 «Выбор раздела». -
Тип данных JSON. Тип данных MySQL
JSONподдерживается для таблицNDBв mysqld, поставляемом с NDB 7.5.2 и более поздними версиями.Таблица
NDBможет содержать не более 3JSONстолбцов.NDB API не имеет специальных средств для работы с данными
JSON, которые он рассматривает просто как данныеBLOB. Обработка данных какJSONдолжна выполняться приложением. -
Таблицы ndbinfo с информацией о ЦП и потоках. NDB 7.5.2 добавляет несколько новых таблиц в базу данных информации
ndbinfo, предоставляющие информацию о работе ЦП и потоков по узлу, идентификатору потока и типу потока. Таблицы перечислены ниже:cpustat: Предоставляет статистику использования ЦП в секунду на поток.cpustat_50ms: Сырые данные статистики использования ЦП на поток, собираемые каждые 50 мс.cpustat_1sec: Сырые данные статистики использования ЦП на поток, собираемые каждую секунду.cpustat_20sec: Сырые данные статистики использования ЦП на поток, собираемые каждые 20 секунд.threads: Имена и описания типов потоков.
Дополнительную информацию об этих таблицах см. в разделе 21.6.15 «ndbinfo: база данных информации NDB Cluster».
-
Таблицы ndbinfo с информацией о блокировках. NDB 7.5.3 добавляет новые таблицы в базу данных информации
ndbinfo, предоставляющие информацию о блокировках и попытках блокировки в работающем NDB Cluster. Эти таблицы перечислены ниже:cluster_locks: Текущие запросы на блокировку, ожидающие или удерживающие блокировки; эта информация может быть полезна при исследовании остановок и тупиков. Аналогичноcluster_operations.locks_per_fragment: Количество запросов на получение блокировок и их исходов на фрагмент, а также общее время ожидания успешно и неуспешно полученных блокировок. Аналогичноoperations_per_fragmentиmemory_per_fragment.server_locks: Подмножество кластерных транзакций — тех, которые выполняются на локальном mysqld, показывающее идентификатор подключения на транзакцию. Аналогичноserver_operations.
© 2025 Oracle
Licensed under the GPLv2 License.