Операции InnoDB Online DDL с алгоритмом INSTANT Alter
Операции с колонками
ALTER TABLE ... ADD COLUMN
В MariaDB 10.3.2 и более поздних версиях InnoDB поддерживает добавление колонок в таблицу с ALGORITHM, установленным в INSTANT если новая колонка является последней колонкой в таблице. См. MDEV-11369 для получения дополнительной информации. Если в таблице есть скрытая колонка FTS_DOC_ID, то это не поддерживается.
В MariaDB 10.4 и более поздних версиях InnoDB поддерживает добавление колонок в таблицу с ALGORITHM, установленным в INSTANT, независимо от того, где в списке колонок добавляется новая колонка.
Когда эта операция выполняется с ALGORITHM, установленным в INSTANT, файл пространства таблицы будет иметь неканонический формат хранения. См. Неканонический формат хранения, вызванный некоторыми операциями для получения дополнительной информации.
За исключением добавления колонки с автоинкрементом, эта операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив клаузу LOCK в NONE. Когда используется эта стратегия, все одновременные операции DML разрешены.
Например, это успешно выполняется:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab ADD COLUMN c varchar(50); Query OK, 0 rows affected (0.004 sec)
А это успешно выполняется в MariaDB 10.4 и более поздних версиях:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab ADD COLUMN c varchar(50) AFTER a; Query OK, 0 rows affected (0.004 sec)
Это относится к ALTER TABLE ... ADD COLUMN для таблиц InnoDB.
См. Моментальное добавление колонок для InnoDB для получения дополнительной информации.
ALTER TABLE ... DROP COLUMN
В MariaDB 10.4 и более поздних версиях InnoDB поддерживает удаление колонок из таблицы с ALGORITHM, установленным в INSTANT. См. MDEV-15562 для получения дополнительной информации.
Когда эта операция выполняется с ALGORITHM, установленным в INSTANT, файл пространства таблицы будет иметь неканонический формат хранения. См. Неканонический формат хранения, вызванный некоторыми операциями для получения дополнительной информации.
Эта операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив клаузу LOCK в NONE. Когда используется эта стратегия, все одновременные операции DML разрешены.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab DROP COLUMN c; Query OK, 0 rows affected (0.004 sec)
Это относится к ALTER TABLE ... DROP COLUMN для таблиц InnoDB.
ALTER TABLE ... MODIFY COLUMN
Это относится к ALTER TABLE ... MODIFY COLUMN для таблиц InnoDB.
Переупорядочение колонок
В MariaDB 10.4 и более поздних версиях InnoDB поддерживает переупорядочение колонок в таблице с ALGORITHM, установленным в INSTANT. См. MDEV-15562 для получения дополнительной информации.
Когда эта операция выполняется с ALGORITHM, установленным в INSTANT, файл пространства таблицы будет иметь неканонический формат хранения. См. Неканонический формат хранения, вызванный некоторыми операциями для получения дополнительной информации.
Эта операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив клаузу LOCK в NONE. Когда используется эта стратегия, все одновременные операции DML разрешены.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab MODIFY COLUMN c varchar(50) AFTER a; Query OK, 0 rows affected (0.004 sec)
Изменение типа данных колонки
InnoDB не поддерживает изменение типа данных колонки с ALGORITHM, установленным в INSTANT в большинстве случаев. Есть некоторые исключения:
- InnoDB поддерживает увеличение длины колонок
VARCHARс ALGORITHM, установленным вINSTANT, если это не потребует изменения количества байтов, необходимых для представления длины колонки. КолонкаVARCHARразмером от 0 до 255 байт требует 1 байт для представления своей длины, в то время как колонкаVARCHARразмером 256 байт или больше требует 2 байта для представления своей длины. Это означает, что длина колонки не может быть увеличена с ALGORITHM, установленным вINSTANT, если исходная длина была меньше 256 байт, а новая длина составляет 256 байт или больше.
- В MariaDB 10.4.3 и более поздних версиях InnoDB поддерживает увеличение длины колонок
VARCHARс ALGORITHM, установленным вINSTANTбез ограничений, если параметр таблицы ROW_FORMAT установлен в REDUNDANT. См. MDEV-15563 для получения дополнительной информации.
- В MariaDB 10.4.3 и более поздних версиях InnoDB также поддерживает увеличение длины колонок
VARCHARс ALGORITHM, установленным вINSTANTболее ограниченным образом, если параметр таблицы ROW_FORMAT установлен в COMPACT, DYNAMIC или COMPRESSED. В этом случае действуют следующие ограничения:- Длина может быть увеличена с ALGORITHM, установленным в
INSTANTесли исходная длина колонки составляет 127 байт или меньше, а новая длина колонки составляет 256 байт или больше. - Длина может быть увеличена с ALGORITHM, установленным в
INSTANTесли исходная длина колонки составляет 255 байт или меньше, а новая длина колонки по-прежнему составляет 255 байт или меньше. - Длина может быть увеличена с ALGORITHM, установленным в
INSTANTесли исходная длина колонки составляет 256 байт или больше, а новая длина колонки по-прежнему составляет 256 байт или больше. - Длина не может быть увеличена с ALGORITHM, установленным в
INSTANTесли исходная длина находилась между 128 байтами и 255 байтами, а новая длина составляет 256 байт или более. - См. MDEV-15563 для получения дополнительной информации.
- Длина может быть увеличена с ALGORITHM, установленным в
Поддерживаемые операции в этой категории поддерживают стратегию без блокировок. Эту стратегию можно явно выбрать, установив клаузу LOCK в NONE. Когда используется эта стратегия, все одновременные операции DML разрешены.
Например, это завершается ошибкой:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab MODIFY COLUMN c int; ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY
Но это успешно выполняется, потому что исходная длина колонки меньше 256 байт, а новая длина по-прежнему меньше 256 байт:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ) CHARACTER SET=latin1; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab MODIFY COLUMN c varchar(100); Query OK, 0 rows affected (0.005 sec)
Но это завершается ошибкой, потому что исходная длина колонки находится между 128 байтами и 255 байтами, а новая длина больше 256 байт:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(255) ) CHARACTER SET=latin1; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab MODIFY COLUMN c varchar(256); ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY
Но это успешно выполняется в MariaDB 10.4.3 и более поздних версиях, потому что таблица имеет ROW_FORMAT=REDUNDANT.
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(200) ) ROW_FORMAT=REDUNDANT; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab MODIFY COLUMN c varchar(300); Query OK, 0 rows affected (0.004 sec)
И это успешно выполняется в MariaDB 10.4.3 и более поздних версиях, потому что таблица имеет ROW_FORMAT=DYNAMIC и исходная длина колонки составляет 127 байт или меньше:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(127) ) ROW_FORMAT=DYNAMIC CHARACTER SET=latin1; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab MODIFY COLUMN c varchar(300); Query OK, 0 rows affected (0.003 sec)
И это успешно выполняется в MariaDB 10.4.3 и более поздних версиях, потому что таблица имеет ROW_FORMAT=COMPRESSED и исходная длина колонки составляет 127 байт или меньше:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(127) ) ROW_FORMAT=COMPRESSED CHARACTER SET=latin1; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab MODIFY COLUMN c varchar(300); Query OK, 0 rows affected (0.003 sec)
Но это завершается ошибкой даже в MariaDB 10.4.3 и более поздних версиях, потому что таблица имеет ROW_FORMAT=DYNAMIC и исходная длина колонки находится между 128 байтами и 255 байтами:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(128) ) ROW_FORMAT=DYNAMIC CHARACTER SET=latin1; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab MODIFY COLUMN c varchar(300); ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY
Изменение колонки на NULL
В MariaDB 10.4.3 и более поздних версиях InnoDB поддерживает изменение колонки, разрешающей значения NULL, с ALGORITHM, установленным в INSTANT если параметр таблицы ROW_FORMAT установлен в REDUNDANT. См. MDEV-15563 для получения дополнительной информации.
Эта операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив клаузу LOCK в NONE. Когда используется эта стратегия, все одновременные операции DML разрешены.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) NOT NULL ) ROW_FORMAT=REDUNDANT; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab MODIFY COLUMN c varchar(50) NULL; Query OK, 0 rows affected (0.004 sec)
Изменение колонки на NOT NULL
InnoDB не поддерживает изменение колонки, запрещающей значения NULL, с ALGORITHM, установленным в INSTANT.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ) ROW_FORMAT=REDUNDANT; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab MODIFY COLUMN c varchar(50) NOT NULL; ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=INPLACE
Добавление нового ENUM значения
InnoDB поддерживает добавление нового значения ENUM в колонку с ALGORITHM, установленным в INSTANT. Для добавления нового значения ENUM с ALGORITHM, установленным в INSTANT, должны выполняться следующие требования:
- Он должен добавляться в конец списка.
- Требования к хранению не должны измениться.
Эта операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив клаузу LOCK в NONE. Когда используется эта стратегия, все одновременные операции DML разрешены.
Например, это успешно выполняется:
CREATE OR REPLACE TABLE tab (
a int PRIMARY KEY,
b varchar(50),
c ENUM('red', 'green')
);
SET SESSION alter_algorithm='INSTANT';
ALTER TABLE tab MODIFY COLUMN c ENUM('red', 'green', 'blue');
Query OK, 0 rows affected (0.002 sec)
Но это завершается ошибкой:
CREATE OR REPLACE TABLE tab (
a int PRIMARY KEY,
b varchar(50),
c ENUM('red', 'green')
);
SET SESSION alter_algorithm='INSTANT';
ALTER TABLE tab MODIFY COLUMN c ENUM('red', 'blue', 'green');
ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY
Добавление нового параметра SET
InnoDB поддерживает добавление нового параметра SET в столбец с ALGORITHM, установленным в INSTANT. Для добавления нового параметра SET с ALGORITHM, установленным в INSTANT, должны быть выполнены следующие требования:
- Он должен быть добавлен в конец списка.
- Требования к хранению не должны измениться.
Данная операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив в NONE пункт LOCK. При использовании этой стратегии разрешены все одновременные операции DML.
Например, это выполняется успешно:
CREATE OR REPLACE TABLE tab (
a int PRIMARY KEY,
b varchar(50),
c SET('red', 'green')
);
SET SESSION alter_algorithm='INSTANT';
ALTER TABLE tab MODIFY COLUMN c SET('red', 'green', 'blue');
Query OK, 0 rows affected (0.002 sec)
Но это приводит к ошибке:
CREATE OR REPLACE TABLE tab (
a int PRIMARY KEY,
b varchar(50),
c SET('red', 'green')
);
SET SESSION alter_algorithm='INSTANT';
ALTER TABLE tab MODIFY COLUMN c SET('red', 'blue', 'green');
ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY
Удаление системного контроля версий из столбца
В MariaDB 10.3.8 и более поздних версиях InnoDB поддерживает удаление системного контроля версий из столбца с ALGORITHM, установленным в INSTANT. Для этого необходимо установить системную переменную system_versioning_alter_history в KEEP. Дополнительную информацию см. в MDEV-16330.
Данная операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив в NONE пункт LOCK. При использовании этой стратегии разрешены все одновременные операции DML.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) WITH SYSTEM VERSIONING ); SET SESSION system_versioning_alter_history='KEEP'; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab MODIFY COLUMN c varchar(50) WITHOUT SYSTEM VERSIONING; Query OK, 0 rows affected (0.004 sec)
ALTER TABLE ... ALTER COLUMN
Это относится к ALTER TABLE ... ALTER COLUMN для таблиц InnoDB.
Указание значения по умолчанию для столбца
InnoDB поддерживает изменение значения по умолчанию DEFAULT столбца с ALGORITHM, установленным в INSTANT.
Данная операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив в NONE пункт LOCK. При использовании этой стратегии разрешены все одновременные операции DML.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab ALTER COLUMN c SET DEFAULT 'No value explicitly provided.'; Query OK, 0 rows affected (0.003 sec)
Удаление значения по умолчанию столбца
InnoDB поддерживает удаление значения по умолчанию DEFAULT столбца с ALGORITHM, установленным в INSTANT.
Данная операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив в NONE пункт LOCK. При использовании этой стратегии разрешены все одновременные операции DML.
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) DEFAULT 'No value explicitly provided.' ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab ALTER COLUMN c DROP DEFAULT; Query OK, 0 rows affected (0.002 sec)
ALTER TABLE ... CHANGE COLUMN
InnoDB поддерживает переименование столбца с ALGORITHM, установленным в INSTANT, за исключением случаев, когда помимо имени изменился тип данных или атрибуты столбца.
Данная операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив в NONE пункт LOCK. При использовании этой стратегии разрешены все одновременные операции DML.
Например, это выполняется успешно:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab CHANGE COLUMN c str varchar(50); Query OK, 0 rows affected (0.004 sec)
Но это приводит к ошибке:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab CHANGE COLUMN c num int; ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY
Это относится к ALTER TABLE ... CHANGE COLUMN для таблиц InnoDB.
Операции с индексами
ALTER TABLE ... ADD PRIMARY KEY
InnoDB не поддерживает добавление первичного ключа к таблице с ALGORITHM, установленным в INSTANT.
Например:
CREATE OR REPLACE TABLE tab ( a int, b varchar(50), c varchar(50) ); SET SESSION sql_mode='STRICT_TRANS_TABLES'; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab ADD PRIMARY KEY (a); ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=INPLACE
Это относится к ALTER TABLE ... ADD PRIMARY KEY для таблиц InnoDB.
ALTER TABLE ... DROP PRIMARY KEY
InnoDB не поддерживает удаление первичного ключа с ALGORITHM, установленным в INSTANT.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab DROP PRIMARY KEY; ERROR 1846 (0A000): ALGORITHM=INSTANT 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, установленным в INSTANT.
Например, это приводит к ошибке:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab ADD INDEX b_index (b); ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: ADD INDEX. Try ALGORITHM=NOCOPY
И это тоже приводит к ошибке:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; CREATE INDEX b_index ON tab (b); ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: ADD INDEX. Try ALGORITHM=NOCOPY
Добавление полнотекстового индекса
InnoDB не поддерживает добавление FULLTEXT индекса к таблице с ALGORITHM, установленным в INSTANT.
Например, это приводит к ошибке:
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.042 sec) SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab ADD FULLTEXT INDEX c_index (c); ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: ADD INDEX. Try ALGORITHM=NOCOPY
И это тоже приводит к ошибке:
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.040 sec) SET SESSION alter_algorithm='INSTANT'; CREATE FULLTEXT INDEX c_index ON tab (c); ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: ADD INDEX. Try ALGORITHM=NOCOPY
Добавление пространственного индекса
InnoDB не поддерживает добавление SPATIAL индекса к таблице с ALGORITHM, установленным в INSTANT.
Например, это приводит к ошибке:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c GEOMETRY NOT NULL ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab ADD SPATIAL INDEX c_index (c); ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: ADD INDEX. Try ALGORITHM=NOCOPY
И это тоже приводит к ошибке:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c GEOMETRY NOT NULL ); SET SESSION alter_algorithm='INSTANT'; CREATE SPATIAL INDEX c_index ON tab (c); ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: ADD INDEX. Try ALGORITHM=NOCOPY
ALTER TABLE ... ADD FOREIGN KEY
InnoDB не поддерживает добавление ограничений внешнего ключа к таблице с ALGORITHM, установленным в INSTANT.
Например:
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='INSTANT'; ALTER TABLE tab1 ADD FOREIGN KEY tab2_fk (d) REFERENCES tab2 (a); ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: ADD INDEX. Try ALGORITHM=NOCOPY
Это относится к ALTER TABLE ... ADD FOREIGN KEY для таблиц InnoDB.
ALTER TABLE ... DROP FOREIGN KEY
InnoDB поддерживает удаление ограничений внешнего ключа из таблицы с ALGORITHM, установленным в INSTANT.
Данная операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив в NONE пункт LOCK. При использовании этой стратегии разрешены все одновременные операции DML.
Например:
CREATE OR REPLACE TABLE tab2 ( a int PRIMARY KEY, b varchar(50) ); CREATE OR REPLACE TABLE tab1 ( a int PRIMARY KEY, b varchar(50), c varchar(50), d int, FOREIGN KEY tab2_fk (d) REFERENCES tab2 (a) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab1 DROP FOREIGN KEY tab2_fk; Query OK, 0 rows affected (0.004 sec)
Это относится к ALTER TABLE ... DROP FOREIGN KEY для таблиц InnoDB.
Операции с таблицами
ALTER TABLE ... AUTO_INCREMENT=...
InnoDB поддерживает изменение значения AUTO_INCREMENT таблицы с ALGORITHM, установленным в INSTANT.
Данная операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив в NONE пункт LOCK. При использовании этой стратегии разрешены все одновременные операции DML.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab AUTO_INCREMENT=100; Query OK, 0 rows affected (0.002 sec)
Это относится к ALTER TABLE ... AUTO_INCREMENT=... для таблиц InnoDB.
ALTER TABLE ... ROW_FORMAT=...
InnoDB не поддерживает изменение формата строк таблицы с ALGORITHM, установленным в INSTANT.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ) ROW_FORMAT=DYNAMIC; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab ROW_FORMAT=COMPRESSED; ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Changing table options requires the table to be rebuilt. Try ALGORITHM=INPLACE
Это относится к ALTER TABLE ... ROW_FORMAT=... для таблиц InnoDB.
ALTER TABLE ... KEY_BLOCK_SIZE=...
InnoDB не поддерживает изменение размера блока ключа таблицы с ALGORITHM, установленным в INSTANT.
Например:
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='INSTANT'; ALTER TABLE tab KEY_BLOCK_SIZE=2; ERROR 1846 (0A000): ALGORITHM=INSTANT 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, установленным в INSTANT. InnoDB не поддерживает изменение значения PAGE_COMPRESSED таблицы с 1 на 0 с ALGORITHM, установленным в INSTANT.
В этих версиях InnoDB также поддерживает изменение значения PAGE_COMPRESSION_LEVEL таблицы с ALGORITHM, установленным в INSTANT.
Данная операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив в NONE пункт LOCK. При использовании этой стратегии разрешены все одновременные операции DML.
См. MDEV-16328 для получения дополнительной информации.
Например, это выполняется успешно:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab PAGE_COMPRESSED=1; Query OK, 0 rows affected (0.004 sec)
И это выполняется успешно:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ) PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=5; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab PAGE_COMPRESSION_LEVEL=4; Query OK, 0 rows affected (0.004 sec)
Но это приводит к ошибке:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ) PAGE_COMPRESSED=1; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab PAGE_COMPRESSED=0; ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Changing table options requires the table to be rebuilt. Try ALGORITHM=INPLACE
Это относится к ALTER TABLE ... PAGE_COMPRESSED=... и ALTER TABLE ... PAGE_COMPRESSION_LEVEL=... для таблиц InnoDB.
ALTER TABLE ... DROP SYSTEM VERSIONING
InnoDB не поддерживает удаление системной версиирования из таблицы с ALGORITHM, установленным на INSTANT.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ) WITH SYSTEM VERSIONING; SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab DROP SYSTEM VERSIONING; ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=INPLACE
Это относится к ALTER TABLE ... DROP SYSTEM VERSIONING для InnoDB таблиц.
ALTER TABLE ... DROP CONSTRAINT
В MariaDB 10.3.6 и более поздних версиях InnoDB поддерживает удаление CHECK ограничения из таблицы с ALGORITHM, установленным на INSTANT. См. MDEV-16331 для получения дополнительной информации.
Эта операция поддерживает стратегию без блокировок. Эту стратегию можно явно выбрать, установив в LOCK NONE. При использовании этой стратегии разрешены все одновременные DML операции.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50), CONSTRAINT b_not_empty CHECK (b != '') ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab DROP CONSTRAINT b_not_empty; Query OK, 0 rows affected (0.002 sec)
Это относится к ALTER TABLE ... DROP CONSTRAINT для InnoDB таблиц.
ALTER TABLE ... FORCE
InnoDB не поддерживает принудительную перестройку таблицы с ALGORITHM, установленным на INSTANT.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab FORCE; ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=INPLACE
Это относится к ALTER TABLE ... FORCE для InnoDB таблиц.
ALTER TABLE ... ENGINE=InnoDB
InnoDB не поддерживает принудительную перестройку таблицы с ALGORITHM, установленным на INSTANT.
Например:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab ENGINE=InnoDB; ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=INPLACE
Это относится к ALTER TABLE ... ENGINE=InnoDB для InnoDB таблиц.
OPTIMIZE TABLE ...
InnoDB не поддерживает оптимизацию таблицы с ALGORITHM, установленным на INSTANT.
Например:
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='INSTANT';
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=INSTANT is not supported for this operation. Try ALGORITHM=INPLACE |
| db1.tab | optimize | status | Operation failed |
+---------+----------+----------+------------------------------------------------------------------------------+
3 rows in set, 1 warning (0.002 sec)
Это относится к OPTIMIZE TABLE для InnoDB таблиц.
ALTER TABLE ... RENAME TO и RENAME TABLE ...
InnoDB поддерживает переименование таблицы с ALGORITHM, установленным на INSTANT.
Эта операция поддерживает стратегию эксклюзивной блокировки. Эту стратегию можно явно выбрать, установив в LOCK EXCLUSIVE. При использовании этой стратегии одновременные DML операции не допускаются.
Например, это успешно выполняется:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; ALTER TABLE tab RENAME TO old_tab; Query OK, 0 rows affected (0.008 sec)
И это успешно выполняется:
CREATE OR REPLACE TABLE tab ( a int PRIMARY KEY, b varchar(50), c varchar(50) ); SET SESSION alter_algorithm='INSTANT'; RENAME TABLE tab TO old_tab; Query OK, 0 rows affected (0.008 sec)
Это относится к ALTER TABLE ... RENAME TO и RENAME TABLE для InnoDB таблиц.
Ограничения
Ограничения, связанные с сгенерированными (виртуальными и постоянными/хранимыми) столбцами
Сгенерированные столбцы в настоящее время не поддерживают онлайн DDL для всех тех же операций, которые поддерживаются для «реальных» столбцов.
См. Сгенерированные (виртуальные и постоянные/хранимые) столбцы: Поддержка операторов для получения дополнительной информации об ограничениях.
Нестандартный формат хранения, вызванный некоторыми операциями
Некоторые операции приводят к тому, что файл табличного пространства таблицы использует нестандартный формат хранения, когда используется алгоритм INSTANT. К затронутым операциям относятся:
Эти операции требуют следующих нестандартных изменений в формате хранения:
- Используется скрытая запись метаданных в начале кластеризованного индекса для хранения значения DEFAULT каждого столбца. Это позволяет добавить новые столбцы с значениями по умолчанию без перестройки таблицы.
- Для хранения сопоставлений столбцов используется BLOB в скрытой записи метаданных. Это позволяет удалять или переупорядочивать столбцы без перестройки таблицы. Это также позволяет добавлять столбцы в любую позицию или удалять столбцы из любой позиции в таблице без перестройки таблицы.
- Если столбец удален, старые записи будут содержать мусор в бывшем положении этого столбца, а новые записи будут записываться со значениями NULL, пустыми строками или значениями-заглушками.
Этот нестандартный формат хранения может привести к некоторому снижению производительности или увеличению занимаемого места для всех последующих DML операций. Если вы заметите подобные проблемы и хотите нормализовать формат хранения таблицы, чтобы избежать этой проблемы, вы можете сделать это, принудительно перестроив таблицу, выполнив ALTER TABLE ... FORCE с ALGORITHM, установленным на INPLACE. Например:
SET SESSION alter_algorithm='INPLACE'; ALTER TABLE tab FORCE; Query OK, 0 rows affected (0.008 sec)
Однако помните, что в некоторых случаях перестройка таблицы с ALGORITHM, установленным на INPLACE, может быть невозможна. См. InnoDB Онлайн операции DDL с ALGORITHM=INPLACE: Ограничения для получения более подробной информации об этих случаях. Если вы столкнетесь с одной из этих ситуаций, но все равно хотите перестроить таблицу, вам придется сделать это с ALGORITHM, установленным на COPY.
Известные ошибки
Существуют некоторые известные ошибки, которые могут привести к проблемам при выполнении операции InnoDB DDL с использованием алгоритма INSTANT. Этот алгоритм обычно выбирается по умолчанию, если операция его поддерживает.
Многие из этих ошибок проявляются тем, что таблица как бы забывает, что ее файл табличного пространства находится в нестандартном формате хранения.
Если вы обеспокоены тем, что таблица может быть затронута одной из этих ошибок, лучшим вариантом будет нормализация структуры таблицы. Это можно сделать путем перестройки таблицы. Например:
SET SESSION alter_algorithm='INPLACE'; ALTER TABLE tab FORCE; Query OK, 0 rows affected (0.008 sec)
Если вы обеспокоены этими ошибками и хотите выполнить операцию, поддерживающую алгоритм INSTANT, но хотите избежать его использования, вы можете установить алгоритм на INPLACE и добавить ключевое слово FORCE к оператору ALTER TABLE:
SET SESSION alter_algorithm='INPLACE'; ALTER TABLE tab ADD COLUMN c varchar(50), FORCE;
Закрытые ошибки
- MDEV-20066: Эта ошибка могла привести к повреждению таблицы, если столбец был добавлен мгновенно. Она исправлена в MariaDB 10.3.18 и MariaDB 10.4.8.
- MDEV-20117: Эта ошибка могла привести к повреждению таблицы, если столбец был удален мгновенно. Она исправлена в MariaDB 10.4.9.
- MDEV-19743: Эта ошибка могла привести к повреждению таблицы во время реорганизации страниц, если столбец был добавлен мгновенно. Она исправлена в MariaDB 10.3.17 и MariaDB 10.4.7.
- MDEV-19783: Эта ошибка могла привести к повреждению таблицы, если столбец был добавлен мгновенно. Она исправлена в MariaDB 10.3.17 и MariaDB 10.4.7
- MDEV-20090: Эта ошибка могла привести к повреждению таблицы, если столбцы были добавлены, удалены или переупорядочены мгновенно. Она исправлена в MariaDB 10.4.9.
- MDEV-18519: Эта ошибка могла привести к повреждению таблицы, если столбец был добавлен мгновенно. Она исправлена в MariaDB 10.6.9, MariaDB 10.7.5, MariaDB 10.8.4 и MariaDB 10.9.2.
- MDEV-18519: Эта ошибка могла привести к повреждению таблицы, если столбец был добавлен мгновенно. Она не исправлена и не будет исправлена в версиях ниже MariaDB 10.6.
© 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-algorithminstant/