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 8.4.
Независимо от используемого алгоритма, 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 или null ALTER TABLE. Дополнительную информацию см. в Разделе 25.6.7, «Добавление узлов данных NDB Cluster онлайн».
Ограничения онлайн операций NDB
Онлайн DROP COLUMN операции не поддерживаются.
Онлайн ALTER TABLE, CREATE INDEX или DROP INDEX операторы, которые добавляют столбцы или добавляют или удаляют индексы, ограничены следующим:
Данный онлайн
ALTER TABLEможет использовать только один изADD COLUMN,ADD INDEXилиDROP INDEX. Один или более столбцов могут быть добавлены онлайн в одном операторе; только один индекс может быть создан или удалён онлайн в одном операторе.Таблица, которая изменяется, не блокируется для узлов API, отличных от того, на котором выполняется онлайн
ALTER TABLEADD 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.20, «Заявление CREATE TABLE».
Ключевые слова KEY, CONSTRAINT и IGNORE поддерживаются в ALTER TABLE операциях с использованием ALGORITHM=INPLACE.
Установка MAX_ROWS в 0 с помощью онлайн-ALTER TABLE оператора запрещена. Вы должны использовать копирование ALTER TABLE для выполнения этой операции. (Ошибка #21960004)
© 2025 Oracle
Licensed under the GPLv2 License.