14.13.1 Операции DDL в режиме онлайн
Подробные сведения об онлайн-поддержке, примеры синтаксиса и заметки об использовании операций DDL представлены в следующих разделах данного раздела.
Операции с индексами
В следующей таблице представлен обзор онлайн-поддержки DDL для операций с индексами. Звездочка (*) указывает дополнительную информацию, исключение или зависимость. Подробности см. в Примечаниях к синтаксису и использованию.
Таблица 14.10 Поддержка онлайн-DDL для операций с индексами
| Операция | Выполнение на месте | Перестройка таблицы | Разрешает одновременную DML | Только изменяет метаданные |
|---|---|---|---|---|
| Создание или добавление вторичного индекса | Да | Нет | Да | Нет |
| Удаление индекса | Да | Нет | Да | Да |
| Переименование индекса | Да | Нет | Да | Да |
Добавление FULLTEXT индекса | Да* | Нет* | Нет | Нет |
Добавление SPATIAL индекса | Да | Нет | Нет | Нет |
| Изменение типа индекса | Да | Нет | Да | Да |
Примечания к синтаксису и использованию
-
Создание или добавление вторичного индекса
CREATE INDEX
nameONtable(col_list);ALTER TABLE
tbl_nameADD INDEXname(col_list);Таблица остается доступной для чтения и записи во время создания индекса. Выполнение оператора
CREATE INDEXзавершается только после завершения всех транзакций, обращающихся к таблице, чтобы начальное состояние индекса отражало последние данные таблицы.Поддержка онлайн-DDL для добавления вторичных индексов означает, что вы можете ускорить общий процесс создания и загрузки таблицы и связанных индексов, создав таблицу без вторичных индексов, а затем добавив вторичные индексы после загрузки данных.
Новый созданный вторичный индекс содержит только подтвержденные данные в таблице на момент завершения оператора
CREATE INDEXилиALTER TABLE. Он не содержит каких-либо неподтвержденных значений, старых версий значений или значений, помеченных для удаления, но еще не удаленных из старого индекса.Если сервер завершится во время создания вторичного индекса, при восстановлении MySQL удалит любые частично созданные индексы. Необходимо повторно выполнить оператор
ALTER TABLEилиCREATE INDEX.Некоторые факторы влияют на производительность, использование памяти и семантику этой операции. Подробности см. в Разделе 14.13.6, «Ограничения онлайн-DDL».
-
Удаление индекса
DROP INDEX
nameONtable;ALTER TABLE
tbl_nameDROP INDEXname;Таблица остается доступной для чтения и записи во время удаления индекса. Оператор
DROP INDEXзавершается только после завершения всех транзакций, обращающихся к таблице, чтобы начальное состояние индекса отражало последние данные таблицы. -
Переименование индекса
ALTER TABLE
tbl_nameRENAME INDEXold_index_nameTOnew_index_name, ALGORITHM=INPLACE, LOCK=NONE; -
Добавление
FULLTEXTиндексаCREATE FULLTEXT INDEX
nameON table(column);Добавление первого
FULLTEXTиндекса перестраивает таблицу, если нет столбца с пользовательским определениемFTS_DOC_ID. ДополнительныеFULLTEXTиндексы могут быть добавлены без перестройки таблицы. -
Добавление
SPATIALиндексаCREATE TABLE geom (g GEOMETRY NOT NULL); ALTER TABLE geom ADD SPATIAL INDEX(g), ALGORITHM=INPLACE, LOCK=SHARED;
-
Изменение типа индекса (
USING {BTREE | HASH})ALTER TABLE
tbl_nameDROP INDEX i1, ADD INDEX i1(key_part,...) USING BTREE, ALGORITHM=INPLACE;
Операции с первичными ключами
В следующей таблице представлен обзор поддержки онлайн DDL для операций с первичными ключами. Звездочка (*) указывает на дополнительную информацию, исключение или зависимость. См. Примечания к синтаксису и использованию.
Таблица 14.11 Поддержка онлайн DDL для операций с первичными ключами
| Операция | На месте | Перестраивает таблицу | Разрешает одновременные операции DML | Только изменяет метаданные |
|---|---|---|---|---|
| Добавление первичного ключа | Да* | Да* | Да | Нет |
| Удаление первичного ключа | Нет | Да | Нет | Нет |
| Удаление первичного ключа и добавление другого | Да | Да | Да | Нет |
Примечания к синтаксису и использованию
-
Добавление первичного ключа
ALTER TABLE
tbl_nameADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;Перестраивает таблицу на месте. Данные существенно реорганизуются, что делает эту операцию дорогостоящей.
ALGORITHM=INPLACEне допускается при определенных условиях, если столбцы необходимо преобразовать вNOT NULL.Перестройка всегда требует копирования данных таблицы. Поэтому лучше всего определить первичный ключ при создании таблицы, а не выполнять
ALTER TABLE ... ADD PRIMARY KEYпозже.При создании
UNIQUEилиPRIMARY KEYиндекса MySQL необходимо выполнить дополнительные действия. ДляUNIQUEиндексов MySQL проверяет, что таблица не содержит дублирующих значений для ключа. ДляPRIMARY KEYиндекса MySQL также проверяет, что ни один из столбцовPRIMARY KEYне содержитNULL.При добавлении первичного ключа с помощью предложения
ALGORITHM=COPYMySQL преобразует значенияNULLв связанных столбцах в значения по умолчанию: 0 для чисел, пустую строку для символьных столбцов и BLOB, и 0000-00-00 00:00:00 дляDATETIME. Это поведение нестандартно, и Oracle рекомендует не полагаться на него. Добавление первичного ключа с помощьюALGORITHM=INPLACEразрешено только в том случае, если значение параметраSQL_MODEвключает флагиstrict_trans_tablesилиstrict_all_tables; когда значениеSQL_MODEстрогое,ALGORITHM=INPLACEразрешено, но оператор все равно может завершиться неудачей, если запрошенные столбцы первичного ключа содержатNULLзначения. ПоведениеALGORITHM=INPLACEболее соответствует стандартам.Если вы создаете таблицу без первичного ключа, MySQL выбирает его для вас, что может быть первым
UNIQUEключом, определенным дляNOT NULLстолбцов, или сгенерированным системой ключом. Чтобы избежать неопределенности и потенциальной потребности в дополнительном скрытом столбце, укажите предложениеPRIMARY KEYв качестве части оператораCREATE TABLE.MySQL создает новый кластеризованный индекс, копируя существующие данные из исходной таблицы в временную таблицу с требуемой структурой индекса. После полного копирования данных во временную таблицу исходная таблица переименовывается с другим временным именем таблицы. Временная таблица, содержащая новый кластеризованный индекс, переименовывается в имя исходной таблицы, а исходная таблица удаляется из базы данных.
Улучшения производительности онлайн-операций, применяемые к операциям со вторичными индексами, не применяются к индексу первичного ключа. Строки таблицы InnoDB хранятся в структуре, организованной на основе первичного ключа, образуя то, что некоторые системы баз данных называют “таблицей с индексной структурой”. Поскольку структура таблицы тесно связана с первичным ключом, переопределение первичного ключа все равно требует копирования данных.
Когда операция с первичным ключом использует
ALGORITHM=INPLACE, даже если данные все еще копируются, она более эффективна, чем использованиеALGORITHM=COPY, потому что:Для
ALGORITHM=INPLACEне требуется регистрация отмены или связанная регистрация повторного применения. Эти операции добавляют нагрузку к операторам DDL, использующимALGORITHM=COPY.Записи вторичного индекса предварительно отсортированы и могут загружаться в порядке.
Кэширование изменений не используется, так как случайных вставок в вторичные индексы нет.
Если сервер завершается при создании нового кластеризованного индекса, данные не теряются, но вам необходимо завершить процесс восстановления, используя временные таблицы, которые существуют во время процесса. Поскольку редко требуется пересоздавать кластеризованный индекс или переопределять первичные ключи в больших таблицах, или столкнуться с системным сбоем во время этой операции, в данном руководстве нет информации о восстановлении из этой ситуации.
-
Удаление первичного ключа
ALTER TABLE
tbl_nameDROP PRIMARY KEY, ALGORITHM=COPY;Только
ALGORITHM=COPYподдерживает удаление первичного ключа без добавления нового в том же оператореALTER TABLE. -
Удаление первичного ключа и добавление другого
ALTER TABLE
tbl_nameDROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;Данные существенно реорганизуются, что делает эту операцию дорогостоящей.
Операции с колонками
В следующей таблице представлен обзор поддержки онлайн DDL для операций с колонками. Звездочка (*) указывает дополнительную информацию, исключение или зависимость. Для подробностей см. Примечания к синтаксису и использованию.
Таблица 14.12 Поддержка онлайн DDL для операций с колонками
| Операция | На месте | Перестраивает таблицу | Допускает одновременную DML | Только изменяет метаданные |
|---|---|---|---|---|
| Добавление колонки | Да | Да | Да* | Нет |
| Удаление колонки | Да | Да | Да | Нет |
| Переименование колонки | Да | Нет | Да* | Да |
| Перестановка колонок | Да | Да | Да | Нет |
| Установка значения по умолчанию для колонки | Да | Нет | Да | Да |
| Изменение типа данных колонки | Нет | Да | Нет | Нет |
Расширение размера колонки VARCHAR | Да | Нет | Да | Да |
| Удаление значения по умолчанию для колонки | Да | Нет | Да | Да |
| Изменение значения автоинкремента | Да | Нет | Да | Нет* |
Определение колонки как NULL
| Да | Да* | Да | Нет |
Определение колонки как NOT NULL
| Да* | Да* | Да | Нет |
Изменение определения колонки ENUM или SET | Да | Нет | Да | Да |
Примечания к синтаксису и использованию
-
Добавление колонки
ALTER TABLE
tbl_nameADD COLUMNcolumn_namecolumn_definition, ALGORITHM=INPLACE, LOCK=NONE;Одновременная DML не разрешена при добавлении колонки. Данные существенно реорганизуются, что делает эту операцию дорогостоящей. Как минимум, необходимо
ALGORITHM=INPLACE, LOCK=SHARED. -
Удаление колонки
ALTER TABLE
tbl_nameDROP COLUMNcolumn_name, ALGORITHM=INPLACE, LOCK=NONE;Данные существенно реорганизуются, что делает эту операцию дорогостоящей.
-
Переименование колонки
ALTER TABLE
tblCHANGEold_col_namenew_col_namedata_type, ALGORITHM=INPLACE, LOCK=NONE;Для разрешения одновременной DML сохраните тот же тип данных и измените только имя колонки.
Если вы сохраняете тот же тип данных и
[NOT] NULLатрибут, изменяя только имя колонки, операция всегда может выполняться онлайн.Вы также можете переименовать колонку, входящую в ограничение внешнего ключа. Определение внешнего ключа автоматически обновляется для использования нового имени колонки. Переименование колонки, участвующей во внешнем ключе, работает только с
ALGORITHM=INPLACE. Если вы используетеALGORITHM=COPYклаузу или какое-то другое условие приводит к тому, что операция используетALGORITHM=COPY, операцияALTER TABLEтерпит неудачу.ALGORITHM=INPLACEне поддерживается для переименования колонки. -
Перестановка колонок
Для перестановки колонок используйте
FIRSTилиAFTERв операцияхCHANGEилиMODIFY.ALTER TABLE
tbl_nameMODIFY COLUMNcol_namecolumn_definitionFIRST, ALGORITHM=INPLACE, LOCK=NONE;Данные существенно реорганизуются, что делает эту операцию дорогостоящей.
-
Изменение типа данных колонки
ALTER TABLE
tbl_nameCHANGE c1 c1 BIGINT, ALGORITHM=COPY;Изменение типа данных колонки поддерживается только с
ALGORITHM=COPY. -
Расширение размера колонки
VARCHARALTER TABLE
tbl_nameCHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;Количество байтов длины, необходимых для колонки
VARCHAR, должно оставаться неизменным. Для колонокVARCHARразмером от 0 до 255 байт требуется один байт длины для кодирования значения. Для колонокVARCHARразмером 256 байт или более требуется два байта длины. В результате, локальная операцияALTER TABLEподдерживает только увеличение размера колонкиVARCHARс 0 до 255 байт или с 256 байт до большего размера. Локальная операцияALTER TABLEне поддерживает увеличение размера колонкиVARCHARс менее чем 256 байт до размера, равного или большего 256 байт. В этом случае меняется количество необходимых байтов длины с 1 на 2, что поддерживается только копией таблицы (ALGORITHM=COPY). Например, попытка изменить размер колонкиVARCHARс использованием локальной операцииALTER TABLEвозвращает следующую ошибку:ALTER TABLE
tbl_nameALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.ПримечаниеДлина байт колонки
VARCHARзависит от длины байт набора символов.Уменьшение размера колонки
VARCHARс помощью локальной операцииALTER TABLEне поддерживается. Для уменьшения размера колонкиVARCHARтребуется копия таблицы (ALGORITHM=COPY). -
Установка значения по умолчанию для колонки
ALTER TABLE
tbl_nameALTER COLUMNcolSET DEFAULTliteral, ALGORITHM=INPLACE, LOCK=NONE;Изменяет только метаданные таблицы. Значения по умолчанию колонок хранятся в для таблицы, а не в
InnoDB. -
Удаление значения по умолчанию для колонки
ALTER TABLE
tblALTER COLUMNcolDROP DEFAULT, ALGORITHM=INPLACE, LOCK=NONE; -
Изменение значения автоинкремента
ALTER TABLE
tableAUTO_INCREMENT=next_value, ALGORITHM=INPLACE, LOCK=NONE;Изменяет значение, хранящееся в памяти, а не в файле данных.
В распределенной системе с репликацией или фрагментацией иногда требуется сбросить счетчик автоинкремента таблицы до определенного значения. Следующая строка, вставленная в таблицу, использует указанное значение для колонки автоинкремента. Такая техника также может применяться в среде хранилища данных, где периодически очищаются все таблицы и загружаются заново, а последовательность автоинкремента сбрасывается до 1.
-
Определение колонки как
NULLALTER TABLE tbl_name MODIFY COLUMN
column_namedata_typeNULL, ALGORITHM=INPLACE, LOCK=NONE;Перестраивает таблицу на месте. Данные существенно реорганизуются, что делает эту операцию дорогостоящей.
-
Определение колонки как
NOT NULLALTER TABLE
tbl_nameMODIFY COLUMNcolumn_namedata_typeNOT NULL, ALGORITHM=INPLACE, LOCK=NONE;Перестраивает таблицу на месте.
STRICT_ALL_TABLESилиSTRICT_TRANS_TABLESSQL_MODEнеобходимы для успешного выполнения операции. Операция завершается неудачей, если колонка содержит значения NULL. Сервер запрещает изменения колонок внешнего ключа, которые могут привести к потере целостности ссылок. См. Раздел 13.1.8, «Операция ALTER TABLE». Данные существенно реорганизуются, что делает эту операцию дорогостоящей. -
Изменение определения колонки
ENUMилиSETCREATE TABLE t1 (c1 ENUM('a', 'b', 'c')); ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INPLACE, LOCK=NONE;Изменение определения колонки
ENUMилиSETпутем добавления новых элементов перечисления или множества в конец списка допустимых значений может выполняться на месте, если размер хранилища типа данных не меняется. Например, добавление элемента в колонкуSETс 8 элементами меняет требуемый размер хранилища на значение с 1 байта на 2 байта; это требует копирования таблицы. Добавление элементов в середине списка приводит к переиндексации существующих элементов, что требует копирования таблицы.
Операции с вычисляемыми столбцами
В следующей таблице представлен обзор поддержки онлайн DDL для операций с вычисляемыми столбцами. Подробную информацию см. в разделе Примечания к синтаксису и использованию.
Таблица 14.13 Поддержка онлайн DDL для операций с вычисляемыми столбцами
| Операция | На месте | Перестройка таблицы | Допускаются одновременные операции DML | Изменяются только метаданные |
|---|---|---|---|---|
Добавление STORED столбца | Нет | Да | Нет | Нет |
Изменение порядка STORED столбцов | Нет | Да | Нет | Нет |
Удаление STORED столбца | Да | Да | Да | Нет |
Добавление VIRTUAL столбца | Да | Нет | Да | Да |
Изменение порядка VIRTUAL столбцов | Нет | Да | Нет | Нет |
Удаление VIRTUAL столбца | Да | Нет | Да | Да |
Примечания к синтаксису и использованию
-
Добавление
STOREDстолбцаALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY;
ADD COLUMNне является операцией на месте для хранимых столбцов (выполняется без использования временной таблицы), так как выражение должно быть вычислено сервером. -
Изменение порядка
STOREDстолбцовALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST, ALGORITHM=COPY;
Перестраивает таблицу на месте.
-
Удаление
STOREDстолбцаALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE;
Перестраивает таблицу на месте.
-
Добавление
VIRTUALстолбцаALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL), ALGORITHM=INPLACE, LOCK=NONE;
Добавление виртуального столбца — это операция на месте для таблиц без разбиения. Однако добавление виртуального столбца не может быть объединено с другими действиями
ALTER TABLE.Добавление
VIRTUALстолбца не является операцией на месте для таблиц с разбиением. -
Изменение порядка
VIRTUALстолбцовALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL FIRST, ALGORITHM=COPY;
-
Удаление
VIRTUALстолбцаALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE;
Удаление
VIRTUALстолбца — это операция на месте для таблиц без разбиения. Однако удаление виртуального столбца не может быть объединено с другими действиямиALTER TABLE.Удаление
VIRTUALстолбца не является операцией на месте для таблиц с разбиением.
Операции с внешними ключами
В следующей таблице представлен обзор поддержки онлайн DDL для операций с внешними ключами. Звездочка указывает на дополнительную информацию, исключение или зависимость. Подробную информацию см. в разделе Примечания к синтаксису и использованию.
Таблица 14.14 Поддержка онлайн DDL для операций с внешними ключами
| Операция | На месте | Перестройка таблицы | Допускаются одновременные операции DML | Изменяются только метаданные |
|---|---|---|---|---|
| Добавление ограничения внешнего ключа | Да* | Нет | Да | Да |
| Удаление ограничения внешнего ключа | Да | Нет | Да | Да |
Примечания к синтаксису и использованию
-
Добавление ограничения внешнего ключа
Алгоритм
INPLACEподдерживается, когдаforeign_key_checksотключен. В противном случае поддерживается только алгоритмCOPY.ALTER TABLE
tbl1ADD CONSTRAINTfk_nameFOREIGN KEYindex(col1) REFERENCEStbl2(col2)referential_actions; -
Удаление ограничения внешнего ключа
ALTER TABLE
tblDROP FOREIGN KEYfk_name;Удаление внешнего ключа можно выполнить онлайн с опцией
foreign_key_checksвключенной или выключенной.Если вам неизвестны имена ограничений внешнего ключа в конкретной таблице, выполните следующую команду и найдите имя ограничения в части
CONSTRAINTдля каждого внешнего ключа:SHOW CREATE TABLE
table\GЛибо запросите таблицу Information Schema
TABLE_CONSTRAINTSи используйте столбцыCONSTRAINT_NAMEиCONSTRAINT_TYPEдля определения имен внешних ключей.Вы также можете удалить внешний ключ и связанный с ним индекс в одной команде:
ALTER TABLE
tableDROP FOREIGN KEYconstraint, DROP INDEXindex;
Если уже присутствуют в таблице, которая изменяется (то есть это таблица содержащая FOREIGN KEY ... REFERENCE clause), к операциям онлайн DDL, даже тем, которые не прямо связаны со столбцами внешнего ключа, применяются дополнительные ограничения:
ALTER TABLEна дочерней таблице может ожидать завершения другой транзакции, если изменение родительской таблицы приводит к соответствующим изменениям в дочерней таблице черезON UPDATEилиON DELETEclause с использованием параметровCASCADEилиSET NULL.Аналогично, если таблица является в связи с внешним ключом, даже если она не содержит никаких
FOREIGN KEYclauses, она может ожидать завершенияALTER TABLE, если командаINSERT,UPDATEилиDELETEвызывает действиеON UPDATEилиON DELETEв дочерней таблице.
Операции с таблицами
В следующей таблице представлен обзор поддержки онлайн DDL для операций с таблицами. Звездочка (*) указывает на дополнительную информацию, исключение или зависимость. Подробную информацию см. в Примечания по синтаксису и использованию.
Таблица 14.15 Поддержка онлайн DDL для операций с таблицами
| Операция | На месте | Перестраивает таблицу | Допускает одновременную DML | Только изменяет метаданные |
|---|---|---|---|---|
Изменение ROW_FORMAT
| Да | Да | Да | Нет |
Изменение KEY_BLOCK_SIZE
| Да | Да | Да | Нет |
| Установка постоянных статистических данных таблицы | Да | Нет | Да | Да |
| Указание набора символов | Да | Да* | Да | Нет |
| Преобразование набора символов | Нет | Да* | Нет | Нет |
| Оптимизация таблицы | Да* | Да | Да | Нет |
Перестройка с опцией FORCE | Да* | Да | Да | Нет |
| Выполнение нулевой перестройки | Да* | Да | Да | Нет |
| Переименование таблицы | Да | Нет | Да | Да |
Примечания по синтаксису и использованию
-
Изменение
ROW_FORMATALTER TABLE
tbl_nameROW_FORMAT =row_format, ALGORITHM=INPLACE, LOCK=NONE;Данные существенно перестраиваются, что делает эту операцию дорогостоящей.
Дополнительную информацию об опции
ROW_FORMATсм. в Параметрах таблицы. -
Изменение
KEY_BLOCK_SIZEALTER TABLE
tbl_nameKEY_BLOCK_SIZE =value, ALGORITHM=INPLACE, LOCK=NONE;Данные существенно перестраиваются, что делает эту операцию дорогостоящей.
Дополнительную информацию об опции
KEY_BLOCK_SIZEсм. в Параметрах таблицы. -
Установка параметров постоянных статистических данных таблицы
ALTER TABLE
tbl_nameSTATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;Изменяет только метаданные таблицы.
Постоянные статистические данные включают
STATS_PERSISTENT,STATS_AUTO_RECALCиSTATS_SAMPLE_PAGES. Дополнительную информацию см. в Разделе 14.8.11.1, «Настройка параметров постоянных статистических данных оптимизатора». -
Указание набора символов
ALTER TABLE
tbl_nameCHARACTER SET =charset_name, ALGORITHM=INPLACE, LOCK=NONE;Перестраивает таблицу, если новый кодировочный набор символов отличается.
-
Преобразование набора символов
ALTER TABLE
tbl_nameCONVERT TO CHARACTER SETcharset_name, ALGORITHM=COPY;Перестраивает таблицу, если новый кодировочный набор символов отличается.
-
Оптимизация таблицы
OPTIMIZE TABLE
tbl_name;Операция на месте не поддерживается для таблиц с индексами
FULLTEXT. Операция использует алгоритмINPLACE, но синтаксисALGORITHMиLOCKне допускается. -
Перестройка таблицы с опцией
FORCEALTER TABLE
tbl_nameFORCE, ALGORITHM=INPLACE, LOCK=NONE;Использует
ALGORITHM=INPLACEначиная с MySQL 5.6.17.ALGORITHM=INPLACEне поддерживается для таблиц с индексамиFULLTEXT. -
Выполнение "нулевой" перестройки
ALTER TABLE
tbl_nameENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;Использует
ALGORITHM=INPLACEначиная с MySQL 5.6.17.ALGORITHM=INPLACEне поддерживается для таблиц с индексамиFULLTEXT. -
Переименование таблицы
ALTER TABLE
old_tbl_nameRENAME TOnew_tbl_name, ALGORITHM=INPLACE, LOCK=NONE;MySQL переименовывает файлы, соответствующие таблице
tbl_name, без создания копии. (Вы также можете использовать инструкциюRENAME TABLEдля переименования таблиц. См. Раздел 13.1.33, «Инструкция RENAME TABLE».) Предоставленные разрешения для переименованной таблицы не переносятся на новое имя. Их необходимо изменить вручную.
Операции с табличными пространствами
В следующей таблице представлен обзор поддержки онлайн DDL для операций с табличными пространствами. Подробную информацию см. в Примечания по синтаксису и использованию.
Таблица 14.16 Поддержка онлайн DDL для операций с табличными пространствами
| Операция | На месте | Перестраивает таблицу | Допускает одновременную DML | Только изменяет метаданные |
|---|---|---|---|---|
| Включение или выключение шифрования табличного пространства на основе файлов таблицы | Нет | Да | Нет | Нет |
Примечания по синтаксису и использованию
Включение или выключение шифрования табличного пространства на основе файлов таблицы
ALTER TABLE tbl_name ENCRYPTION='Y', ALGORITHM=COPY;
Шифрование поддерживается только для табличных пространств на основе файлов таблицы. Дополнительную информацию см. в Разделе 14.14, «Шифрование данных InnoDB на диске».
Операции разбиения
За исключением большинства положений разбиения ALTER
TABLE, онлайн-операции DDL для разнесённых по InnoDB таблицах следуют тем же правилам, что и для обычных InnoDB таблиц.
Большинство положений разбиения ALTER TABLE не проходят через тот же внутренний API онлайн-DDL, что и обычные неразнесённые InnoDB таблицы. В результате, онлайн-поддержка ALTER
TABLE положений разбиения различается.
В следующей таблице показан онлайн-статус каждого ALTER TABLE предложения разбиения. Независимо от API онлайн-DDL, MySQL пытается минимизировать копирование данных и блокировки там, где это возможно.
Варианты разбиения ALTER TABLE, использующие ALGORITHM=COPY или допускающие только “ALGORITHM=DEFAULT,
LOCK=DEFAULT”, выполняют переразбиение таблицы с помощью алгоритма COPY. Другими словами, создаётся новая разнесённая таблица с новой схемой разбиения. Новая созданная таблица включает любые изменения, внесённые операцией ALTER TABLE, и данные таблицы копируются в новую структуру таблицы.
Таблица 14.17 Поддержка онлайн-DDL для операций разбиения
| Предложение разбиения | На месте | Разрешает DML | Примечания |
|---|---|---|---|
PARTITION BY | Нет | Нет | Разрешает ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE}
|
ADD PARTITION | Нет | Нет | Разрешает только ALGORITHM=DEFAULT, LOCK=DEFAULT. Не копирует существующие данные для таблиц, разнесённых по RANGE или LIST. Одновременные запросы разрешены для таблиц, разнесённых по HASH или LIST. MySQL копирует данные, удерживая общий замок. |
DROP PARTITION | Нет | Нет | Разрешает только ALGORITHM=DEFAULT, LOCK=DEFAULT. Не копирует существующие данные для таблиц, разнесённых по RANGE или LIST. |
DISCARD PARTITION | Нет | Нет | Разрешает только ALGORITHM=DEFAULT, LOCK=DEFAULT
|
IMPORT PARTITION | Нет | Нет | Разрешает только ALGORITHM=DEFAULT, LOCK=DEFAULT
|
TRUNCATE
PARTITION | Да | Да | Не копирует существующие данные. Просто удаляет строки; не изменяет определение таблицы или её разделов. |
COALESCE
PARTITION | Нет | Нет | Разрешает только ALGORITHM=DEFAULT, LOCK=DEFAULT. Одновременные запросы разрешены для таблиц, разнесённых по HASH или LIST, так как MySQL копирует данные, удерживая общий замок. |
REORGANIZE
PARTITION | Нет | Нет | Разрешает только ALGORITHM=DEFAULT, LOCK=DEFAULT. Одновременные запросы разрешены для таблиц, разнесённых по LINEAR
HASH или LIST. MySQL копирует данные из затронутых разделов, удерживая общий метаданных замок. |
EXCHANGE
PARTITION | Да | Да | |
ANALYZE PARTITION | Да | Да | |
CHECK PARTITION | Да | Да | |
OPTIMIZE
PARTITION | Нет | Нет | Предложения ALGORITHM и LOCK игнорируются. Перестраивает всю таблицу. См. Раздел 22.3.4, «Техническое обслуживание разделов». |
REBUILD PARTITION | Нет | Нет | Разрешает только ALGORITHM=DEFAULT, LOCK=DEFAULT. Одновременные запросы разрешены для таблиц, разнесённых по LINEAR
HASH или LIST. MySQL копирует данные из затронутых разделов, удерживая общий метаданных замок. |
REPAIR PARTITION | Да | Да | |
REMOVE
PARTITIONING | Нет | Нет | Разрешает ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE}
|
Не относящиеся к разбиению онлайн-операции ALTER
TABLE над разнесёнными таблицами следуют тем же правилам, что и обычные таблицы. Однако, ALTER TABLE выполняет онлайн-операции над каждым разделом таблицы, что приводит к увеличению спроса на системные ресурсы из-за выполнения операций над несколькими разделами.
Дополнительную информацию о предложениях разбиения ALTER
TABLE см. в разделах Параметры разбиения и Раздел 13.1.8.1, «ALTER TABLE Partition Operations». Сведения о разбиении в целом см. в Главе 22, Разбиение.
© 2025 Oracle
Licensed under the GPLv2 License.