Spec-Zone.ru › MySQL 5.7

21.6.12 Операции с ALTER TABLE в NDB Cluster без остановки работы таблицы

MySQL NDB Cluster 7.5 и 7.6 поддерживают изменения схемы таблицы онлайн с помощью ALTER TABLE ... ALGORITHM=DEFAULT|INPLACE|COPY. NDB Cluster обрабатывает COPY и INPLACE, как описано в следующих параграфах.

Для ALGORITHM=COPY обработчик mysqld NDB Cluster выполняет следующие действия:

  • Указывает узлам данных создать пустую копию таблицы и внести необходимые изменения схемы в эту копию.

  • Считывает строки из исходной таблицы и записывает их в копию.

  • Указывает узлам данных удалить исходную таблицу и переименовать копию.

Иногда мы называем это “копированием” или “офлайн” ALTER TABLE.

Операции DML запрещены одновременно с копированием ALTER TABLE.

mysqld, на котором выполняется операция копирования ALTER TABLE, блокирует метаданные, но только на этом mysqld. Другие NDB клиенты могут изменять данные строк во время копирования ALTER TABLE, что может привести к несогласованности.

Для ALGORITHM=INPLACE обработчик NDB Cluster указывает узлам данных внести необходимые изменения и не выполняет никаких копий данных.

Мы также называем это “без копирования” или “онлайн” ALTER TABLE.

Операции без копирования ALTER TABLE позволяют выполнять операции DML параллельно.

Независимо от используемого алгоритма, mysqld берет глобальную блокировку схемы (GSL) во время выполнения ALTER TABLE; это предотвращает одновременное выполнение других операций DDL или резервного копирования на этом или любом другом узле SQL в кластере. Обычно это не проблема, если ALTER TABLE занимает очень много времени.

Примечание

Некоторые старые версии NDB Cluster использовали синтаксис, специфичный для NDB, для онлайн ALTER TABLE операций. Этот синтаксис больше не поддерживается.

Операции добавления и удаления индексов в столбцах переменной ширины таблиц NDB выполняются онлайн. Операции онлайн не требуют пересоздания индексов. Они не блокируют доступ к изменяемой таблице для других API-узлов в NDB Cluster (но см. Ограничения онлайн-операций NDB в этой же секции). Такие операции не требуют режима одного пользователя для NDB изменений таблицы в NDB кластере с несколькими API-узлами; транзакции могут продолжаться без перерыва во время онлайн DDL операций.

ALGORITHM=INPLACE может быть использован для выполнения онлайн ADD COLUMN, ADD INDEX (включая CREATE INDEX операторы) и DROP INDEX операций над таблицами NDB. Также поддерживается онлайн переименование таблиц NDB.

Дисковые столбцы не могут быть добавлены к таблицам NDB онлайн. Это означает, что если вы хотите добавить столбец в памяти к таблице NDB, использующей опцию табличного уровня STORAGE DISK, вы должны явно указать использование памяти для нового столбца. Например, предположим, что вы уже создали табличный пространство ts1, и создаете таблицу t1 следующим образом:

mysql> CREATE TABLE t1 (
     >     c1 INT NOT NULL PRIMARY KEY,
     >     c2 VARCHAR(30)
     >     )
     >     TABLESPACE ts1 STORAGE DISK
     >     ENGINE NDB;
Query OK, 0 rows affected (1.73 sec)
Records: 0  Duplicates: 0  Warnings: 0

Вы можете добавить новый столбец в памяти в эту таблицу онлайн, как показано здесь:

mysql> ALTER TABLE t1
     >     ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY,
     >     ALGORITHM=INPLACE;
Query OK, 0 rows affected (1.25 sec)
Records: 0  Duplicates: 0  Warnings: 0

Этот оператор завершится ошибкой, если опция STORAGE MEMORY опущена:

mysql> ALTER TABLE t1
     >     ADD COLUMN c4 INT COLUMN_FORMAT DYNAMIC,
     >     ALGORITHM=INPLACE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason:
Adding column(s) or add/reorganize partition not supported online. Try
ALGORITHM=COPY.

Если вы опустите опцию COLUMN_FORMAT DYNAMIC, формат динамических столбцов будет использован автоматически, но будет выведено предупреждение, как показано здесь:

mysql> ALTER ONLINE TABLE t1 ADD COLUMN c4 INT STORAGE MEMORY;
Query OK, 0 rows affected, 1 warning (1.17 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1478
Message: DYNAMIC column c4 with STORAGE DISK is not supported, column will
become FIXED


mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `c1` int(11) NOT NULL,
  `c2` varchar(30) DEFAULT NULL,
  `c3` int(11) /*!50606 STORAGE MEMORY */ /*!50606 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL,
  `c4` int(11) /*!50606 STORAGE MEMORY */ DEFAULT NULL,
  PRIMARY KEY (`c1`)
) /*!50606 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1
1 row in set (0.03 sec)
Примечание

Ключевые слова STORAGE и COLUMN_FORMAT поддерживаются только в NDB Cluster; в любой другой версии MySQL попытка использовать эти ключевые слова в операторе CREATE TABLE или ALTER TABLE приведет к ошибке.

Также можно использовать оператор ALTER TABLE ... REORGANIZE PARTITION, ALGORITHM=INPLACE без опции partition_names INTO (partition_definitions) для NDB таблиц. Это может использоваться для перераспределения данных NDB Cluster между новыми узлами данных, добавленными в кластер онлайн. Это не выполняет дефрагментацию, которая требует оператора OPTIMIZE TABLE или null ALTER TABLE. Для получения дополнительной информации, см. Раздел 21.6.7, «Добавление узлов данных NDB Cluster онлайн».

Ограничения онлайн-операций NDB

Онлайн DROP COLUMN операции не поддерживаются.

Онлайн ALTER TABLE, CREATE INDEX или DROP INDEX операторы, добавляющие столбцы или добавляющие/удаляющие индексы, имеют следующие ограничения:

  • Данный онлайн ALTER TABLE может использовать только один из ADD COLUMN, ADD INDEX или DROP INDEX. Один или несколько столбцов могут быть добавлены онлайн в одном операторе; только один индекс может быть создан или удален онлайн в одном операторе.

  • Таблица, которая изменяется, не блокируется для API-узлов, кроме того, на котором выполняется онлайн ALTER TABLE ADD COLUMN, ADD INDEX или DROP INDEX операция (или CREATE INDEX или DROP INDEX оператор). Однако, таблица заблокирована для любых других операций, исходящих от того же API-узла, в то время пока выполняется онлайн-операция.

  • Изменяемая таблица должна иметь явную первичный ключ; скрытый первичный ключ, созданный движком хранения NDB, не подходит для этой цели.

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

  • Использованное табличное пространство для таблицы не может быть изменено онлайн. (Ошибка #99269, Ошибка #31180526)

  • При использовании с NDB Cluster таблицами данных на диске нельзя изменить тип хранения (DISK или MEMORY) столбца онлайн. Это означает, что если вы добавляете или удаляете индекс таким образом, что операция будет выполнена онлайн, и вы хотите изменить тип хранения столбца или столбцов, вы должны использовать ALGORITHM=COPY в операторе, который добавляет или удаляет индекс.

Столбцы, добавляемые онлайн, не могут использовать типы BLOB или TEXT, и должны соответствовать следующим критериям:

  • Столбцы должны быть динамическими; то есть их можно создать с помощью COLUMN_FORMAT DYNAMIC. Если вы опустите опцию COLUMN_FORMAT DYNAMIC, формат динамических столбцов будет использован автоматически.

  • Столбцы должны допускать NULL значения и не иметь явного значения по умолчанию, отличного от NULL. Столбцы, добавленные онлайн, автоматически создаются как DEFAULT NULL, как показано здесь:

    mysql> CREATE TABLE t2 (
         >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
         >     ) ENGINE=NDB;
    Query OK, 0 rows affected (1.44 sec)
    
    mysql> ALTER TABLE t2
         >     ADD COLUMN c2 INT,
         >     ADD COLUMN c3 INT,
         >     ALGORITHM=INPLACE;
    Query OK, 0 rows affected, 2 warnings (0.93 sec)
    
    mysql> SHOW CREATE TABLE t1\G
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t2` (
      `c1` int(11) NOT NULL AUTO_INCREMENT,
      `c2` int(11) DEFAULT NULL,
      `c3` int(11) DEFAULT NULL,
      PRIMARY KEY (`c1`)
    ) ENGINE=ndbcluster DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
  • Столбцы должны быть добавлены после любых существующих столбцов. Если вы попытаетесь добавить столбец онлайн до каких-либо существующих столбцов или используя ключевое слово FIRST, оператор завершится ошибкой.

  • Существующие столбцы таблицы не могут быть переупорядочены онлайн.

END_OF_DOCUMENT_MARKER ```

Для онлайн ALTER TABLE операций с таблицами NDB, столбцы с фиксированным форматом преобразуются в динамические при их онлайн добавлении или при онлайн создании или удалении индексов, как показано здесь (повторяя CREATE TABLE и ALTER TABLE операторы ради ясности):

mysql> CREATE TABLE t2 (
     >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
     >     ) ENGINE=NDB;
Query OK, 0 rows affected (1.44 sec)

mysql> ALTER TABLE t2
     >     ADD COLUMN c2 INT,
     >     ADD COLUMN c3 INT,
     >     ALGORITHM=INPLACE;
Query OK, 0 rows affected, 2 warnings (0.93 sec)

mysql> SHOW WARNINGS;
*************************** 1. row ***************************
  Level: Warning
   Code: 1478
Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN
*************************** 2. row ***************************
  Level: Warning
   Code: 1478
Message: Converted FIXED field 'c3' to DYNAMIC to enable online ADD COLUMN
2 rows in set (0.00 sec)

Динамическими должны быть только столбцы, которые добавляются онлайн. Существующие столбцы не обязательно должны быть динамическими, это включает первичный ключ таблицы, который также может быть FIXED, как показано здесь:

mysql> CREATE TABLE t3 (
     >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED
     >     ) ENGINE=NDB;
Query OK, 0 rows affected (2.10 sec)

mysql> ALTER TABLE t3 ADD COLUMN c2 INT, ALGORITHM=INPLACE;
Query OK, 0 rows affected, 1 warning (0.78 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW WARNINGS;
*************************** 1. row ***************************
  Level: Warning
   Code: 1478
Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN
1 row in set (0.00 sec)

Столбцы не преобразуются из FIXED в DYNAMIC формат столбцов при переименовании операций. Более подробную информацию об COLUMN_FORMAT см. в разделе 13.1.18, «CREATE TABLE Statement».

Ключевые слова KEY, CONSTRAINT и IGNORE поддерживаются в операторах ALTER TABLE с использованием ALGORITHM=INPLACE.

Начиная с NDB Cluster 7.5.7, установка MAX_ROWS в 0 с помощью онлайн оператора ALTER TABLE запрещена. Для выполнения этой операции необходимо использовать копирующий оператор ALTER TABLE. (Ошибка #21960004)

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/mysql-cluster-online-operations.html

Spec-Zone.ru

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