Spec-Zone.ru › MySQL 9.2

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 9.2.

    При добавлении столбца с помощью алгоритма 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. Максимальное количество версий строк, разрешенных в MySQL 9.1.0 и более поздних версиях, равно 255, так как каждая версия строки требует дополнительного места для метаданных таблицы. При достижении предела версий строк операции 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 9.2.

    При удалении столбца с помощью алгоритма 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. Максимальное количество версий строк, разрешенных в MySQL 9.1.0 и более поздних версиях, равно 255, так как каждая версия строки требует дополнительного места для метаданных таблицы. При достижении предела версий строк операции 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, «Настройка постоянных статистических данных оптимизатора».

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

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

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

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

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

    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 в состоянии покоя».

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

    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-9.2-en/innodb-online-ddl-operations.html

Spec-Zone.ru

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