Операции InnoDB по онлайн-изменению структуры с алгоритмом NOCOPY
Операции, поддерживаемые по наследованию
Когда в предложении ALGORITHM установлено значение NOCOPY, поддерживаемые операции являются супермножеством операций, которые поддерживаются, когда в предложении ALGORITHM установлено значение INSTANT.
Следовательно, когда в предложении ALGORITHM установлено значение NOCOPY, некоторые операции поддерживаются по наследованию. Более подробную информацию об этих поддерживаемых операциях см. на следующих страницах:
Операции с колонками
ALTER TABLE ... ADD COLUMN
В MariaDB 10.3.2 и более поздних версиях InnoDB поддерживает добавление колонок к таблице с ALGORITHM, установленным в значение NOCOPY, в тех случаях, когда операция поддерживает значение ALGORITHM, установленное в INSTANT.
См. Операции InnoDB по онлайн-изменению структуры с ALGORITHM=INSTANT: ALTER TABLE ... ADD COLUMN для получения дополнительной информации.
Это относится к ALTER TABLE ... ADD COLUMN для таблиц InnoDB.
ALTER TABLE ... DROP COLUMN
В MariaDB 10.4 и более поздних версиях InnoDB поддерживает удаление колонок из таблицы с ALGORITHM, установленным в значение NOCOPY, в тех случаях, когда операция поддерживает значение ALGORITHM, установленное в INSTANT.
См. Операции InnoDB по онлайн-изменению структуры с ALGORITHM=INSTANT: ALTER TABLE ... DROP COLUMN для получения дополнительной информации.
Это относится к ALTER TABLE ... DROP COLUMN для таблиц InnoDB.
ALTER TABLE ... MODIFY COLUMN
Это относится к ALTER TABLE ... MODIFY COLUMN для таблиц InnoDB.
Переупорядочение колонок
В MariaDB 10.4 и более поздних версиях InnoDB поддерживает переупорядочение колонок в таблице с ALGORITHM, установленным в значение NOCOPY, в тех случаях, когда операция поддерживает значение ALGORITHM, установленное в INSTANT.
См. Операции InnoDB по онлайн-изменению структуры с ALGORITHM=INSTANT: Переупорядочение колонок для получения дополнительной информации.
Изменение типа данных колонки
InnoDB не поддерживает изменение типа данных колонки с ALGORITHM, установленным в значение NOCOPY в большинстве случаев. Есть несколько исключений в тех случаях, когда операция поддерживает значение ALGORITHM, установленное в INSTANT.
См. Операции InnoDB по онлайн-изменению структуры с ALGORITHM=INSTANT: Изменение типа данных колонки для получения дополнительной информации.
Изменение колонки на NULL
В MariaDB 10.4.3 и более поздних версиях InnoDB поддерживает изменение колонки для поддержки значений NULL с ALGORITHM, установленным в значение NOCOPY, в тех случаях, когда операция поддерживает значение ALGORITHM, установленное в INSTANT.
См. Операции InnoDB по онлайн-изменению структуры с ALGORITHM=INSTANT: Изменение колонки на NULL для получения дополнительной информации.
Изменение колонки на NOT NULL
InnoDB не поддерживает изменение колонки для запрещения значений NULL с ALGORITHM, установленным в значение NOCOPY.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ) ROW_FORMAT=REDUNDANT; SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab MODIFY COLUMN c varchar(50) NOT NULL; ERROR 1845 (0A000): ALGORITHM=NOCOPY is not supported for this operation. Try ALGORITHM=INPLACE
Добавление нового ENUM значения
InnoDB поддерживает добавление нового значения ENUM к колонке с ALGORITHM, установленным в значение NOCOPY, в тех случаях, когда операция поддерживает значение ALGORITHM, установленное в INSTANT.
См. Операции InnoDB по онлайн-изменению структуры с ALGORITHM=INSTANT: Добавление нового значения ENUM для получения дополнительной информации.
Добавление нового SET значения
InnoDB поддерживает добавление нового значения SET к колонке с ALGORITHM, установленным в значение NOCOPY, в тех случаях, когда операция поддерживает значение ALGORITHM, установленное в INSTANT.
См. Операции InnoDB по онлайн-изменению структуры с ALGORITHM=INSTANT: Добавление нового значения SET для получения дополнительной информации.
Удаление системного контроля версий из колонки
В MariaDB 10.3.8 и более поздних версиях InnoDB поддерживает удаление системного контроля версий из колонки с ALGORITHM, установленным в значение NOCOPY, в тех случаях, когда операция поддерживает значение ALGORITHM, установленное в INSTANT.
См. Операции InnoDB по онлайн-изменению структуры с ALGORITHM=INSTANT: Удаление системного контроля версий из колонки для получения дополнительной информации.
ALTER TABLE ... ALTER COLUMN
Это относится к ALTER TABLE ... ALTER COLUMN для таблиц InnoDB.
Установка значения по умолчанию для колонки
InnoDB поддерживает изменение значения по умолчанию (DEFAULT) колонки с ALGORITHM, установленным в значение NOCOPY, в тех случаях, когда операция поддерживает значение ALGORITHM, установленное в INSTANT.
См. Операции InnoDB по онлайн-изменению структуры с ALGORITHM=INSTANT: Установка значения по умолчанию для колонки для получения дополнительной информации.
Удаление значения по умолчанию для колонки
InnoDB поддерживает удаление значения по умолчанию (DEFAULT) колонки с ALGORITHM, установленным в значение NOCOPY, в тех случаях, когда операция поддерживает значение ALGORITHM, установленное в INSTANT.
См. Операции InnoDB по онлайн-изменению структуры с ALGORITHM=INSTANT: Удаление значения по умолчанию для колонки для получения дополнительной информации.
ALTER TABLE ... CHANGE COLUMN
InnoDB поддерживает переименование колонки с ALGORITHM, установленным в значение NOCOPY, в тех случаях, когда операция поддерживает значение ALGORITHM, установленное в INSTANT.
См. Операции InnoDB по онлайн-изменению структуры с ALGORITHM=INSTANT: ALTER TABLE ... CHANGE COLUMN для получения дополнительной информации.
Это относится к ALTER TABLE ... CHANGE COLUMN для таблиц InnoDB.
Операции с индексами
ALTER TABLE ... ADD PRIMARY KEY
InnoDB не поддерживает добавление первичного ключа к таблице с ALGORITHM, установленным в значение NOCOPY.
Например:
CREATE OR REPLACE TABLE tab ( a int, b varchar(50), c varchar(50) ); SET SESSION sql_mode='STRICT_TRANS_TABLES'; SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab ADD PRIMARY KEY (a); ERROR 1845 (0A000): ALGORITHM=NOCOPY is not supported for this operation. Try ALGORITHM=INPLACE
Это относится к ALTER TABLE ... ADD PRIMARY KEY для таблиц InnoDB.
ALTER TABLE ... DROP PRIMARY KEY
InnoDB не поддерживает удаление первичного ключа с ALGORITHM, установленным в значение NOCOPY.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab DROP PRIMARY KEY; ERROR 1846 (0A000): ALGORITHM=NOCOPY is not supported. Reason: Dropping a primary key is not allowed without also adding a new primary key. Try ALGORITHM=COPY
Это относится к ALTER TABLE ... DROP PRIMARY KEY для таблиц InnoDB.
ALTER TABLE ... ADD INDEX и CREATE INDEX
Это относится к ALTER TABLE ... ADD INDEX и CREATE INDEX для таблиц InnoDB.
Добавление простого индекса
InnoDB поддерживает добавление простого индекса к таблице с ALGORITHM, установленным в значение NOCOPY.
Эта операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив предложение LOCK в значение NONE. При использовании этой стратегии допускается все одновременные операции DML.
Например, это выполняется успешно:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab ADD INDEX b_index (b); Query OK, 0 rows affected (0.009 sec)
И это выполняется успешно:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='NOCOPY'; CREATE INDEX b_index ON tab (b); Query OK, 0 rows affected (0.009 sec)
Добавление полнотекстового индекса
InnoDB поддерживает добавление индекса FULLTEXT к таблице с параметром ALGORITHM установленным в NOCOPY.
Однако существуют некоторые ограничения, такие как:
- Добавление индекса FULLTEXT к таблице, у которой нет столбца, определенного пользователем
FTS_DOC_ID, потребует перестроения таблицы. При перестроении система добавляет скрытый столбецFTS_DOC_ID. Эта операция должна быть выполнена с параметром ALGORITHM установленным вINPLACE. После этого, добавление дополнительных индексов FULLTEXT в ту же таблицу не потребует перестроения таблицы, и параметр ALGORITHM может быть установлен вNOCOPY.
- Одновременно может быть добавлен только один индекс FULLTEXT при установке параметра ALGORITHM в
NOCOPY.
Данная операция поддерживает стратегию блокировки для чтения. Эту стратегию можно явно выбрать, установив в предложении LOCK значение SHARED. При использовании этой стратегии разрешается одновременная DML-операция для чтения.
Например, это успешно выполняется, но первая операция требует перестроения таблицы ALGORITHM установленным в INPLACE, чтобы добавить скрытый FTS_DOC_ID столбец:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INPLACE'; ALTER TABLE tab ADD FULLTEXT INDEX b_index (b); Query OK, 0 rows affected (0.043 sec) SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab ADD FULLTEXT INDEX c_index (c); Query OK, 0 rows affected (0.017 sec)
И эта команда также выполняется успешно, как и предыдущая:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INPLACE'; CREATE FULLTEXT INDEX b_index ON tab (b); Query OK, 0 rows affected (0.048 sec) SET SESSION alter_algorithm='NOCOPY'; CREATE FULLTEXT INDEX c_index ON tab (c); Query OK, 0 rows affected (0.016 sec)
Но эта вторая команда завершается ошибкой, потому что одновременно может быть добавлен только один индекс FULLTEXT:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50), d varchar(50) ); SET SESSION alter_algorithm='INPLACE'; ALTER TABLE tab ADD FULLTEXT INDEX b_index (b); Query OK, 0 rows affected (0.041 sec) SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab ADD FULLTEXT INDEX c_index (c), ADD FULLTEXT INDEX d_index (d); ERROR 1846 (0A000): ALGORITHM=NOCOPY is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY
Добавление пространственного индекса
InnoDB поддерживает добавление пространственного индекса SPATIAL к таблице с параметром ALGORITHM установленным в NOCOPY.
Данная операция поддерживает стратегию блокировки для чтения. Эту стратегию можно явно выбрать, установив в предложении LOCK значение SHARED. При использовании этой стратегии разрешается одновременная DML-операция для чтения.
Например, это успешно выполняется:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c GEOMETRY NOT NULL ); SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab ADD SPATIAL INDEX c_index (c); Query OK, 0 rows affected (0.005 sec)
И эта команда также выполняется успешно, как и предыдущая:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c GEOMETRY NOT NULL ); SET SESSION alter_algorithm='NOCOPY'; CREATE SPATIAL INDEX c_index ON tab (c); Query OK, 0 rows affected (0.005 sec)
ALTER TABLE ... DROP INDEX и DROP INDEX
InnoDB поддерживает удаление индексов из таблицы с параметром ALGORITHM установленным в NOCOPY в тех случаях, когда операция поддерживает установку предложения ALGORITHM со значением INSTANT.
Для получения дополнительной информации см. InnoDB Online DDL Operations with ALGORITHM=INSTANT: ALTER TABLE ... DROP INDEX and DROP INDEX.
Это относится к ALTER TABLE ... DROP INDEX и DROP INDEX для таблиц InnoDB.
Добавление внешнего ключа
InnoDB поддерживает добавление ограничений внешнего ключа к таблице с параметром ALGORITHM установленным в NOCOPY. Для добавления нового ограничения внешнего ключа к таблице с параметром ALGORITHM установленным в NOCOPY, необходимо установить системную переменную foreign_key_checks в значение OFF. Если она установлена в ON, то требуется ALGORITHM=COPY.
Данная операция поддерживает стратегию без блокировки. Эту стратегию можно явно выбрать, установив в предложении LOCK значение NONE. При использовании этой стратегии разрешается любая одновременная DML-операция.
Например, это завершается ошибкой:
CREATE OR REPLACE TABLE tab1 ( a int PRIMARY KEY, b varchar(50), c varchar(50), d int ); CREATE OR REPLACE TABLE tab2 ( a int PRIMARY KEY, b varchar(50) ); SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab1 ADD FOREIGN KEY tab2_fk (d) REFERENCES tab2 (a); ERROR 1846 (0A000): ALGORITHM=NOCOPY is not supported. Reason: Adding foreign keys needs foreign_key_checks=OFF. Try ALGORITHM=COPY
Но это выполняется успешно:
CREATE OR REPLACE TABLE tab1 ( a int PRIMARY KEY, b varchar(50), c varchar(50), d int ); CREATE OR REPLACE TABLE tab2 ( a int PRIMARY KEY, b varchar(50) ); SET SESSION foreign_key_checks=OFF; SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab1 ADD FOREIGN KEY tab2_fk (d) REFERENCES tab2 (a); Query OK, 0 rows affected (0.011 sec)
Это относится к ALTER TABLE ... ADD FOREIGN KEY для таблиц InnoDB.
Удаление внешнего ключа
InnoDB поддерживает удаление ограничений внешнего ключа из таблицы с параметром ALGORITHM установленным в NOCOPY в тех случаях, когда операция поддерживает установку предложения ALGORITHM со значением INSTANT.
Для получения дополнительной информации см. InnoDB Online DDL Operations with ALGORITHM=INSTANT: ALTER TABLE ... DROP FOREIGN KEY.
Это относится к ALTER TABLE ... DROP FOREIGN KEY для таблиц InnoDB.
Операции над таблицами
Изменение значения AUTO_INCREMENT
InnoDB поддерживает изменение значения AUTO_INCREMENT таблицы с параметром ALGORITHM установленным в NOCOPY в тех случаях, когда операция поддерживает установку предложения ALGORITHM со значением INSTANT.
Для получения дополнительной информации см. InnoDB Online DDL Operations with ALGORITHM=INSTANT: ALTER TABLE ... AUTO_INCREMENT=....
Это относится к ALTER TABLE ... AUTO_INCREMENT=... для таблиц InnoDB.
Формат строк
InnoDB не поддерживает изменение формата строк таблицы с параметром ALGORITHM установленным в NOCOPY.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ) ROW_FORMAT=DYNAMIC; SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab ROW_FORMAT=COMPRESSED; ERROR 1846 (0A000): ALGORITHM=NOCOPY is not supported. Reason: Changing table options requires the table to be rebuilt. Try ALGORITHM=INPLACE
Это относится к ALTER TABLE ... ROW_FORMAT=... для таблиц InnoDB.
Размер блока ключей
InnoDB не поддерживает изменение размера блока ключей таблицы с параметром ALGORITHM установленным в NOCOPY.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4; SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab KEY_BLOCK_SIZE=2; ERROR 1846 (0A000): ALGORITHM=NOCOPY is not supported. Reason: Changing table options requires the table to be rebuilt. Try ALGORITHM=INPLACE
Это относится к KEY_BLOCK_SIZE=... для таблиц InnoDB.
ALTER TABLE ... PAGE_COMPRESSED=1 и ALTER TABLE ... PAGE_COMPRESSION_LEVEL=...
В MariaDB 10.3.10 и более поздних версиях InnoDB поддерживает установку значения PAGE_COMPRESSED таблицы в 1 с параметром ALGORITHM установленным в NOCOPY в тех случаях, когда операция поддерживает установку предложения ALGORITHM со значением INSTANT.
InnoDB не поддерживает изменение значения PAGE_COMPRESSED таблицы со значением 1 на 0 с параметром ALGORITHM установленным в NOCOPY.
В этих версиях InnoDB также поддерживает изменение значения PAGE_COMPRESSION_LEVEL таблицы с параметром ALGORITHM установленным в NOCOPY в тех случаях, когда операция поддерживает установку предложения ALGORITHM со значением INSTANT.
Для получения дополнительной информации см. InnoDB Online DDL Operations with ALGORITHM=INSTANT: ALTER TABLE ... PAGE_COMPRESSED=1 and ALTER TABLE ... PAGE_COMPRESSION_LEVEL=....
Это относится к ALTER TABLE ... PAGE_COMPRESSED=... и ALTER TABLE ... PAGE_COMPRESSION_LEVEL=... для таблиц InnoDB.
Удаление системного верифицирования
InnoDB не поддерживает удаление системного верифицирования из таблицы с параметром ALGORITHM установленным в NOCOPY.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ) WITH SYSTEM VERSIONING; SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab DROP SYSTEM VERSIONING; ERROR 1845 (0A000): ALGORITHM=NOCOPY is not supported for this operation. Try ALGORITHM=INPLACE
Это относится к ALTER TABLE ... DROP SYSTEM VERSIONING для таблиц InnoDB.
Удаление ограничения
В MariaDB 10.3.6 и более поздних версиях InnoDB поддерживает удаление ограничения CHECK из таблицы с параметром ALGORITHM установленным в NOCOPY в тех случаях, когда операция поддерживает установку предложения ALGORITHM со значением INSTANT.
Для получения дополнительной информации см. InnoDB Online DDL Operations with ALGORITHM=INSTANT: ALTER TABLE ... DROP CONSTRAINT.
Это относится к ALTER TABLE ... DROP CONSTRAINT для таблиц InnoDB.
Принудительное перестроение
InnoDB не поддерживает принудительное перестроение таблицы с параметром ALGORITHM установленным в NOCOPY.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab FORCE; ERROR 1845 (0A000): ALGORITHM=NOCOPY is not supported for this operation. Try ALGORITHM=INPLACE
Это относится к ALTER TABLE ... FORCE для таблиц InnoDB.
Использование движка InnoDB
InnoDB не поддерживает принудительное перестроение таблицы с параметром ALGORITHM установленным в NOCOPY.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='NOCOPY'; ALTER TABLE tab ENGINE=InnoDB; ERROR 1845 (0A000): ALGORITHM=NOCOPY is not supported for this operation. Try ALGORITHM=INPLACE
Это относится к ALTER TABLE ... ENGINE=InnoDB для таблиц InnoDB.
Оптимизация таблицы
InnoDB не поддерживает оптимизацию таблицы с параметром ALGORITHM установленным в NOCOPY.
Например:
CREATE OR REPLACE TABLE tab (
a int PRIMARY KEY,
b varchar(50),
c varchar(50)
);
SHOW GLOBAL VARIABLES WHERE Variable_name IN('innodb_defragment', 'innodb_optimize_fulltext_only');
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| innodb_defragment | OFF |
| innodb_optimize_fulltext_only | OFF |
+-------------------------------+-------+
2 rows in set (0.001 sec)
SET SESSION alter_algorithm='NOCOPY';
OPTIMIZE TABLE tab;
+---------+----------+----------+-----------------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+---------+----------+----------+-----------------------------------------------------------------------------+
| db1.tab | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| db1.tab | optimize | error | ALGORITHM=NOCOPY is not supported for this operation. Try ALGORITHM=INPLACE |
| db1.tab | optimize | status | Operation failed |
+---------+----------+----------+-----------------------------------------------------------------------------+
3 rows in set, 1 warning (0.002 sec)
Это относится к ОПТИМИЗАЦИИ ТАБЛИЦЫ для таблиц InnoDB.
ALTER TABLE ... RENAME TO и RENAME TABLE ...
InnoDB поддерживает переименование таблицы с АЛГОРИТМОМ, установленным в NOCOPY, в тех случаях, когда операция поддерживает установку АЛГОРИТМА в значение INSTANT.
Дополнительную информацию см. в разделе InnoDB Онлайн DDL-операции с ALGORITHM=INSTANT: ALTER TABLE ... RENAME TO и RENAME TABLE ....
Это относится к ALTER TABLE ... RENAME TO и RENAME TABLE для таблиц InnoDB.
Ограничения
Ограничения, связанные с сгенерированными (виртуальными и постоянными/хранимыми) столбцами
Сгенерированные столбцы в настоящее время не поддерживают онлайн DDL для всех тех же операций, что и для «реальных» столбцов.
Дополнительную информацию об ограничениях см. в разделе Сгенерированные (виртуальные и постоянные/хранимые) столбцы: Поддержка операторов.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/innodb-online-ddl-operations-with-algorithmnocopy/