Spec-Zone.ru › MySQL 9.2

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

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

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

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

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

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

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

Операции DML недопустимы одновременно с операцией копирования ALTER TABLE.

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

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

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

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

ALGORITHM=INSTANT не поддерживается в NDB 9.2.

Независимо от используемого алгоритма, 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=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
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 или оператора ALTER TABLE со значением NULL. Более подробную информацию см. в Разделе 25.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, недостаточен для этой цели.

  • Двигатель хранения, используемый таблицей, нельзя изменить онлайн.

  • Табличное пространство, используемое таблицей, нельзя изменить онлайн. Операторы, такие как ALTER TABLE ndb_table ... ALGORITHM=INPLACE, TABLESPACE=new_tablespace, запрещены.

  • При использовании с таблицами NDB Cluster Disk Data невозможно изменить тип хранения (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=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    1 row in set (0.00 sec)
    
  • Столбцы должны быть добавлены после любых существующих столбцов. Если вы попытаетесь добавить столбец онлайн до любых существующих столбцов или используя ключевое слово FIRST, оператор завершится ошибкой.

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

Для онлайн-операций 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 см. Раздел 15.1.21, «CREATE TABLE Statement».

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

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

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

Spec-Zone.ru

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