Spec-Zone.ru › MySQL 5.7

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 не будет удовлетворять одному или обоим из следующих двух требований, запрещены и завершаются ошибкой:

    1. Таблица должна иметь явный первичный ключ.

    2. Все столбцы, перечисленные в выражении разбиения таблицы, должны быть частью первичного ключа.

    Исключение. Если таблица с пользовательским разбиением 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 может содержать не более 3 JSON столбцов.

    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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/mysql-cluster-limitations-syntax.html

Spec-Zone.ru

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