Spec-Zone.ru › MySQL 8.4

17.12.1 Операции DDL в режиме онлайн

Подробная информация о поддержке операций DDL в режиме онлайн, примеры синтаксиса и заметки по использованию приведены в следующих разделах этого раздела.

  • Операции с индексами

  • Операции с первичными ключами

  • Операции со столбцами

  • Операции с генерируемыми столбцами

  • Операции с внешними ключами

  • Операции с таблицами

  • Операции с табличными пространствами

  • Операции с разбиением

Операции с индексами

В следующей таблице представлен обзор поддержки операций DDL в режиме онлайн для операций с индексами. Звездочка (*) указывает дополнительную информацию, исключение или зависимость. Подробности см. в разделе Примечания к синтаксису и использованию.

Таблица 17.15 Поддержка DDL в режиме онлайн для операций с индексами

Таблица 17.15 Поддержка DDL в режиме онлайн для операций с индексами
Операция Мгновенно На месте Перестраивает таблицу Разрешает одновременную DML Только изменяет метаданные
Создание или добавление вторичного индекса Нет Да Нет Да Нет
Удаление индекса Нет Да Нет Да Да
Переименование индекса Нет Да Нет Да Да
Добавление FULLTEXT индекса Нет Да* Нет* Нет Нет
Добавление SPATIAL индекса Нет Да Нет Нет Нет
Изменение типа индекса Да Да Нет Да Да

Примечания к синтаксису и использованию
  • Создание или добавление вторичного индекса

    CREATE INDEX name ON table (col_list);
    
    ALTER TABLE tbl_name ADD INDEX name (col_list);
    

    Таблица остается доступной для операций чтения и записи во время создания индекса. Выполнение оператора CREATE INDEX завершается только после завершения всех транзакций, которые обращаются к таблице, чтобы начальное состояние индекса отражало наиболее последние данные таблицы.

    Поддержка операций DDL в режиме онлайн для добавления вторичных индексов означает, что вы, как правило, можете ускорить весь процесс создания и загрузки таблицы и связанных индексов, создав таблицу без вторичных индексов, а затем добавив вторичные индексы после загрузки данных.

    Новый вторичный индекс содержит только данные, подтвержденные в таблице на момент завершения выполнения оператора CREATE INDEX или ALTER TABLE. Он не содержит не подтвержденных значений, старых версий значений или значений, помеченных на удаление, но еще не удаленных из старого индекса.

    Некоторые факторы влияют на производительность, использование памяти и семантику этой операции. Подробности см. в разделе Раздел 17.12.8, «Ограничения DDL в режиме онлайн».

  • Удаление индекса

    DROP INDEX name ON table;
    
    ALTER TABLE tbl_name DROP INDEX name;
    

    Таблица остается доступной для операций чтения и записи во время удаления индекса. Оператор DROP INDEX завершается только после того, как будут завершены все транзакции, обращающиеся к таблице, чтобы начальное состояние индекса отражало самые последние данные таблицы.

  • Переименование индекса

    ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name, ALGORITHM=INPLACE, LOCK=NONE;
    
  • Добавление FULLTEXT индекса

    CREATE FULLTEXT INDEX name ON 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_name DROP INDEX i1, ADD INDEX i1(key_part,...) USING BTREE, ALGORITHM=INSTANT;
    

Операции с первичными ключами

В следующей таблице представлен обзор поддержки онлайн DDL для операций с первичными ключами. Звездочка указывает на дополнительную информацию, исключение или зависимость. См. Примечания по синтаксису и использованию.

Таблица 17.16 Поддержка онлайн DDL для операций с первичными ключами

Таблица 17.16 Поддержка онлайн DDL для операций с первичными ключами
Операция Мгновенно На месте Перестраивает таблицу Допускает одновременную DML Изменяет только метаданные
Добавление первичного ключа Нет Да* Да* Да Нет
Удаление первичного ключа Нет Нет Да Нет Нет
Удаление первичного ключа и добавление другого Нет Да Да Да Нет

Примечания по синтаксису и использованию
  • Добавление первичного ключа

    ALTER TABLE tbl_name ADD 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=COPY, MySQL преобразует 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_name DROP PRIMARY KEY, ALGORITHM=COPY;
    

    Только ALGORITHM=COPY поддерживает удаление первичного ключа без добавления нового в том же ALTER TABLE операторе.

  • Удаление первичного ключа и добавление другого

    ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
    

    Данные существенно переупорядочиваются, что делает эту операцию дорогостоящей.

Операции со столбцами

В следующей таблице представлен обзор поддержки онлайн DDL для операций со столбцами. Звездочка указывает на дополнительную информацию, исключение или зависимость. Для получения подробностей см. Примечания по синтаксису и использованию.

Таблица 17.17 Поддержка онлайн DDL для операций со столбцами

Таблица 17.17 Поддержка онлайн DDL для операций со столбцами
Операция Мгновенно На месте Перестраивает таблицу Допускает одновременную DML Изменяет только метаданные
Добавление столбца Да* Да Нет* Да* Да
Удаление столбца Да* Да Да Да Да
Переименование столбца Да* Да Нет Да* Да
Переупорядочивание столбцов Нет Да Да Да Нет
Установка значения по умолчанию столбца Да Да Нет Да Да
Изменение типа данных столбца Нет Нет Да Нет Нет
Расширение размера столбца VARCHAR Нет Да Нет Да Да
Удаление значения по умолчанию столбца Да Да Нет Да Да
Изменение значения автоинкремента Нет Да Нет Да Нет*
Сделать столбец NULL Нет Да Да* Да Нет
Сделать столбец NOT NULL Нет Да* Да* Да Нет
Изменение определения столбца ENUM или SET Да Да Нет Да Да

Примечания по синтаксису и использованию
  • Добавление столбца

    ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INSTANT;
    

    INSTANT — это алгоритм по умолчанию в MySQL 8.4.

    При добавлении столбца с помощью алгоритма INSTANT применяются следующие ограничения:

    • Операция добавления столбца не может быть объединена в одном операторе с другими операциями, которые не поддерживают алгоритм INSTANT.

    • Алгоритм INSTANT может добавлять столбец в любое положение таблицы.

    • Столбцы нельзя добавлять в таблицы, использующие ROW_FORMAT=COMPRESSED, таблицы с индексом FULLTEXT, таблицы, находящиеся в табличном пространстве словаря данных, или временные таблицы. Временные таблицы поддерживают только ALGORITHM=COPY.

    • При добавлении столбца с помощью алгоритма INSTANT MySQL проверяет размер строки и выдает следующую ошибку, если добавление превышает предел.

      Ошибка 4092 (HY000): Столбец не может быть добавлен с ALGORITHM=INSTANT, так как после этого максимальный возможный размер строки превысит максимально допустимый размер строки. Попробуйте ALGORITHM=INPLACE/COPY.

    • Максимальное количество столбцов во внутренней представлении таблицы не может превышать 1022 после добавления столбца с помощью алгоритма INSTANT. Сообщение об ошибке:

      Ошибка 4158 (HY000): Столбец не может быть добавлен к tbl_name с ALGORITHM=INSTANT. Пожалуйста, попробуйте ALGORITHM=INPLACE/COPY

    • Алгоритм INSTANT не может добавлять или удалять столбцы в системные таблицы схемы, такие как внутренняя таблица mysql.

    • Столбец с функциональным индексом не может быть удален с использованием алгоритма INSTANT.

    В одном операторе ALTER TABLE можно добавить несколько столбцов. Например:

    ALTER TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT, ALGORITHM=INSTANT;
    

    После каждой операции ALTER TABLE ... ALGORITHM=INSTANT, добавляющей один или несколько столбцов, удаляющей один или несколько столбцов, или добавляющей и удаляющей один или несколько столбцов в одной операции, создается новая версия строки. Столбец INFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONS отслеживает количество версий строк для таблицы. Значение увеличивается каждый раз, когда столбец добавляется или удаляется мгновенно. Начальное значение равно 0.

    mysql>  SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES
            WHERE NAME LIKE 'test/t1';
    +---------+--------------------+
    | NAME    | TOTAL_ROW_VERSIONS |
    +---------+--------------------+
    | test/t1 |                  0 |
    +---------+--------------------+
    

    При перестроении таблицы с мгновенно добавленными или удаленными столбцами операцией перестроения таблицы ALTER TABLE или OPTIMIZE TABLE значение TOTAL_ROW_VERSIONS сбрасывается до 0. Максимальное количество разрешенных версий строк равно 64 (255 с MySQL 9.1.0), так как каждая версия строки требует дополнительного места для метаданных таблицы. При достижении предела версий строк операции ADD COLUMN и DROP COLUMN с использованием ALGORITHM=INSTANT отклоняются с сообщением об ошибке, рекомендующим перестроить таблицу с использованием алгоритма COPY или INPLACE.

    Ошибка 4080 (HY000): Достигнуто максимальное количество версий строк для таблицы test/t1. Больше столбцов нельзя добавлять или удалять мгновенно. Используйте COPY/INPLACE.

    Следующие столбцы INFORMATION_SCHEMA предоставляют дополнительные метаданные для мгновенно добавленных столбцов. Дополнительную информацию см. в описаниях этих столбцов. См. Раздел 28.4.9, «Таблица INFORMATION_SCHEMA INNODB_COLUMNS» и Раздел 28.4.23, «Таблица INFORMATION_SCHEMA INNODB_TABLES».

    • INNODB_COLUMNS.DEFAULT_VALUE

    • INNODB_COLUMNS.HAS_DEFAULT

    • INNODB_TABLES.INSTANT_COLS

    Одновременные DML-операции запрещены при добавлении столбца. Данные существенно переупорядочиваются, что делает операцию дорогостоящей. Минимально требуется ALGORITHM=INPLACE, LOCK=SHARED.

    Таблица перестраивается, если используется ALGORITHM=INPLACE для добавления столбца.

  • Удаление столбца

    ALTER TABLE tbl_name DROP COLUMN column_name, ALGORITHM=INSTANT;
    

    INSTANT — это алгоритм по умолчанию в MySQL 8.4.

    При использовании алгоритма INSTANT для удаления столбца применяются следующие ограничения:

    • Удаление столбца не может быть объединено в одном операторе с другими операциями ALTER TABLE, которые не поддерживают ALGORITHM=INSTANT.

    • Столбцы нельзя удалять из таблиц, использующих ROW_FORMAT=COMPRESSED, таблиц с индексом FULLTEXT, таблиц, находящихся в табличном пространстве словаря данных, или временных таблиц. Временные таблицы поддерживают только ALGORITHM=COPY.

    В одном операторе ALTER TABLE можно удалить несколько столбцов, например:

    ALTER TABLE t1 DROP COLUMN c4, DROP COLUMN c5, ALGORITHM=INSTANT;
    

    При каждом добавлении или удалении столбца с помощью ALGORITHM=INSTANT создается новая версия строки. Столбец INFORMATION_SCHEMA.INNODB_TABLES.TOTAL_ROW_VERSIONS отслеживает количество версий строк для таблицы. Значение увеличивается каждый раз, когда столбец добавляется или удаляется мгновенно. Начальное значение равно 0.

    mysql>  SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES
            WHERE NAME LIKE 'test/t1';
    +---------+--------------------+
    | NAME    | TOTAL_ROW_VERSIONS |
    +---------+--------------------+
    | test/t1 |                  0 |
    +---------+--------------------+
    

    При перестроении таблицы с мгновенно добавленными или удаленными столбцами операцией перестроения таблицы ALTER TABLE или OPTIMIZE TABLE значение TOTAL_ROW_VERSIONS сбрасывается до 0. Максимальное количество разрешенных версий строк равно 64 (255 с MySQL 9.1.0), так как каждая версия строки требует дополнительного места для метаданных таблицы. При достижении предела версий строк операции ADD COLUMN и DROP COLUMN с использованием ALGORITHM=INSTANT отклоняются с сообщением об ошибке, рекомендующим перестроить таблицу с использованием алгоритма COPY или INPLACE.

    Ошибка 4080 (HY000): Достигнуто максимальное количество версий строк для таблицы test/t1. Больше столбцов нельзя добавлять или удалять мгновенно. Используйте COPY/INPLACE.

    Если используется алгоритм, отличный от ALGORITHM=INSTANT, данные существенно переупорядочиваются, что делает операцию дорогостоящей.

  • Переименование столбца

    ALTER TABLE tbl CHANGE old_col_name new_col_name data_type, ALGORITHM=INSTANT;
    

    Для поддержки одновременных DML-операций сохраните тот же тип данных и измените только имя столбца.

    При сохранении того же типа данных и атрибута [NOT] NULL, изменяя только имя столбца, операция всегда может выполняться онлайн.

    Переименование столбца, на который ссылается другая таблица, разрешено только с ALGORITHM=INPLACE. Если вы используете ALGORITHM=INSTANT, ALGORITHM=COPY или другие условия, которые приводят к использованию этих алгоритмов, оператор ALTER TABLE завершается ошибкой.

    ALGORITHM=INSTANT поддерживает переименование виртуального столбца, в то время как ALGORITHM=INPLACE — нет.

    ALGORITHM=INSTANT и ALGORITHM=INPLACE не поддерживают переименование столбца при добавлении или удалении виртуального столбца в одном операторе. В этом случае поддерживается только ALGORITHM=COPY.

  • Переупорядочение столбцов

    Для переупорядочения столбцов используйте FIRST или AFTER в операциях CHANGE или MODIFY.

    ALTER TABLE tbl_name MODIFY COLUMN col_name column_definition FIRST, ALGORITHM=INPLACE, LOCK=NONE;
    

    Данные существенно переупорядочиваются, что делает операцию дорогостоящей.

  • Изменение типа данных столбца

    ALTER TABLE tbl_name CHANGE c1 c1 BIGINT, ALGORITHM=COPY;
    

    Изменение типа данных столбца поддерживается только с помощью ALGORITHM=COPY.

  • Расширение размера столбца VARCHAR

    ALTER TABLE tbl_name CHANGE 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 для набора символов с одним байтом с VARCHAR(255) на VARCHAR(256) с локальным изменением ALTER TABLE возвращает следующую ошибку:

    ALTER TABLE tbl_name ALGORITHM=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_name ALTER COLUMN col SET DEFAULT literal, ALGORITHM=INSTANT;
    

    Изменяет только метаданные таблицы. Значения столбцов по умолчанию хранятся в .

  • Удаление значения по умолчанию для столбца

    ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT, ALGORITHM=INSTANT;
    
  • Изменение значения автоинкремента

    ALTER TABLE table AUTO_INCREMENT=next_value, ALGORITHM=INPLACE, LOCK=NONE;
    

    Изменяет значение, хранящееся в памяти, а не в файле данных.

    В распределённой системе с репликацией или фрагментацией иногда необходимо сбросить счётчик автоинкремента таблицы до определённого значения. Следующая строка, вставленная в таблицу, будет использовать указанное значение для столбца автоинкремента. Такую технику можно использовать также в среде хранилища данных, где таблицы периодически очищаются и перезагружаются, а последовательность автоинкремента перезапускается с 1.

  • Преобразование столбца в NULL

    ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NULL, ALGORITHM=INPLACE, LOCK=NONE;
    

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

  • Преобразование столбца в NOT NULL

    ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;
    

    Перестраивает таблицу на месте. STRICT_ALL_TABLES или STRICT_TRANS_TABLES SQL_MODE требуется для успешного выполнения операции. Операция завершается неудачно, если столбец содержит значения NULL. Сервер запрещает изменения столбцов с внешним ключом, которые могут привести к потере целостности ссылок. См. Раздел 15.1.9, «Операция ALTER TABLE». Данные существенно переупорядочиваются, что делает операцию дорогостоящей.

  • Изменение определения столбца ENUM или SET

    CREATE TABLE t1 (c1 ENUM('a', 'b', 'c'));
    ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INSTANT;
    

    Изменение определения столбца ENUM или SET путём добавления новых элементов перечисления или множества в конец списка допустимых значений может выполняться мгновенно или на месте, пока размер хранилища типа данных не изменится. Например, добавление элемента в столбец SET, имеющий 8 элементов, изменяет требуемый размер хранилища на значение с 1 байта до 2 байт; это требует копирования таблицы. Добавление элементов в середину списка приводит к переиндексации существующих элементов, что требует копирования таблицы.

Операции над столбцами сгенерированными значениями

В следующей таблице представлен обзор поддержки онлайн DDL для операций над столбцами сгенерированными значениями. Подробную информацию см. в Разделе о синтаксисе и примечаниях к использованию.

Таблица 17.18 Поддержка онлайн DDL для операций над столбцами сгенерированными значениями

Таблица 17.18 Поддержка онлайн 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=INSTANT;
    

    Добавление виртуального столбца может выполняться мгновенно или на месте для таблиц без разделения.

    Добавление 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=INSTANT;
    

    Удаление столбца VIRTUAL может выполняться мгновенно или на месте для таблиц без разделения.

Операции с внешними ключами

В следующей таблице представлен обзор поддержки онлайн DDL для операций с внешними ключами. Звёздочка указывает дополнительную информацию, исключение или зависимость. Подробную информацию см. в Разделе о синтаксисе и примечаниях к использованию.

Таблица 17.19 Поддержка онлайн DDL для операций с внешними ключами

Таблица 17.19 Поддержка онлайн DDL для операций с внешними ключами
Операция Мгновенно На месте Перестраивает таблицу Допускает одновременные операции DML Изменяет только метаданные
Добавление ограничения внешнего ключа Нет Да* Нет Да Да
Удаление ограничения внешнего ключа Нет Да Нет Да Да

Примечания к синтаксису и использованию
  • Добавление ограничения внешнего ключа

    Алгоритм INPLACE поддерживается, когда foreign_key_checks отключен. В противном случае поддерживается только алгоритм COPY.

    ALTER TABLE tbl1 ADD CONSTRAINT fk_name FOREIGN KEY index (col1)
      REFERENCES tbl2(col2) referential_actions;
    
  • Удаление ограничения внешнего ключа

    ALTER TABLE tbl DROP FOREIGN KEY fk_name;
    

    Удаление внешнего ключа может выполняться онлайн с параметром foreign_key_checks включённым или выключенным.

    Если вам не известны имена ограничений внешних ключей для определённой таблицы, выполните следующую команду и найдите имя ограничения в фрагменте CONSTRAINT для каждого внешнего ключа:

    SHOW CREATE TABLE table\G
    

    Или запросите таблицу схемы информации TABLE_CONSTRAINTS и используйте столбцы CONSTRAINT_NAME и CONSTRAINT_TYPE для идентификации имён внешних ключей.

    Также можно удалить внешний ключ и связанный с ним индекс в одной команде:

    ALTER TABLE table DROP FOREIGN KEY constraint, DROP INDEX index;
    
Примечание

Если уже присутствуют в таблице, которая изменяется (т. е. это содержащая фрагмент FOREIGN KEY ... REFERENCE), к операциям онлайн DDL, даже тем, которые не напрямую связаны со столбцами внешнего ключа, применяются дополнительные ограничения:

  • Операция ALTER TABLE над дочерней таблицей может ожидать завершения другой транзакции, если изменение родительской таблицы вызывает связанные изменения в дочерней таблице через фрагмент ON UPDATE или ON DELETE, использующий параметры CASCADE или SET NULL.

  • Аналогично, если таблица является в отношениях внешних ключей, даже если она не содержит фрагментов FOREIGN KEY, она может ожидать завершения операции ALTER TABLE, если операция INSERT, UPDATE или DELETE вызывает действие ON UPDATE или ON DELETE в дочерней таблице.

Операции с таблицами

В следующей таблице представлен обзор поддержки онлайн DDL для операций с таблицами. Звездочка (*) указывает на дополнительную информацию, исключение или зависимость. Для получения подробностей см. Примечания к синтаксису и использованию.

Таблица 17.20 Поддержка онлайн DDL для операций с таблицами

Таблица 17.20 Поддержка онлайн DDL для операций с таблицами
Операция Мгновенно На месте Перестраивает таблицу Разрешает одновременные операции DML Только изменяет метаданные
Изменение ROW_FORMAT Нет Да Да Да Нет
Изменение KEY_BLOCK_SIZE Нет Да Да Да Нет
Установка постоянных статистических данных таблицы Нет Да Нет Да Да
Указание кодовой страницы Нет Да Да* Да Нет
Преобразование кодовой страницы Нет Нет Да* Нет Нет
Оптимизация таблицы Нет Да* Да Да Нет
Перестройка с опцией FORCE Нет Да* Да Да Нет
Выполнение нулевой перестройки Нет Да* Да Да Нет
Переименование таблицы Да Да Нет Да Да

Примечания к синтаксису и использованию
  • Изменение ROW_FORMAT

    ALTER TABLE tbl_name ROW_FORMAT = row_format, ALGORITHM=INPLACE, LOCK=NONE;
    

    Данные существенно переупорядочиваются, что делает операцию дорогостоящей.

    Дополнительную информацию об опции ROW_FORMAT см. в разделе Параметры таблицы.

  • Изменение KEY_BLOCK_SIZE

    ALTER TABLE tbl_name KEY_BLOCK_SIZE = value, ALGORITHM=INPLACE, LOCK=NONE;
    

    Данные существенно переупорядочиваются, что делает операцию дорогостоящей.

    Дополнительную информацию об опции KEY_BLOCK_SIZE см. в разделе Параметры таблицы.

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

    ALTER TABLE tbl_name STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;
    

    Изменяет только метаданные таблицы.

    Постоянные статистики включают STATS_PERSISTENT, STATS_AUTO_RECALC и STATS_SAMPLE_PAGES. Для получения дополнительной информации см. Раздел 17.8.10.1, «Настройка параметров постоянных статистических данных оптимизатора».

  • Указание кодовой страницы

    ALTER TABLE tbl_name CHARACTER SET = charset_name, ALGORITHM=INPLACE, LOCK=NONE;
    

    Перестраивает таблицу, если новое кодирование отличается.

  • Преобразование кодовой страницы

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name, ALGORITHM=COPY;
    

    Перестраивает таблицу, если новое кодирование отличается.

  • Оптимизация таблицы

    OPTIMIZE TABLE tbl_name;
    

    Операция на месте не поддерживается для таблиц с индексами FULLTEXT. Операция использует алгоритм INPLACE, но синтаксис ALGORITHM и LOCK не допускается.

  • Перестройка таблицы с опцией FORCE

    ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;
    

    Использует ALGORITHM=INPLACE начиная с MySQL 5.6.17. ALGORITHM=INPLACE не поддерживается для таблиц с индексами FULLTEXT.

  • Выполнение «нулевой» перестройки

    ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;
    

    Использует ALGORITHM=INPLACE начиная с MySQL 5.6.17. ALGORITHM=INPLACE не поддерживается для таблиц с индексами FULLTEXT.

  • Переименование таблицы

    ALTER TABLE old_tbl_name RENAME TO new_tbl_name, ALGORITHM=INSTANT;
    

    Переименование таблицы может выполняться мгновенно или на месте. MySQL переименовывает файлы, соответствующие таблице tbl_name, без создания копии. (Вы также можете использовать оператор RENAME TABLE для переименования таблиц. См. Раздел 15.1.36, «Оператор RENAME TABLE».) Предоставленные конкретно для переименованной таблицы привилегии не мигрируют в новое имя. Их необходимо изменить вручную.

Операции с табличными пространствами

В следующей таблице представлен обзор поддержки онлайн DDL для операций с табличными пространствами. Для получения подробностей см. Примечания к синтаксису и использованию.

Таблица 17.21 Поддержка онлайн DDL для операций с табличными пространствами

Таблица 17.21 Поддержка онлайн DDL для операций с табличными пространствами
Операция Мгновенно На месте Перестраивает таблицу Разрешает одновременные операции DML Только изменяет метаданные
Переименование общего табличного пространства Нет Да Нет Да Да
Включение или отключение шифрования общего табличного пространства Нет Да Нет Да Нет
Включение или отключение шифрования табличного пространства на основе файла на таблицу Нет Нет Да Нет Нет

Примечания к синтаксису и использованию
  • Переименование общего табличного пространства

    ALTER TABLESPACE tablespace_name RENAME TO new_tablespace_name;
    

    ALTER TABLESPACE ... RENAME TO использует алгоритм INPLACE, но не поддерживает предложение ALGORITHM.

  • Включение или отключение шифрования общего табличного пространства

    ALTER TABLESPACE tablespace_name ENCRYPTION='Y';
    

    ALTER TABLESPACE ... ENCRYPTION использует алгоритм INPLACE, но не поддерживает предложение ALGORITHM.

    Для получения дополнительной информации см. Раздел 17.13, «Шифрование данных InnoDB».

  • Включение или отключение шифрования табличного пространства на основе файла на таблицу

    ALTER TABLE tbl_name ENCRYPTION='Y', ALGORITHM=COPY;
    

    Для получения дополнительной информации см. Раздел 17.13, «Шифрование данных 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, и данные таблицы копируются в новую структуру таблицы.

Таблица 17.22 Поддержка онлайн DDL для операций с разбиением

Таблица 17.22 Поддержка онлайн DDL для операций с разбиением
Раздел разбиения Мгновенно На месте Разрешает DML Примечания
PARTITION BY Нет Нет Нет Разрешает ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE}
ADD PARTITION Нет Да* Да* ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSISVE} поддерживается для RANGE и LIST разделов, ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSISVE} для HASH и KEY разделов и ALGORITHM=COPY, LOCK={SHARED|EXCLUSIVE} для всех типов разделов. Не копирует существующие данные для таблиц, разнесенных по RANGE или LIST. Разрешены одновременные запросы с ALGORITHM=COPY для таблиц, разнесенных по HASH или LIST, поскольку MySQL копирует данные, удерживая общую блокировку.
DROP PARTITION Нет Да* Да*

ALGORITHM=INPLACE, LOCK={DEFAULT|NONE|SHARED|EXCLUSIVE} поддерживается. Не копирует данные для таблиц, разнесенных по RANGE или LIST.

DROP PARTITION с ALGORITHM=INPLACE удаляет данные, хранящиеся в разделе, и удаляет раздел. Однако, DROP PARTITION с ALGORITHM=COPY или old_alter_table=ON перестраивает разнесенную таблицу и пытается перенести данные из удаленного раздела в другой раздел с совместимым PARTITION ... VALUES определением. Данные, которые не могут быть перенесены в другой раздел, удаляются.

DISCARD PARTITION Нет Нет Нет Разрешает только ALGORITHM=DEFAULT, LOCK=DEFAULT
IMPORT PARTITION Нет Нет Нет Разрешает только ALGORITHM=DEFAULT, LOCK=DEFAULT
TRUNCATE PARTITION Нет Да Да Не копирует существующие данные. Просто удаляет строки; не изменяет определение таблицы или ее разделов.
COALESCE PARTITION Нет Да* Нет ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} поддерживается.
REORGANIZE PARTITION Нет Да* Нет ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} поддерживается.
EXCHANGE PARTITION Нет Да Да
ANALYZE PARTITION Нет Да Да
CHECK PARTITION Нет Да Да
OPTIMIZE PARTITION Нет Нет Нет ALGORITHM и LOCK разделы игнорируются. Перестраивает всю таблицу. См. Раздел 26.3.4, “Техническое обслуживание разделов”.
REBUILD PARTITION Нет Да* Нет ALGORITHM=INPLACE, LOCK={DEFAULT|SHARED|EXCLUSIVE} поддерживается.
REPAIR PARTITION Нет Да Да
REMOVE PARTITIONING Нет Нет Нет Разрешает ALGORITHM=COPY, LOCK={DEFAULT|SHARED|EXCLUSIVE}

Операции онлайн ALTER TABLE без разбиения на разнесенные таблицы подчиняются тем же правилам, что и обычные таблицы. Однако, ALTER TABLE выполняет операции онлайн на каждом разделе таблицы, что увеличивает нагрузку на системные ресурсы из-за выполнения операций на нескольких разделах.

Дополнительную информацию о ALTER TABLE разделах разбиения см. в Разделах разбиения и Разделе 15.1.9.1, “Операции ALTER TABLE с разделами”. Информацию о разбиении в целом см. в Главе 26, Разбиение.

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

Spec-Zone.ru

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